#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); // 调用显示程序,显示位数的值 } }调试出了问题,高手指导下!!!
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>