#include
#include
#include
#define uint unsigned int //預(yù)定義一下
#define uchar unsigned char sbit rs=P2^3; //1602的數(shù)據(jù)/指令選擇控制線
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) //延時函數(shù)
{ uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--);}
void lcd_wcom(uchar com) //1602寫命令函數(shù)
{ rs=0; //選擇指令寄存器
P1=com; //把命令字送入P2
delay(5); //延時一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù)
en=1; delay(5); //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
en=0; }
void lcd_wdat(uchar dat) //1602寫數(shù)據(jù)函數(shù)
{ rs=1; //選擇數(shù)據(jù)寄存器
P1=dat; //把要顯示的數(shù)據(jù)送入P2
delay(5); //延時一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù)
en=1;
delay(5); //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
en=0;}
void lcd_init() //1602初始化函數(shù)
{ wr=0; en=0; lcd_wcom(0x38); //8位數(shù)據(jù),雙列,5*7字形
lcd_wcom(0x0f); //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
lcd_wcom(0x0c); //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
lcd_wcom(0x01); //清屏
}
void displayv(uchar k1,k2,k3,k4) //顯示子函數(shù)
{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) //顯示子函數(shù)
{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() //主函數(shù)
{ uchar m=0; bit flag;
P0=0x00; dacv=0; daci=0; flag=1;
lcd_init(); lcd_wcom(0x80); //顯示地址設(shè)為80H(即00H,)上排第一位
for(m=0;m<14;m++) //將table[]中的數(shù)據(jù)依次寫入1602顯示
{
lcd_wdat(table[m]);
delay(5); }
while(1)
{
if(xuan==0)
{
while(!xuan); flag=~flag; }
if(flag==1) {dianya();}
if(flag==0) {dianliu();}
} }