#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);
}
5D(V7786FF{C7QKB{DE]Q(U.png (194.41 KB, 下載次數: 69)
下載附件
lm016l總是閃爍,顯示準確
2021-6-16 21:11 上傳
|