#include"at89x51.h"
#include"absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define IN7 XBYTE [0x7fff]//设置ADC0808的通道0的地址
#define IN0 XBYTE [0x7ff8]
sbit RS = P3 ^ 0;
sbit RW = P3 ^ 1;
sbit E = P3 ^ 5;
uchar ad_data;
uchar ad_dataa;
uint volt100,volt1000;
uchar bai, shi, ge;
uchar j;
uchar code welcode[] = {"--DC VOLTMETER--"}; //欢迎屏幕
uchar code number[] = {"0123456789"};
void delay(uchar i)
{
while(i--);
}
//写指令
void wr_cmd(uchar cmd)
{
E = 0;
RS = 0;
RW = 0;
P1 = cmd;
E = 1;
E = 0;
}
//写数据
void wr_data(uchar dat)
{
E = 0;
RS = 1;
RW = 0;
P1 = dat;
E = 1;
E = 0;
}
//判忙
void busy_lcd(void)
{
start: //语句符号
E = 0; //使能端为低电平
RS = 0; //选择指令寄存器
RW = 1; //读操作
P1 = 0xff; //读P口之前,应先将P口全部置一
E = 1; //使能端由低电平变为高电平,进行读操作
if (P1_7 == 0)
return ; //返回主调函数语句
else
goto start;//无条件跳转到标号为start的语句
}
//初始化
void LCD1602_initialize()
{
busy_lcd();
wr_cmd(0x38);
busy_lcd();
wr_cmd(0x08);
busy_lcd();
wr_cmd(0x01);
busy_lcd();
wr_cmd(0x06);
busy_lcd();
wr_cmd(0x0c);
}
//显示第一行
void disp_welcode(void)
{
uchar i = 0;
busy_lcd();
wr_cmd(0x80);//送第一行地址
while (welcode != '\0')
{
busy_lcd();
wr_data(welcode);
i++;
}
}
//转换后的BCD处理
void data_BCD()
{
j = volt100 / 100;
bai = j + 48;
j = volt100 % 100 / 10;
shi = j + 48;
j = volt100 % 10;
ge = j + 48;
/*
bai=number[volt100/100];
shi=number[volt100%100/10];
ge=number[volt100%10];
*/
/*
bai=volt/100+0x30;
shi=volt%100/10+0x30;
ge=volt%10+0x30;
*/
}
void data_BCDD()
{
j = volt1000 / 100;
bai = j + 48;
j = volt1000 % 100 / 10;
shi = j + 48;
j = volt1000 % 10;
ge = j + 48;
}
//转换后的数据第二行显示
void disp_data(void)
{
busy_lcd();
wr_cmd(0xc0);
busy_lcd();
wr_data(bai);
busy_lcd();
wr_data('.');
busy_lcd();
wr_data(shi);
busy_lcd();
wr_data(ge);
busy_lcd();
wr_data('V');
}
//转换后的数据第二个第二行显示
void disp_dataa(void)
{
busy_lcd();
wr_cmd(0xc7);
busy_lcd();
wr_data(bai);
busy_lcd();
wr_data('.');
busy_lcd();
wr_data(shi);
busy_lcd();
wr_data(ge);
busy_lcd();
wr_data('V');
}
void main(void)
{
uchar i;
LCD1602_initialize();//液晶初始化
disp_welcode();//欢迎屏幕
while (1)
{
IN7 = 0x07; //写操作
while(P3_2==1);//等待ADC0808转换结束
ad_data = IN7; //读ADC转换后的数字量数据 IN0={0x00~0xff 即(0~255之间)}
volt100 = ad_data * 100; //扩大至0~25500之间
volt100 = volt100 / 51;
data_BCD();
disp_data();
for(i=0;i<20;i++)
delay(50000);
IN0 = 0x00;
while(P3_2==1);//等待ADC0808转换结束
ad_dataa = IN0; //读ADC转换后的数字量数据 IN0={0x00~0xff 即(0~255之间)}
volt1000 = ad_dataa * 100; //扩大至0~25500之间
volt1000 = volt1000 / 51;
data_BCDD();
disp_dataa();
for(i=0;i<20;i++)
delay(50000);
}
|