#include
#include
#include
#define uint unsigned int //预定义一下
#define uchar unsigned char sbit rs=P2^3; //1602的数据/指令选择控制线
sbit wr=P2^4;
sbit en=P2^5;
sbit dacv=P2^6;
sbit key1 = P2^0;
sbit key2= P2^1;
sbit key3 = P2^2;
sbit key4 = P2^7;
sbit cs1 = P3^2;
sbit wr1 = P3^3;
sbit daci=P3^0;
sbit cs2=P3^4;
sbit wr2=P3^5;
sbit xuan=P3^1;
uchar code table[]="V and I Value";
float val,val1;
tablel void delay(uint n) //延时函数
{ uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--);}
void lcd_wcom(uchar com) //1602写命令函数
{ rs=0; //选择指令寄存器
P1=com; //把命令字送入P2
delay(5); //延时一小会儿,让1602准备接收数据
en=1; delay(5); //使能线电平变化,命令送入1602的8位数据口
en=0; }
void lcd_wdat(uchar dat) //1602写数据函数
{ rs=1; //选择数据寄存器
P1=dat; //把要显示的数据送入P2
delay(5); //延时一小会儿,让1602准备接收数据
en=1;
delay(5); //使能线电平变化,数据送入1602的8位数据口
en=0;}
void lcd_init() //1602初始化函数
{ wr=0; en=0; lcd_wcom(0x38); //8位数据,双列,5*7字形
lcd_wcom(0x0f); //开启显示屏,关光标,光标不闪烁
lcd_wcom(0x0c); //显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01); //清屏
}
void displayv(uchar k1,k2,k3,k4) //显示子函数
{lcd_wcom(0x80+0x40);lcd_wdat('T');lcd_wcom(0x80+0x41);lcd_wdat('h');lcd_wcom(0x80+0x42);lcd_wdat('e');lcd_wcom(0x80+0x43);lcd_wdat('V');lcd_wcom(0x80+0x44);lcd_wdat('i');lcd_wcom(0x80+0x45);lcd_wdat('s');lcd_wcom(0x80+0x46);lcd_wdat(':');lcd_wcom(0x80+0x47);lcd_wdat(0x30+k1);lcd_wcom(0x80+0x48);lcd_wdat(0x30+k2);lcd_wcom(0x80+0x49);lcd_wdat('.');lcd_wcom(0x80+0x4A);lcd_wdat(0x30+k3);lcd_wcom(0x80+0x4B);lcd_wdat(0x30+k4);lcd_wcom(0x80+0x4C);lcd_wdat('V');}
void displayi(uchar f1,f2,f3,f4) //显示子函数
{lcd_wcom(0x80+0x40);lcd_wdat('T');lcd_wcom(0x80+0x41);lcd_wdat('h');lcd_wcom(0x80+0x42);lcd_wdat('e');lcd_wcom(0x80+0x43);lcd_wdat('I');lcd_wcom(0x80+0x44);lcd_wdat('i');lcd_wcom(0x80+0x45);lcd_wdat('s');lcd_wcom(0x80+0x46);lcd_wdat(':');lcd_wcom(0x80+0x47);lcd_wdat(0x30+f1);lcd_wcom(0x80+0x48);lcd_wdat('.');lcd_wcom(0x80+0x49);lcd_wdat(0x30+f2);lcd_wcom(0x80+0x4A);lcd_wdat(0x30+f3);lcd_wcom(0x80+0x4B);lcd_wdat(0x30+f4);lcd_wcom(0x80+0x4C);lcd_wdat('A');}
void dianya()
{uint k1,k2,k3,k4,a; cs1=0; wr1=0; { dacv=1; P0=val; if(key1== 0) {val=0; P0 = val;delay(20);} if(key2 == 0) { val++; delay(50); if(val==255) val=0; P0 = val;delay(20); } if(key3 == 0) { val--; delay(50); if(val==0) val=255;P0=val;delay(20);} if(key4 == 0) {val = 255;P0=val;delay(20);} dacv=0; a=((float)val*30.0/255.0)*100.0; k1=(int)a/1000; k2=(int)a%1000/100; k3=(int)a%100/10; k4=(int)a%10; displayv( k1,k2,k3,k4); cs2=1;wr2=1; } }
void dianliu()
{uint f1,f2,f3,f4,f; cs2=0; wr2=0; { daci=1; P0=val1; if(key1== 0) {val1=0; P0 = val1;delay(20);} if(key2 == 0) { val1++; delay(50); if(val1==255) val1=0; P0 = val1;delay(20); } if(key3 == 0) { val1--; delay(20); if(val1==0) val1=255;P0=val1;delay(20);} if(key4 == 0) {val1 = 255;P0=val1;delay(30);}
daci=0;
f=((float)val1*30.0/255.0)*100.0;
f1=(int)f/1000;
f2=(int)f%1000/100;
f3=(int)f%100/10;
f4=(int)f%10;
displayi( f1,f2,f3,f4);
cs1=1;wr1=1;
}
}
void main() //主函数
{ uchar m=0; bit flag;
P0=0x00; dacv=0; daci=0; flag=1;
lcd_init(); lcd_wcom(0x80); //显示地址设为80H(即00H,)上排第一位
for(m=0;m<14;m++) //将table[]中的数据依次写入1602显示
{
lcd_wdat(table[m]);
delay(5); }
while(1)
{
if(xuan==0)
{
while(!xuan); flag=~flag; }
if(flag==1) {dianya();}
if(flag==0) {dianliu();}
} }