#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
void delay(uint z);
uchar keyscan() // 鍵盤(pán)掃描程序
{
uchar temp,num;
num=17;
P1=0xfe; // p1.0口置0
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
// delay(10); //延遲去抖
P1=P1&0xf0;
while(P1!=0xf0);
switch(temp)
{
case 0xe0:num=7;break; //0xf0和0xe0的交處,即p1.0與p1.4的交處
case 0xd0:num=8;break; // p1.0與p1.5的交處,
case 0xb0:num=9;break;
case 0x70:num=15;break;
default:break;
}
}
else break;
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
//delay(10);
P1=P1&0xf0;
while(P1!=0xf0);
switch(temp)
{
case 0xe0:num=4;break;
case 0xd0:num=5;break;
case 0xb0:num=6;break;
case 0x70:num=14;break;
default:break;
}
}
else break;
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
//delay(10);
P1=P1&0xf0;
while(P1!=0xf0);
switch(temp)
{
case 0xe0:num=1;break;
case 0xd0:num=2;break;
case 0xb0:num=3;break;
case 0x70:num=13;break;
default:break;
}
}
else break;
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
//delay(10);
P1=P1&0xf0;
while(P1!=0xf0);
switch(temp)
{
case 0xe0:num=10;break;
case 0xd0:num=0;break;
case 0xb0:num=11;break;
case 0x70:num=12;break;
default:break;
}
}
else break;
}
return num;
}
//主程序
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#include"keyscan.h"
#define uchar unsigned char
#define uint unsigned int
#define dac0832 XBYTE[0X7FFF] //P2.7作片選,啟動(dòng)DA轉(zhuǎn)換
#define int0 XBYTE[0X7FF8] //結(jié)束AD轉(zhuǎn)換,鎖存通道0,讀出AD值
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //數(shù)組table[]存放代碼
uchar temp1,weishu,flag,dot;
uchar volt[4]={0,0,0,0};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar z) //LED顯示函數(shù)
{
uchar j;
P2=0xFE; //P2.0口置0 ,選擇第一個(gè)數(shù)碼管
for(j=0;j<z;j++) // 循環(huán)控制
{
P0=table[volt[j]]; // 將P0口數(shù)據(jù)送 LED顯示
delay(6);
if(j<z-1) P2=_crol_(P2,1); //判斷,依次選擇P2.1,P2.2口
}
}
void main()
{
uchar keynum,i;
float voltage,xiaoshu,sum;
i=0;
voltage=0;
temp1=0;
flag=0;
weishu=1; //定義數(shù)字量值temp1,進(jìn)位標(biāo)志flag,數(shù)碼管位數(shù)weishu等變量
while(1)
{
dac0832=temp1; // 初始值設(shè)定為0
keynum=keyscan(); //調(diào)用鍵盤(pán)掃描函數(shù)
if(keynum==15) //如果鍵值15,代表復(fù)位,將p0置0
{
P0=0; //p0口置0,復(fù)位
while(1)
{
keynum=keyscan(); //調(diào)用鍵盤(pán)掃描函數(shù)
if(keynum>=0&&keynum<=9) //判斷鍵值
{
i++;
for(weishu=0;weishu<i;weishu++)
volt[i-weishu-1]=volt[i-weishu-2];
volt[0]=keynum; // 將數(shù)值在第一個(gè)數(shù)碼管中顯示
if(flag==0)
voltage=voltage*10+keynum;
else {xiaoshu=pow(10,flag);
xiaoshu=keynum/xiaoshu;
sum=sum+xiaoshu;
flag++;}
} // 數(shù)字處理顯示程序
else if(keynum==10) //判斷按鍵,如果是點(diǎn)鍵,10代表點(diǎn)鍵
{
flag++;
dot=i;
volt[0]=volt[0]+10; //在第二個(gè)數(shù)碼管 輸出顯示小數(shù)點(diǎn)
}
else if(keynum==11) //判斷按鍵,如果是確認(rèn)鍵
{
weishu=i;
if(flag==0)
temp1=23*voltage;
else
{
i=(int)(sum/0.05);
temp1=23*voltage+i;
}
i=0;
voltage=0;
sum=0;
flag=0;
break;
}
if(int0>dac0832)
{temp1=temp1-1; }
if(int0<dac0832)
{ temp1=temp1+1;} // ADC轉(zhuǎn)換后于輸入數(shù)字量比較運(yùn)算程序
display(i); //調(diào)用顯示函數(shù)
}
else if(keynum==12) //判斷按鍵,如果是加鍵
{
temp1=temp1+2; // 電壓數(shù)字量加02H
if(weishu==1){volt[1]=volt[0]+10;
volt[0]=0;
weishu=2;} // 如果是一位數(shù)的話(huà),將這個(gè)數(shù)放到第二個(gè)數(shù)碼管,同時(shí)將小數(shù)點(diǎn)輸出,第一位變?yōu)?,位數(shù)加一
if(weishu==2){volt[0]++;} //將第一位LED加1
if(volt[0]==10){volt[1]=volt[1]+1;volt[0]=0;} //如果第一個(gè)數(shù)碼管是點(diǎn)的話(huà),將第一個(gè)數(shù)碼管加一,小數(shù)點(diǎn)去掉
if(volt[1]==20){volt[2]=1;volt[1]=10;volt[0]=-1;weishu=3;}
if(weishu==3)
{
if(dot==1)
{
volt[1]++;
if(volt[1]==10)
{
volt[2]++;volt[1]=0;temp1=temp1+2;
}
}
else
{
volt[0]++;
if(volt[0]==10){volt[1]++;volt[0]=0;}
}
}
} //三位時(shí)的處理程序
else if(keynum==13) //判斷按鍵,如果減鍵
{
temp1=temp1-2; // 電壓數(shù)字量減02H
if(weishu==1)
{volt[1]=volt[0]+9;volt[0]=10;weishu=2;}
if(weishu==2){volt[0]--;}
if(volt[0]<0||volt[0]>9){volt[1]=volt[1]-1;volt[0]=9;}
if(weishu==3)
{
if(dot==1)
{
volt[1]--;
if(volt[1]<0||volt[1]>9)
{
volt[2]--;volt[1]=9;
}
}
else
{
volt[0]--;
if(volt[0]<0||volt[0]>9)
{
volt[1]--;volt[0]=9;
if(volt[1]<10||volt[1]>19) {volt[1]=19;volt[0]=9;weishu=2;}
}
}
}
}
if(int0>dac0832)
{temp1=temp1-1;
}
if(int0<dac0832)
{ temp1=temp1+1;
} // ADC轉(zhuǎn)換后于輸入數(shù)字量比較運(yùn)算程序
display(weishu); // 調(diào)用顯示程序,顯示位數(shù)的值