#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() // 键盘扫描程序
{
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作片选,启动DA转换
#define int0 XBYTE[0X7FF8] //结束AD转换,锁存通道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}; //数组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显示函数
{
uchar j;
P2=0xFE; //P2.0口置0 ,选择第一个数码管
for(j=0;j<z;j++) // 循环控制
{
P0=table[volt[j]]; // 将P0口数据送 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; //定义数字量值temp1,进位标志flag,数码管位数weishu等变量
while(1)
{
dac0832=temp1; // 初始值设定为0
keynum=keyscan(); //调用键盘扫描函数
if(keynum==15) //如果键值15,代表复位,将p0置0
{
P0=0; //p0口置0,复位
while(1)
{
keynum=keyscan(); //调用键盘扫描函数
if(keynum>=0&&keynum<=9) //判断键值
{
i++;
for(weishu=0;weishu<i;weishu++)
volt[i-weishu-1]=volt[i-weishu-2];
volt[0]=keynum; // 将数值在第一个数码管中显示
if(flag==0)
voltage=voltage*10+keynum;
else {xiaoshu=pow(10,flag);
xiaoshu=keynum/xiaoshu;
sum=sum+xiaoshu;
flag++;}
} // 数字处理显示程序
else if(keynum==10) //判断按键,如果是点键,10代表点键
{
flag++;
dot=i;
volt[0]=volt[0]+10; //在第二个数码管 输出显示小数点
}
else if(keynum==11) //判断按键,如果是确认键
{
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转换后于输入数字量比较运算程序
display(i); //调用显示函数
}
else if(keynum==12) //判断按键,如果是加键
{
temp1=temp1+2; // 电压数字量加02H
if(weishu==1){volt[1]=volt[0]+10;
volt[0]=0;
weishu=2;} // 如果是一位数的话,将这个数放到第二个数码管,同时将小数点输出,第一位变为0,位数加一
if(weishu==2){volt[0]++;} //将第一位LED加1
if(volt[0]==10){volt[1]=volt[1]+1;volt[0]=0;} //如果第一个数码管是点的话,将第一个数码管加一,小数点去掉
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;}
}
}
} //三位时的处理程序
else if(keynum==13) //判断按键,如果减键
{
temp1=temp1-2; // 电压数字量减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转换后于输入数字量比较运算程序
display(weishu); // 调用显示程序,显示位数的值 |