我查阅资料写了一个基于单片机C51的一个计算器程序,用MAX7912驱动8位数码管。程序如下(图片为仿真图):谁能告诉我程序哪里有问题?重谢
include //包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0-F,数码管来显示按下键的值。 uchar keyscan(void); //主要的矩阵键盘扫描函数。void delay(uint i);void main(){uchar key;P2=0x00;P3=0xf...全部
include //包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0-F,数码管来显示按下键的值。
uchar keyscan(void); //主要的矩阵键盘扫描函数。void delay(uint i);void main(){uchar key;P2=0x00;P3=0xff;//1数码管亮 按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){ case 0xee:P2=dofly[0];break;//c k1case 0xed:P2=dofly[1];break;//d k2case 0xeb:P2=dofly[2];break;//e k3case 0xe7:P2=dofly[3];break;//f k4 case 0xde:P2=dofly[4];break;//8case 0xdd:P2=dofly[5];break;//9case 0xdb:P2=dofly[6];break;//acase 0xd7:P2=dofly[7];break;case 0xbe:P2=dofly[8];break;//4case 0xbd:P2=dofly[9];break;//5case 0xbb:P2=dofly[10];break;//6case 0xb7:P2=dofly[11];break;case 0x7e:P2=dofly[12];break;case 0x7d:P2=dofly[13];break;//1case 0x7b:P2=dofly[14];break;//2case 0x77:P2=dofly[15];break;//3//b//7//0 按下相应的键显示相对应的码值 原理就是高四位一列低四位一列的组//合。
0111 1110 7e 0表示按键后为0,1表示没有按键按下的。即P3。7与P3。1连接为低电平,为S1键//其他类推。
/*case 0x7d:P2=dofly[1];break;//1case 0x7b:P2=dofly[2];break;//2case 0x77:P2=dofly[3];break;//3case 0xbe:P2=dofly[4];break;//4case 0xbd:P2=dofly[5];break;//5case 0xbb:P2=dofly[6];break;//6case 0xb7:P2=dofly[7];break;//7case 0xde:P2=dofly[8];break;//8case 0xdd:P2=dofly[9];break;//9case 0xdb:P2=dofly[10];break;//acase 0xd7:P2=dofly[11];break;//b */}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位{uchar cord_h,cord_l;//行列值P1=0x0f; //行线输出全为0cord_h=P1&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖if(cord_h!=0x0f){ cord_h=P1&0x0f; //读入hang线值 P1=cord_h|0xf0; //输出当前列线值 cord_l=P1&0xf0; //读入lie线值 return(cord_l cord_h);//键盘最后组合码值 }}return(0xff); //返回该值}void delay(uint i)//延时函数{while(i--);}。收起