[开发工具] 【APM32F107VC-MINI开发板测评】矩阵键盘

[复制链接]
3123|34
 楼主| 比神乐 发表于 2023-3-7 12:46 | 显示全部楼层 |阅读模式
今天搞了一下矩阵键盘。
行线:PC0,PC1,PC2,PC3。列线:PA4,PA5,PA6,PA7。
原理图:
2.jpg
串口打印键值。
代码:
  1. #include "main.h"

  2. /** @addtogroup Examples
  3.   @{
  4. */
  5. #define Hang_00_L  GPIO_ResetBit(GPIOC,GPIO_PIN_0)
  6. #define Hang_00_H  GPIO_SetBit(GPIOC,GPIO_PIN_0)

  7. #define Hang_01_L  GPIO_ResetBit(GPIOC,GPIO_PIN_1)
  8. #define Hang_01_H  GPIO_SetBit(GPIOC,GPIO_PIN_1)

  9. #define Hang_02_L  GPIO_ResetBit(GPIOC,GPIO_PIN_2)
  10. #define Hang_02_H  GPIO_SetBit(GPIOC,GPIO_PIN_2)

  11. #define Hang_03_L  GPIO_ResetBit(GPIOC,GPIO_PIN_3)
  12. #define Hang_03_H  GPIO_SetBit(GPIOC,GPIO_PIN_3)

  13. #define Lie_00_V   GPIO_ReadInputBit(GPIOA,GPIO_PIN_4)
  14. #define Lie_01_V   GPIO_ReadInputBit(GPIOA,GPIO_PIN_5)
  15. #define Lie_02_V   GPIO_ReadInputBit(GPIOA,GPIO_PIN_6)
  16. #define Lie_03_V   GPIO_ReadInputBit(GPIOA,GPIO_PIN_7)

  17. #define Lie_04_V   ((GPIO_ReadInputPort(GPIOA)>>4) & 0x0FU)


  18. #define Hang_10_L  GPIO_ResetBit(GPIOA,GPIO_PIN_4)
  19. #define Hang_10_H  GPIO_SetBit(GPIOA,GPIO_PIN_4)

  20. #define Hang_11_L  GPIO_ResetBit(GPIOA,GPIO_PIN_5)
  21. #define Hang_11_H  GPIO_SetBit(GPIOA,GPIO_PIN_5)

  22. #define Hang_12_L  GPIO_ResetBit(GPIOA,GPIO_PIN_6)
  23. #define Hang_12_H  GPIO_SetBit(GPIOA,GPIO_PIN_6)

  24. #define Hang_13_L  GPIO_ResetBit(GPIOA,GPIO_PIN_7)
  25. #define Hang_13_H  GPIO_SetBit(GPIOA,GPIO_PIN_7)

  26. #define Lie_10_V    GPIO_ReadInputBit(GPIOC,GPIO_PIN_0)
  27. #define Lie_11_V    GPIO_ReadInputBit(GPIOC,GPIO_PIN_1)
  28. #define Lie_12_V    GPIO_ReadInputBit(GPIOC,GPIO_PIN_2)
  29. #define Lie_13_V    GPIO_ReadInputBit(GPIOC,GPIO_PIN_3)

  30. #define Lie_14_V   ((GPIO_ReadInputPort(GPIOC)<<4)  & 0xF0U)

  31. #define  jpys 20   //??????jpys==20?????????


  32. uint8_t temp;
  33. uint8_t txBuffer[50];
  34. uint8_t rxBuffer[10];
  35. uint8_t cord_h,cord_l;//???????
  36. volatile uint32_t nBytesRead = 0;
  37. //volatile bool txThresholdEventReceived = false;
  38. //volatile bool rxThresholdEventReceived = false;

  39. /** @addtogroup USART_Printf
  40.   @{
  41. */

  42. /** @addtogroup USART_Printf_Variables Variables
  43.   @{
  44. */

  45. volatile uint32_t tick = 0;
  46. uint8_t txBuf[] = "Key Value = :   \r\n";

  47. /**@} end of group USART_Printf_Variables */
  48. void DelayMs(uint16_t nms)
  49. {
  50.         uint16_t i,j;                  
  51.         for(i=0;i<nms;i++)
  52.        for(j=0;j<200;j++);
  53. }
  54. /** @addtogroup USART_Printf_Functions Functions
  55.   @{
  56. */
  57. void PORT_Initialize1(void)
  58. {
  59.    /************************** GROUP 0 Initialization *************************/
  60.          GPIO_Config_T GPIO_ConfigStruct;

  61.    /************************** GROUP 1 Initialization *************************/
  62.    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_GPIOC);
  63.          
  64.                 GPIO_ConfigStruct.mode = GPIO_MODE_OUT_PP;
  65.                 GPIO_ConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
  66.                 GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  67.                 GPIO_Config(GPIOC, &GPIO_ConfigStruct);

  68.                 GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU;
  69.                 GPIO_ConfigStruct.pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  70.                 GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  71.                 GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  72. }
  73. void PORT_Initialize2(void)
  74. {
  75.    GPIO_Config_T GPIO_ConfigStruct;

  76.    /************************** GROUP 1 Initialization *************************/
  77.    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA  | RCM_APB2_PERIPH_GPIOC);
  78.          
  79.                 GPIO_ConfigStruct.mode = GPIO_MODE_OUT_PP;
  80.                 GPIO_ConfigStruct.pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  81.                 GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  82.                 GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  83.                 GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU;
  84.                 GPIO_ConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
  85.                 GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  86.                 GPIO_Config(GPIOC, &GPIO_ConfigStruct);

  87. }

  88. unsigned char KeyScan(void)  //????????????????
  89. {
  90.     uint16_t i,j;

  91.     PORT_Initialize1();
  92.     for(i=0;i<1250;i++);
  93.     Hang_00_L;
  94.     Hang_01_L;
  95.     Hang_02_L;
  96.     Hang_03_L;
  97.     for(i=0;i<1250;i++);
  98.     //cord_h=(Lie_04_V&0x0f);
  99.     cord_h=(uint8_t)(Lie_04_V);
  100.     //cord_h=Lie_01_V|Lie_02_V|Lie_03_V|Lie_04_V;
  101.     if(cord_h != 0xf0)    //?????????
  102.     {
  103.          DelayMs(10);        //??
  104.          cord_h=(uint8_t)(Lie_04_V);
  105.          
  106.         if(cord_h!=0xf0)
  107.         {
  108.             cord_h=(uint8_t)(Lie_04_V);        //?????
  109.             for(i=0;i<1250;i++);
  110.             PORT_Initialize2();
  111.             for(i=0;i<1250;i++);
  112.             if((cord_h&0x01)==0x01)
  113.                 Hang_10_H;
  114.             else
  115.                 Hang_10_L;
  116.             if((cord_h&0x02)==0x02)
  117.                 Hang_11_H;
  118.             else
  119.                 Hang_11_L;
  120.             if((cord_h&0x04)==0x04)
  121.                 Hang_12_H;
  122.             else
  123.                 Hang_12_L;
  124.             if((cord_h&0x08)==0x08)
  125.                 Hang_13_H;
  126.             else
  127.                 Hang_13_L;

  128.             for(i=0;i<1250;i++);
  129.             cord_l=(uint8_t)(Lie_14_V);                   //?????
  130.             while(1)     //???????
  131.             {
  132.                 j=(uint8_t)(Lie_14_V);
  133.                 if(j==0xF0)
  134.                     break;
  135.                 for(i=0;i<1250;i++);
  136.             }
  137.             return(cord_h+cord_l);//????????
  138.         }
  139.     }
  140.     return(0xff);     //????*/
  141. }

  142. unsigned char KeyPro(void)
  143. {
  144. switch(KeyScan())
  145. {
  146.   case 0x7e:return 0;break;//0 ??????????????
  147.   case 0x7d:return 1;break;//1
  148.   case 0x7b:return 2;break;//2
  149.   case 0x77:return 3;break;//3
  150.   case 0xbe:return 4;break;//4
  151.   case 0xbd:return 5;break;//5
  152.   case 0xbb:return 6;break;//6
  153.   case 0xb7:return 7;break;//7
  154.   case 0xde:return 8;break;//8
  155.   case 0xdd:return 9;break;//9
  156.   case 0xdb:return 10;break;//a
  157.   case 0xd7:return 11;break;//b
  158.   case 0xee:return 12;break;//c
  159.   case 0xed:return 13;break;//d
  160.   case 0xeb:return 14;break;//e
  161.   case 0xe7:return 15;break;//f
  162.   default:return 0xff;break;
  163. }
  164. }
  165. /*!
  166. * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program
  167. *
  168. * @param       None
  169. *
  170. * @retval      None
  171. *
  172. */
  173. int main(void)
  174. {
  175.     uint8_t i;

  176.     GPIO_Config_T GPIO_ConfigStruct;
  177.     USART_Config_T USART_ConfigStruct;

  178.     APM_MINI_LEDInit(LED2);

  179.     RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1));

  180.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
  181.     GPIO_ConfigStruct.pin = GPIO_PIN_9;
  182.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  183.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  184.     USART_ConfigStruct.baudRate = 115200;
  185.     USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  186.     USART_ConfigStruct.mode = USART_MODE_TX;
  187.     USART_ConfigStruct.parity = USART_PARITY_NONE;
  188.     USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
  189.     USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
  190.     USART_Config(USART1, &USART_ConfigStruct);

  191.     USART_Enable(USART1);

  192.     SysTick_Config(SystemCoreClock / 1000);

  193.     while(1)
  194.     {

  195.                                 temp=KeyPro();
  196.         if(temp!=0xff)
  197.         {

  198.                                                 if((temp>=0)&&(temp<=9))
  199.                                                         txBuf[14]=temp+0x30;
  200.                                                 else if((temp>=10)&&(temp<=15))
  201.                                                         txBuf[14]=temp+55;
  202.                                                 for(i = 0; i < sizeof(txBuf); i++)
  203.                                                 {
  204.                                                                 while(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
  205.                                                                 USART_TxData(USART1, txBuf[i]);
  206.                                                 }
  207.         }
  208.     }
  209. }

  210. /*!
  211. * @brief       Delay
  212. *
  213. * @param       None
  214. *
  215. * @retval      None
  216. *
  217. */
  218. void Delay(void)
  219. {
  220.     tick = 0;

  221.     while(tick < 500);
  222. }

  223. /**@} end of group USART_Printf_Functions */
  224. /**@} end of group USART_Printf */
  225. /**@} end of group Examples */
效果图:
0.jpg 1.jpg

评论

挺好的  发表于 2023-5-31 08:43
blust5 发表于 2023-3-7 14:18 | 显示全部楼层
不错不错,支持一个
strang 发表于 2023-3-8 08:29 | 显示全部楼层
不错,支持下LZ
tpgf 发表于 2023-4-4 08:12 | 显示全部楼层
这种矩阵键盘我们能操作的按键就是取决于能使用的io数量吧
qcliu 发表于 2023-4-4 11:12 | 显示全部楼层
现在一般什么产品上需要用到这种键盘呢
drer 发表于 2023-4-4 11:45 | 显示全部楼层
楼主检测按键使用的是什么模式呢
coshi 发表于 2023-4-4 12:14 | 显示全部楼层
当两个按键间距很近的时候会不会产生干扰呢
kxsi 发表于 2023-4-4 15:07 | 显示全部楼层
coshi 发表于 2023-4-4 12:14
当两个按键间距很近的时候会不会产生干扰呢

感觉只有高频状态下才会产生干扰  这种情况就是小意思啦
wiba 发表于 2023-4-4 15:18 | 显示全部楼层
这种多个按键的情况 我们如何区分是正常按压还是干扰信号呢
 楼主| 比神乐 发表于 2023-4-5 09:45 | 显示全部楼层
drer 发表于 2023-4-4 11:45
楼主检测按键使用的是什么模式呢

就是扫描
 楼主| 比神乐 发表于 2023-4-5 09:46 | 显示全部楼层
coshi 发表于 2023-4-4 12:14
当两个按键间距很近的时候会不会产生干扰呢

那要看多近了,我的矩阵键盘感觉比较近了,没有干扰的情况
wangqy_ic 发表于 2023-4-6 09:09 | 显示全部楼层
第一张图片,文不对题呀
 楼主| 比神乐 发表于 2023-4-6 10:09 | 显示全部楼层
wangqy_ic 发表于 2023-4-6 09:09
第一张图片,文不对题呀

我把矩阵键盘的值用串口打印出来,贴的是串口的原理图,怎么叫文不对题呀?
hearstnorman323 发表于 2023-4-8 21:50 | 显示全部楼层
哪位给点写APM32F107VC 4*4矩阵键盘的思路,要用中断的
ulystronglll 发表于 2023-4-8 22:04 | 显示全部楼层
矩阵键盘如何实现松手检测               
alvpeg 发表于 2023-4-8 22:20 | 显示全部楼层
按键行列逐级扫描法实现的吧。              
minzisc 发表于 2023-4-8 22:26 | 显示全部楼层
4×4矩阵键盘的键值怎么求?               
bestwell 发表于 2023-4-9 13:45 | 显示全部楼层
矩阵按键输入一般用什么模式?              
uytyu 发表于 2023-4-9 13:51 | 显示全部楼层
矩阵键盘按键gpio怎么初始化设置
tifmill 发表于 2023-4-9 14:50 | 显示全部楼层
4*8矩阵键盘行列方式如何扩展?求c程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部