1 /************************************************************************************** 2 * 矩阵按键实验 * 3 实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字 4 S1-S4:0-3 5 S5-S8:4-7 6 S9-S12:8-B 7 S13-S16:C-F。 8 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。 9 ***************************************************************************************/ 10 11 #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 12 13 typedef unsigned int u16; 14 typedef unsigned char u8; 15 16 #define GPIO_DIG P0 17 #define GPIO_KEY P1 18 19 sbit LSA=P2^2; 20 sbit LSB=P2^3; 21 sbit LSC=P2^4; 22 23 u8 KeyValue; //用来存放读取到的键值 24 25 26 u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 27 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 28 29 /******************************************************************************* 30 * 函 数 名 : delay 31 * 函数功能 : 延时函数,i=1时,大约延时10us 32 *******************************************************************************/ 33 void delay(u16 i) 34 { 35 while(i--); 36 } 37 38 /******************************************************************************* 39 * 函 数 名 : KeyDown 40 * 函数功能 : 检测有按键按下并读取键值 41 * 输 入 : 无 42 * 输 出 : 无 43 *******************************************************************************/ 44 void KeyDown(void) 45 { 46 char a=0; 47 GPIO_KEY=0x0f; 48 if(GPIO_KEY!=0x0f)//读取按键是否按下 0000 1111 49 { 50 delay(1000);//延时10ms进行消抖 51 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 52 { 53 //测试列 54 GPIO_KEY=0X0F; 55 switch(GPIO_KEY) 56 { 57 case(0X07): KeyValue=0;break; 58 case(0X0b): KeyValue=1;break; 59 case(0X0d): KeyValue=2;break; 60 case(0X0e): KeyValue=3;break; 61 } 62 //测试行 63 GPIO_KEY=0XF0; 64 switch(GPIO_KEY) 65 { 66 case(0X70): KeyValue=KeyValue;break; 67 case(0Xb0): KeyValue=KeyValue+4;break; 68 case(0Xd0): KeyValue=KeyValue+8;break; 69 case(0Xe0): KeyValue=KeyValue+12;break; 70 } 71 while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 72 { 73 delay(1000); 74 a++; 75 } 76 } 77 } 78 } 79 80 81 /******************************************************************************* 82 * 函 数 名 : main 83 * 函数功能 : 主函数 84 * 输 入 : 无 85 * 输 出 : 无 86 *******************************************************************************/ 87 void main() 88 { 89 LSA=0; //给一个数码管提供位选 90 LSB=0; 91 LSC=0; 92 while(1) 93 { 94 KeyDown(); //按键判断函数 95 GPIO_DIG=smgduan[KeyValue]; // 96 } 97 }
51单片机-矩阵按键
猜你喜欢
转载自www.cnblogs.com/clam-hao/p/10076562.html
今日推荐
周排行