void write_com(uchar com)//往1602液晶写命令函数 { rs=0; P0=com; delay(5); ep=1; delay(5); ep=0;
}
void write_dat(uchar dat)//往1602液晶写数据函数 { rs=1; P0=dat; delay(5); ep=1; delay(5); ep=0; }
void init_1602()//对1602液晶的初始化函数 {
rs=0; rw=0; 21
}
write_com(0x38); delay(1); write_com(0x0c); delay(1); write_com(0x06); delay(1); write_com(0x01); delay(1);
void init_timer0()//定时计数器0初值化函数, { }
void display(uchar x,uchar y,uint dat)//显示电压值的函数,x行y列开始显示 {
uint add; uchar i,a[5]; TMOD=0x01;//方式一
TH0=(65536-50000)/256;//每50ms中断一次 TL0=(65536-50000)%6; IE=0x82;//打开中断 TR0=0;//定时器首先不可工作
22
write_com(add); add=add+y; }
case 1:add=0x80+0x40;break; switch(x) {
case 0:add=0x80;break;
for(i=0;i<5;i++)
{ }
a[i]=dat; dat=dat/10;
write_dat(a[4]+0x30); write_dat(a[3]+0x30); write_dat(a[2]+0x30); write_dat('.');
write_dat(a[1]+0x30); }
void display_zifu(uchar x,uchar y,uchar *str)//显示字符函数,x行y列开始显示
write_dat(a[0]+0x30);
23
{ uint add; switch(x) { case 0:add=0x80;break; case 1:add=0x80+0x40;break;
}
add=add+y; write_com(add); while(*str!='\\0') { write_dat(*str); str++;
}
}
uint read_AD(uchar con_way)//读取AD转换值操作函数{ uint dat=0; uchar i; cs=0; clk=0; con_way<<=4;
for(i=0;i<12;i++) 24
{
con_way<<=1;/*选择0通道,在输入该控制数据的同时输出前一次AD
转结果*/ input=CY;
dat<<=1;
if(output)/*输出AD转换结果*/
dat=dat|0x01;
delay(2); clk=1; delay(5); clk=0;
} cs=1; return dat;
}
uint read_value() { long float dq; long float dat_v;
dq=read_AD(0);//把读取得的AD转换值给变量dq
if(!flag_3)
dat_v=(200*dq)/4096*100;//二档,量程为200V else if(!flag_2)
dat_v=(20*dq)/4096*100;//二档,量程为20V
25