#include
#include //sprintf函数包含库
#include
#include //strcpy函数包含库
#define uchar unsigned char
#define uintunsigned int
#define LCD_dataP0//数据口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
//LCD型号:TS12864A-3(带汉字库) 控制器ST7920
sbit LCD_RS = P2^0; //寄存器选择输入
sbit LCD_RW = P2^1; //液晶读/写控制
sbit LCD_EN = P2^2; //液晶使能控制
sbit LCD_PSB= P2^3; //串/并方式控制
//TLC549端口定义
sbit DIO=P3^5; //数据线
sbit CS=P3^6; //片选
sbit CLK=P3^4; //io口时钟
//proteus的带字库LCD12864不支持数字、英文符号和英文标点
//显示字符:◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ
uchar code dis1[]="电压值:";
uchar code zf[]="◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ";
uchar a[14]; //直接给数组a赋值,会出现V.34V,就是第一个字符被吞并,没实物测试,不知道原因,希望有硬件的帮忙测试下^_^
void bitchange(uchar c[]) //字符转换函数
{
uchar i,m=0,n=0,b[14];
for(i=0;c[i]!='\0';i++,n+=2)
{
if(c[i]!='.')
{
m=c[i]-48;
b[n]=zf[m*2];
b[n+1]=zf[m*2+1];
}
else
{
b[n]=zf[20];
b[n+1]=zf[21];
}
}
b[n]=zf[22];
b[n+1]=zf[23];
b[n+2]='\0';
strcpy(c,b);
}
void delay(int ms) //延时函数
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_busy() //检查LCD忙状态,lcd_busy为1时,忙,等待;lcd-busy为0时,闲,可写指令与数据。
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80); //强制取最高位P0.7的状态
LCD_EN=0;
return(result);
}
void lcd_wcmd(uchar cmd) //写指令数据到LCD,RS=L,RW=L,E=高脉冲,D0-D7=指令码。
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
void lcd_wdat(uchar dat) //写显示数据到LCD,RS=H,RW=L,E=高脉冲,D0-D7=数据。
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
void lcd_pos(uchar X,uchar Y) //设定显示位置
{
ucharpos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos=X+Y ;
lcd_wcmd(pos); //显示地址
}
void lcd_init() //LCD初始化设定
{
LCD_PSB=1; //并口方式
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
uint TLC549_AD() //TLC549处理
{
uchar i;
uint data_ad=0;
CS=1; //初始化,启动
CLK=0;
DIO=1;
CS=0;
_nop_();
for(i=0;i<8;i++) //读取采集数据,读取的是上一次采集数据
{
CLK=1;
if(DIO)data_ad|=0x01;
CLK=0;
data_ad<<=1;
}
CS=1;
data_ad=data_ad*(500/256)+0.5; //0.5V进行四舍五入补偿
return(data_ad);
}
void main()
{
uchar i;
float AD_convert;
uchar AD1=35;
delay(10); //延时
lcd_init(); //初始化LCD
while(1)
{
AD_convert=TLC549_AD()/100.0;
sprintf(a, "%.2f", AD_convert); //将转换结果转换成字符
i=0;
lcd_pos(1,0);//设置显示位置为第一行的第1个字符
while(dis1[i] != '\0')
{ //显示“电压值:”
lcd_wdat(dis1[i]);
i++;
}
i=0;
lcd_pos(2,3);//设置显示位置为第二行的第3个字符
bitchange(a);
while(a[i] != '\0')
{ //显示采集的电压值
lcd_wdat(a[i]);
i++;
}
}
}