电路图:
扫描原理:
逐列扫描,先将第一列输出低,其他所有IO设置为上拉输入,读取IO值,高4位哪个为低,说明是当前列哪个按键按下。
源码:
1 /***************************************************************************** 2 * FILE NAME keypad.h 3 * DESCRIPTION: 4 * Copyright : xxx Technologies Ltd. 5 * All Rights Reserved 6 * Author: Milo lu 7 * Copyright (c) 2021, PGST Technologies Ltd. 8 * 9 * All rights reserved. 10 -* ****************************************************************************/ 11 #ifndef __KEYPAD_H 12 #define __KEYPAD_H 13 14 //--------------------- Keys Macro Define ----------------------- 15 #define KEY_0 BIT0 16 #define KEY_1 BIT1 17 #define KEY_2 BIT2 18 #define KEY_3 BIT3 19 #define KEY_4 BIT4 20 #define KEY_5 BIT5 21 #define KEY_6 BIT6 22 #define KEY_7 BIT7 23 #define KEY_8 BIT8 24 #define KEY_9 BIT9 25 #define ASTERIK_KEY BIT10 26 #define POUND_KEY BIT11 27 #define ARM_KEY BIT12 28 #define DISARM_KEY BIT13 29 #define HOME_KEY BIT14 30 #define SOS_KEY BIT15 31 32 33 void keypad_init(void); 34 u16 keypad_scan(void); 35 36 #endif 37 38 //------------------------------ end of file ------------------------------keypad.h
1 /***************************************************************************** 2 * FILE NAME keypad.c 3 * DESCRIPTION: 4 * Copyright : xxxTechnologies Ltd. 5 * All Rights Reserved 6 * Author: Milo lu 7 * Copyright (c) 2021, PGST Technologies Ltd. 8 * 9 * All rights reserved. 10 -* ****************************************************************************/ 11 //---------------- system -------------------------- 12 #include "Global.h" 13 14 //---------------- Peripheral ---------------------- 15 #include "keypad.h" 16 17 18 19 u16 g_key_value; 20 21 /** 22 * @brief keypad_init 23 */ 24 void keypad_init(void) 25 { 26 int i; 27 for(i=0;i<8;i++) //PB1-PB8 set input with pull-up 28 { 29 GPIO_Init(GPIOB,i+1,0,1,0,0); 30 } 31 } 32 33 /** 34 * @brief keypad_scan 35 * @return key value 36 */ 37 u16 keypad_scan(void) 38 { 39 u8 io_state; 40 41 u16 key_value = 0; 42 43 //---------------------- Read [1,4,7,*] keys --------------------------- 44 GPIO_Init(GPIOB,PIN1,1,0,0,0); //the first column 45 vTaskDelay(2); 46 io_state = (GPIOB->IDR>>1)&0xF0; //get io state 47 if(io_state!=0xF0) //is any key press in the frist column? 48 { 49 vTaskDelay(20); //debouncing 50 io_state = (GPIOB->IDR>>1)&0xF0; //get io state again 51 if(io_state!=0xF0) //is any key press? [1,4,7,*] 52 { 53 if((io_state&BIT7)==0) 54 { 55 key_value |= KEY_1; 56 } 57 if((io_state&BIT6)==0) 58 { 59 key_value |= KEY_4; 60 } 61 if((io_state&BIT5)==0) 62 { 63 key_value |= KEY_7; 64 } 65 if((io_state&BIT4)==0) 66 { 67 key_value |= ASTERIK_KEY; 68 } 69 } 70 } 71 GPIO_Init(GPIOB,PIN1,0,1,0,0); //release,input with pull-up 72 73 //---------------------- Read [2,5,8,0] keys --------------------------- 74 GPIO_Init(GPIOB,PIN2,1,0,0,0); //the second column 75 vTaskDelay(2); 76 io_state = (GPIOB->IDR>>1)&0xF0; //get io state 77 if(io_state!=0xF0) //is any key press in the second column? 78 { 79 vTaskDelay(20); //debouncing 80 io_state = (GPIOB->IDR>>1)&0xF0; //get io state again 81 if(io_state!=0xF0) //is any key press? [2,5,8,0] 82 { 83 if((io_state&BIT7)==0) 84 { 85 key_value |= KEY_2; 86 } 87 if((io_state&BIT6)==0) 88 { 89 key_value |= KEY_5; 90 } 91 if((io_state&BIT5)==0) 92 { 93 key_value |= KEY_8; 94 } 95 if((io_state&BIT4)==0) 96 { 97 key_value |= KEY_0; 98 } 99 } 100 } 101 GPIO_Init(GPIOB,PIN2,0,1,0,0); //release,input with pull-up 102 103 //---------------------- Read [3,6,9,#] keys --------------------------- 104 GPIO_Init(GPIOB,PIN3,1,0,0,0); //the third column 105 vTaskDelay(2); 106 io_state = (GPIOB->IDR>>1)&0xF0; //get io state 107 if(io_state!=0xF0) //is any key press in the second column? 108 { 109 vTaskDelay(20); //debouncing 110 io_state = (GPIOB->IDR>>1)&0xF0; //get io state again 111 if(io_state!=0xF0) //is any key press? [3,6,9,#] 112 { 113 if((io_state&BIT7)==0) 114 { 115 key_value |= KEY_3; 116 } 117 if((io_state&BIT6)==0) 118 { 119 key_value |= KEY_6; 120 } 121 if((io_state&BIT5)==0) 122 { 123 key_value |= KEY_9; 124 } 125 if((io_state&BIT4)==0) 126 { 127 key_value |= POUND_KEY; 128 } 129 } 130 } 131 GPIO_Init(GPIOB,PIN3,0,1,0,0); //release,input with pull-up 132 133 //---------------------- Read [arm,diarm,home,sos] keys --------------------------- 134 GPIO_Init(GPIOB,PIN4,1,0,0,0); //the fourth column 135 vTaskDelay(2); 136 io_state = (GPIOB->IDR>>1)&0xF0; //get io state 137 if(io_state!=0xF0) //is any key press in the second column? 138 { 139 vTaskDelay(20); //debouncing 140 io_state = (GPIOB->IDR>>1)&0xF0; //get io state again 141 if(io_state!=0xF0) //is any key press? [arm,diarm,home,sos] 142 { 143 if((io_state&BIT7)==0) 144 { 145 key_value |= ARM_KEY; 146 } 147 if((io_state&BIT6)==0) 148 { 149 key_value |= DISARM_KEY; 150 } 151 if((io_state&BIT5)==0) 152 { 153 key_value |= HOME_KEY; 154 } 155 if((io_state&BIT4)==0) 156 { 157 key_value |= SOS_KEY; 158 } 159 } 160 } 161 GPIO_Init(GPIOB,PIN4,0,1,0,0); //release,input with pull-up 162 163 return key_value; 164 } 165 166 167 168 169 170 171 172 173 174 175 176 //--------------------- end of file ------------------------------keypad.c
仅供参考,请勿用于商业。谢谢