#include <reg52.h>
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit rs=P2^4; //2004的数据/指令选择控制线
sbit rw=P2^5; //2004的读写控制线
sbit en=P2^6; //2004的使能控制线
sbit OE = P1^0;
sbit EOC = P1^1;
sbit ST = P1^2;
sbit CLK = P1^3;
uchar adval,qian,bai,shi,ge,m;
uint val;
uchar code table[]= {"2d=4d=6d=8d=10d=12d=14d=16d=18d=20d=22d=24d=26d=28d=30d=32d="};
//要显示的内容1放入数组table
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<110;i++);
}
}
void lcd_wcom(uchar com) //2004写命令函数
{
rs=0; //选择指令寄存器
rw=0; //选择写
P0=com; //把命令字送入P2
DelayMS(5); //延时一小会儿,让2004准备接收数据
en=1; //使能线电平变化,命令送入2004的8位数据口
en=0;
}
void lcd_wdat(uchar dat) //2004写数据函数
{
rs=1; //选择数据寄存器
rw=0; //选择写
P0=dat; //把要显示的数据送入P2
DelayMS(5); //延时一小会儿,让2004准备接收数据
en=1; //使能线电平变化,数据送入2004的8位数据口
en=0;
}
void lcd_init() //2004初始化函数
{
lcd_wcom(0x38); //8位数据,双列,5*7字形
lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01); //清屏
}
void display(uchar addr,uchar number)
{
lcd_wcom(0x80+addr);
lcd_wdat(0x30+number);
}
void data_change(adval)
{
val=adval*1.0/255*5000;
qian=val/1000;
bai=val/100%10;
shi=val/10%10;
ge=val%10;
/*地址:00H------13H
40H------53H
14H------27H
54H------67H*/
display(0x00+3,qian);//2d
display(0x00+4,0x2e-0x30);//显示小数点
display(0x00+5,bai);
display(0x00+6,shi);
display(0x00+7,ge);
display(0x00+8,0x56-0x30);//显示V
display(0x00+14,qian);//4d
display(0x00+15,0x2e-0x30);//显示小数点
display(0x00+16,bai);
display(0x00+17,shi);
display(0x00+18,ge);
display(0x00+19,0x56-0x30);//显示V
}
/*实际显示的电压值 (D/256*VCC)*/
void px()
{
uint a,b;
a=P2&0xf0; //11111000 P2第三位清0
b=P2&0x0f; //00000111 P2高五位清0
if(b<16)
{b=b+1;}
else
{b=0;}
P2=a+b;
}
void main()
{
lcd_init(); //液晶初始化
/*DD RAM ADDRESS:
80H----93H
C0H----D3H
94H----A7H
D4H----E7H */
lcd_wcom(0x80+0x00); //显示地址设为80H(即00H,)上排第一位
for(m=0;m<3;m++) //将table[]中的数据依次写入2004显示
{
lcd_wdat(table[m]);
DelayMS(10);
}
lcd_wcom(0x80+0x0b); //显示地址设为80H(即00H,)上排第一位
for(m=3;m<6;m++) //将table[]中的数据依次写入2004显示
{
lcd_wdat(table[m]);
DelayMS(10);
}
P1 = 0x3f; //选择AD通道IN3
TMOD = 0x02;
TH0 = 0x14;
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
while(1)
{
px(); //片选4051,选通16路。
ST = 0;
ST = 1;
ST = 0;
while(EOC==0);
OE = 1;
data_change(P3); //AD转换后的数据,送入data_change函数转化为十进制数据
OE = 0;
DelayMS(1000);
}
}
void Timer0_INT() interrupt 1
{
CLK = !CLK;
}
|