//*****************************ADC0809.c模块*********************
#include "msp430x54x.h"
#define OE P3OUT|=BIT0 //OE = P3.0=1
#define ST P3OUT|=BIT2 //ST=p3.2
//#define EOC P3IN&BIT1 //EOC=p3.1
#define ALE P3OUT|=BIT7 //ale=p3.7
//#define CLK P2OUT|=BIT7 //clk=p2.7
#define OE_OFF P3OUT&=~BIT0
#define ST_OFF P3OUT&=~BIT2
#define ALE_OFF P3OUT&=~BIT7
void initial_time(void)
{
TA1CTL=TASSEL1+TACLR;
TA1CCTL0=CCIE;
TA1CCR0=2;
TA1CTL|=MC0;
P2DIR=0;
P2SEL=0;
P2DIR|=BIT7;
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{
if(P2OUT & BIT7) P2O &=~BIT7;
else P2OUT |=BIT7;
}
void adc0809_io_set(void)
{
P4DIR=0; //transfer digital data in,D0~D7;
P4SEL=0; //normal io port;
P3DIR=1; //signal out
P3SEL=0; //normal io port;
P3DIR|=~BIT1; //ad0809's EOC signal into msp
P2DIR=1; //clock signal out
P2SEL=0;
P3DIR&=BIT4; //A ALE ADDR
P3DIR&=BIT5; //B ""
P3DIR&=BIT6; //C ""
P3OUT|=~BIT4; //always choose INT0 channel,ABC:000;
P3OUT|=~BIT5;
P3OUT|=~BIT6;
}
void adc0809_initial(void)
{
ST_OFF;
OE_OFF;
ALE_OFF;
}
unsigned int single_adc0809(void)
{
unsigned int res;
while(!(P2OUT & BIT7))
;
ALE;
_NOP();
ST;
ALE_OFF;
_NOP();
ST_OFF;
while(!((P3IN&BIT1)==BIT1))
;
OE;
res=P4IN;
OE_OFF;
return res;
}
//**********************************
//**********************************lcd1602液晶模块***************************
//===================================LCD.h头文件模块========================================
#include "msp430x54x.h"
#define DataDir P9DIR
#define DataPort P9OUT
//==============================================================================
#define Busy 0x80
//==============================================================================
#define CtrlDir P8DIR
#define CLR_RS P8OUT&=~BIT7 //RS = P8.7
#define SET_RS P8OUT|=BIT7
//==============================================================================
#define CLR_RW P8OUT&=~BIT6 //RW = P8.6
#define SET_RW P8OUT|=BIT6
//==============================================================================
#define CLR_EN P8OUT&=~BIT5 //EN = P8.5
#define SET_EN P8OUT|=BIT5
//==============================================================================
#define WRITE_BURST 0x40 //连续写入
#define READ_SINGLE 0x80 //读
#define READ_BURST 0xC0 //连续读
#define BYTES_IN_RXFIFO 0x7F //接收缓冲区的有效字节数
#define CRC_OK 0x80 //CRC校验通过位标志
//********************************lcd.c子函数模块
#include "LCD.h"
//******************************************************************************
//系统初始化
//******************************************************************************
//void InitSys()
//{
// unsigned int iq0;
// _DINT();
// BCSCTL1 &=~XT2OFF;
// do
// {
// IFG1 &= ~OFIFG; // 清除振荡器失效标志
// for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
// }
// while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
// BCSCTL2 =SELM0+SELS; //MCLK,SMCLK时钟为XT2
//}
//==============================================================================
void Delay5ms(void)
{
int i,j;
for(i=0;i<200;i++)
for(j=0;j<100;j++)
;
}
void LCD_IO_set(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状态
DataDir = 0xFF; //数据端口设为输出状态
P5SEL=0x00; //设置P5为一般数字IO口
P6SEL&=0x8f; //设置P6为一般数字IO口
}
//========================等待1602液晶完成内部操作==============================
void WaitForEnable(void)
{
P5DIR &= 0x00; //将P5口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P5IN & Busy)!=0); //检测忙标志
CLR_EN;
P5DIR |= 0xFF; //将P5口切换为输出状态
}
//==========================向液晶模块写入命令==================================
//=================cmd--命令,chk--是否判忙的标志,1:判忙,0:不判=============
void LcdWriteCommand(char cmd,char chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
//=====================向液晶显示的当前地址写入显示数据=========================
void LcdWriteData(char data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显示数据写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
//==================向液晶输入显示字符位置的坐标信息============================
void LocateXY(char x,char y)
{
char temp;
x&= 0x01;
temp = y&0x0f;
if(x) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,0);
}
//==========================在某个位置显示一个字符==============================
//============x--位置的列坐标 y--位置的行坐标data--显示的字符数据=============
void DisoneChar(char x,char y,char data)
{
LocateXY( x, y );
LcdWriteData( data );
}
//==============================让液晶从某个位置起连续显示一个字符==============
//==============================y--位置的列坐标 x--位置的行坐标================
void DispStr(char x,char y,char *ptr)
{
char *temp;
char i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
DisoneChar(x++,y,temp);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
//让液晶从某个位置起连续显示N个字符
void DispNChar(char x,char y,char n,char *ptr)
{
char i;
for (i=0;i<n;i++)
{
DisoneChar(x++,y,ptr);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
//========================对1602液晶模块进行复位操作============================
void LcdReset(void)
{
LcdWriteCommand(0x38, 0); //规定的复位操作
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
}
//===================================lcd初始化
void Lcd_initial(void)
{
LcdWriteCommand(0x38, 1); //显示8位格式,2行,5x7
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x01, 1); //显示清屏
//delay(); //函数需要另外写40um
}
void Display(char temp[])
{
char tishi[] = {"The gain is :"};
//char Auto[]={"Auto"};
//char Hand[]={"Hand"};
DisoneChar(1,0,0x58) ; //第一排零号位显示字符
DispNChar(1,0,12,tishi);
DisoneChar(1,13,temp[0]) ; //第一排一号位显示字符
DisoneChar(1,14,temp[1]) ; //第一排二号位显示字符
}
//*****************************非常简单的主函数*************************
//msp430 with adc0809 test programs
#include "ADC0809.c"
#include "BoardConfig.h"
#include "LCD.h"
#include "LCD.c"
#include "msp430x54x.h"
void main(void)
{
unsigned int data,num[3];
adc0809_io_set();
LCD_IO_set;
adc0809_initial();
Lcd_initial();
while(1)
{
data=single_adc0809();
num[0]=data/100;
num[1]=data/10%10;
num[2]=data%10;
DisoneChar(1,0,0x58) ; //第一排零号位显示字符
DisoneChar(1,0,num[0]) ; //第一排一号位显示字符
DisoneChar(1,1,num[1]) ; //第一排二号位显示字符
DisoneChar(1,2,num[2]) ;
}
}
以上属于原创程序,希望有错误或者可以优化的地方细致指出,谢谢交流,也希望对你们有帮助!
文章评论(0条评论)
登录后参与讨论