2017年11月29日
矩阵按键程序
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit we = P2^7; sbit du = P2^6; uchar code leddata[]={ 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //熄灭 0x00 //自定义 }; void delay(uint z) { uint x,y; for(x = z;x > 0;x --) for(y = 112;y > 0;y --); } //嵌套延时函数 uchar KeyScan() //按键判断函数 { uchar cord_l,cord_h; //声明列和行函数名 P3 = 0xf0; //将0xf0赋给P3口,将行置高电平列置低电平 //if((P3 & 0xf0) != 0xf0) if(P3 != 0xf0) //当行和列不再是初始的时候代表有按键被按下 { delay(5); //软件消抖延时 //if((P3 & 0xf0) != 0xf0) if(P3 != 0xf0) //确定有按键按下 { cord_l = P3 & 0xf0; //按位与运算,将结果赋给cord_l函数 P3 = cord_l | 0x0f; //按位或运算,将运算结果赋给P3口 //扫描矩阵键盘的每一列将其结果赋给cord_l函数 cord_h = P3 & 0x0f; // 按位与,将P3口的行与0x0f中不同的二进制数置为低电平 while((P3 & 0x0f) != 0x0f); //不断的判断按键是否按下 return(cord_l + cord_h); //列和行的按键地址 } } } void KeyPro() //按键地址函数 { switch(KeyScan()) //按键地址选择语句块 { //当按键地址等于以下之一时则选择将后面leddata数组中的数字送入数码管 //第一行 case 0xee:P0 = leddata[0]; break; //第一列 case 0xde:P0 = leddata[1]; break; //第二列 case 0xbe:P0 = leddata[2]; break; //第三列 case 0x7e:P0 = leddata[3]; break; //第四列 //第二行 case 0xed:P0 = leddata[4]; break; //第一列 case 0xdd:P0 = leddata[5]; break; //第二列 case 0xbd:P0 = leddata[6]; break; //第三列 case 0x7d:P0 = leddata[7]; break; //第四列 //第三行 case 0xeb:P0 = leddata[8]; break; //第一列 case 0xdb:P0 = leddata[9]; break; //第二列 case 0xbb:P0 = leddata[10]; break; //第三列 case 0x7b:P0 = leddata[11]; break; //第四列 //第四行 case 0xe7:P0 = leddata[12]; break; //第一列 case 0xd7:P0 = leddata[13]; break; //第二列 case 0xb7:P0 = leddata[14]; break; //第三列 case 0x77:P0 = leddata[15]; break; //第四列 } } void main() //主函数开始 { we = 1; //打开位选 P0 = 0; //打开所有8组数码管 we = 0; //打开位选 du = 1; //打开段选 P0 = leddata[22]; //向P0口段选送一个初始显示数但此地不可为空 while(1) //循环执行按键地址程序 { KeyPro(); //按键地址函数 } }