stm32 4*4 matrix keyboard

Publisher:SereneSpiritLatest update time:2017-09-27 Source: eefocusKeywords:stm32  4*4 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

stm32f030 development board.


Use HAL library.

The state machine performs debounce.


col column, Pin is configured as PP push-pull output mode;

row, the Pin is configured as Input mode and the internal pull-up resistor is enabled.


code show as below:

.h files


  1. /* 

  2. * Name: keypad.h 

  3. * Faq: www.mazclub.com 

  4. */  

  5. #ifndef KEYPAD_H  

  6. #define KEYPAD_H  

  7.   

  8. #include "stm32f0xx_hal.h"  

  9. //#include "pinname.h"  

  10.   

  11.   

  12.   

  13.   

  14. #define COLS (GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6)  

  15.   

  16. #define PORT_COL GPIOB  

  17. #define KEYy0    GPIO_PIN_6  

  18. #define KEYy1    GPIO_PIN_5  

  19. #define KEYy2    GPIO_PIN_4  

  20. #define KEYy3    GPIO_PIN_3  

  21.   

  22. #define PORT_ROW GPIOA  

  23. #define KEYx0    GPIO_PIN_12  

  24. #define KEYx1    GPIO_PIN_11  

  25. #define KEYx2    GPIO_PIN_10  

  26. #define KEYx3    GPIO_PIN_9  

  27.   

  28. // Read pin  

  29. //#define In(GPIO_Pin) (PORT_KEY->IDR & GPIO_Pin)  

  30. #define In(GPIO_Pin) HAL_GPIO_ReadPin(PORT_ROW, GPIO_Pin)  

  31. // Write 1 to Pin  

  32. //#define High(GPIO_Pin) PORT_KEY->BSRR = GPIO_Pin  

  33. #define High(GPIO_Pin) HAL_GPIO_WritePin(PORT_COL, GPIO_Pin, GPIO_PIN_SET)  

  34. // Write 0 to Pin  

  35. //#define Low(GPIO_Pin) PORT_KEY->BSRR = (uint32_t)GPIO_Pin << 16   

  36. #define Low(GPIO_Pin) HAL_GPIO_WritePin(PORT_COL, GPIO_Pin, GPIO_PIN_RESET)  

  37.   

  38. /*  

  39. *  0  1  2   3 

  40. *  4  5  6   7 

  41. *  8  9  10  11 

  42. *  12 13 14  15 

  43. */  

  44.   

  45. typedef enum {  

  46.     Key_Up = 0x02,  

  47.     Key_Left = 0x03,  

  48.     Key_Right = 0x04,  

  49.     Key_Down = 0x08,  

  50.     Key_Power =  0x09,  

  51.     Key_Mode = 0x0a,  

  52.     Key_None = 0xFF  

  53. } KeyPressed;  

  54.       

  55. static const int row_count = 4;  

  56. static const int col_count = 4;  

  57.   

  58. uint16_t bus_out(void);  

  59.   

  60. void Keypad(void);  

  61. char AnyKey(void);  

  62. char SameKey(void);  

  63. char ScanKey(void);  

  64. void FindKey(void);  

  65. void ClearKey(void);  

  66. void Read(void);  

  67. /** Start the keypad interrupt routines */  

  68. void Start(void);  

  69. /** Stop the keypad interrupt routines */  

  70. void Stop(void);  

  71. void Cols_out(uint16_t v);  

  72. void Scan_Keyboard(void);  

  73. KeyPressed getKey(void);  

  74. #endif // KEYPAD_H  




.c files


  1. /* 

  2. * Name: keypad.cpp 

  3. * Faq: www.mazclub.com 

  4. */  

  5.   

  6. #include "keypad.h"  

  7.   

  8. // State:  

  9. char KeyState;  

  10. // Bit pattern after each scan:  

  11. char KeyCode;  

  12. // Output value from the virtual 74HC922:  

  13. KeyPressed KeyValue;  

  14. // KeyDown is set if key is down:  

  15. char KeyDown;  

  16. // KeyNew is set every time a new key is down:  

  17. char KeyNew;  

  18. // Mapping table  

  19. char KeyTable[12][2];    

  20. // Pin of Row  

  21. uint16_t _rows[] = {KEYx0, KEYx1, KEYx2, KEYx3};  

  22. uint16_t _cols[] = {KEYy0, KEYy1, KEYy2, KEYy3};  

  23.   

  24. //Constructor  

  25. void Keypad(void)  

  26. {  

  27.        

  28.    Stop();     

  29.    KeyState = 0; // The initial key state is 0  

  30. }  

  31.   

  32.   

  33. //Scan the keyboard  

  34. void Scan_Keyboard(void){  

  35. switch (KeyState) {  

  36.   case 0: {  

  37.   if (AnyKey()) {      

  38.     char scankey = ScanKey();  

  39.     if (scankey != 0xff)  

  40.         KeyCode = scankey;  

  41.       

  42.     KeyState = 1;  

  43.   }  

  44.     

  45.   break;  

  46.   }  

  47.   case 1: {  

  48.   if (SameKey()) {  

  49.     FindKey();  

  50.     KeyState = 2;    

  51.   }  

  52.   else   

  53.     KeyState = 0;  

  54.     

  55.   break;  

  56.   }  

  57.   case 2: {  

  58.     if (SameKey()) {  

  59.     }  

  60.     else   

  61.       KeyState = 3;  

  62.       

  63.     break;  

  64.     }  

  65.   case 3: {  

  66.     if (SameKey()) {  

  67.       KeyState = 2;  

  68.     }  

  69.     else {  

  70.       ClearKey();  

  71.       KeyState = 0;  

  72.     }  

  73.       

  74.     break;  

  75.    }  

  76.   }  

  77. // func end  

  78. }  

  79.   

  80. // A key is pressed  

  81. char AnyKey(void) {  

  82.  //Start(); //Pull down  

  83.    

  84.  int r = -1;  

  85.  for (r = 0; r < row_count; r++) {  

  86.      if (In(_rows[r]) == 0)  // In macro  

  87.          break;    

  88.  }  

  89.    

  90.  //Stop(); //Resume  

  91.    

  92.  if (!(0 <= r && r < row_count))  

  93.     return 0;  

  94.  else  

  95.     return 1;  

  96. }  

  97.   

  98. //Key pressed, key value is the same  

  99. char SameKey(void) {  

  100.     

  101.   // char KeyCode_new = KeyCode;  

  102.   char KeyCode_new = ScanKey();  

  103.   if (KeyCode == KeyCode_new)    

  104.     return 1;  

  105.   else  

  106.     return 0;  

  107. }  

  108.   

  109. // Scan key  

  110. char ScanKey(void) {  

  111.   

  112.  /* Line scan */  

  113.     int r = -1;  

  114.     for (r = 0; r < row_count; r++) {  

  115.         if (In(_rows[r]) == 0)  // In macro  

  116.             break;  

  117.     }  

  118.   

  119.     /* If no valid row is found, return */  

  120.     if (!(0 <= r && r < row_count)) {  

  121.       return 0xff;  

  122.           

  123.     }  

  124.   

  125.     /* Scan the columns to find out which row is pulled low */  

  126.     int c = -1;  

  127.     for (c = 0; c < col_count; c++) {  

  128.         // Output column lines in turn  

  129.         Cols_out(~(1 << c));  

  130.           

  131.         if (In(_rows[r]) == 0)  // In macro  

  132.             break;  

  133.     }  

  134.   

  135.     /* Recharge all columns */  

  136.     Start();  

  137.   

  138.     /* If no valid column is found, return */  

  139.     if (!(0 <= c && c < col_count))  

  140.         return 0xff;  

  141.   

  142.     return r * col_count + c;  

  143.    

  144. }  

  145.   

  146. // FindKey compares KeyCode to values in KeyTable.  

  147. // If match, KeyValue, KeyDown and KeyNew are updated.  

  148. void FindKey(void) {  

  149.  KeyValue = (KeyPressed)KeyCode;  

  150.  KeyDown = 1;  

  151.  KeyNew = 1;  

  152. }  

  153.   

  154.   

  155. void ClearKey(void) {  

  156.  KeyDown = 0;  

  157. }  

  158.   

  159. KeyPressed getKey(void) {  

  160.   if(KeyNew)  

  161.   {  

  162.     KeyNew = 0;  

  163.     return KeyValue;  

  164.   }  

  165.   else  

  166.     return Key_None;  

  167. }  

  168.   

  169. void Start(void)  

  170. {  

  171.     /* Output 0 for the column, pull the row down */  

  172.     PORT_COL->BRR = COLS;  

  173. }  

  174.   

  175. void Stop(void)  

  176. {  

  177.     /* Column output 1 so that the row is not pulled low */  

  178.     PORT_COL->BSRR = COLS;  

  179. }  

  180.   

  181. // cols bus output  

  182. void Cols_out(uint16_t v)  

  183. {  

  184.   if ((v & 0x01) > 0) //0b001  

  185.     High(_cols[0]);  

  186.   else  

  187.     Low(_cols[0]);  

  188.     

  189.   if ((v & 0x02) > 0) //0b010  

  190.     High(_cols[1]);  

  191.   else  

  192.     Low(_cols[1]);  

  193.     

  194.   if ((v & 0x04) > 0) //0b100  

  195.     High(_cols[2]);  

  196.   else  

  197.     Low(_cols[2]);  

  198.     

  199.   if ((v & 0x08) > 0) //0b100  

  200.     High(_cols[3]);  

  201.   else  

  202.     Low(_cols[3]);  

  203.                                              

  204. }  


Keywords:stm32  4*4 Reference address:stm32 4*4 matrix keyboard

Previous article:Output Compare of stm32 timer
Next article:Understanding STM32 open-drain output and push-pull output

Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号