[STM32F1] 矩阵键盘程序问题

[复制链接]
2844|43
kingkits 发表于 2020-6-19 13:19 | 显示全部楼层
你可以考虑这样,先一组线A全拉低(置0)读另一组线B,然后把另一组线B拉低,读先一组线A,两个数据就能解析到按键,为防止抖动,需要记录解析的按键,然后间隔4-10ms,再检测一次,两次的数据相同才能确认按键按下,按键按下后,如果需要检测释放,就需要连续检测,间隔相同。还可以增加一个变量记录按键按下的时间(检测的数据连续相同的次数)。就可以区分长按键了。
 楼主| Cjy_JDxy 发表于 2020-6-19 13:56 | 显示全部楼层
gx_huang 发表于 2020-6-19 08:18
扫描输出要线与的,那肯定是OD输出了。
无论什么样的按键程序,我全是自己编的,根据系统需要编程,从来 ...

开漏的话,列线接上拉电阻啦。行线没接上拉电阻,怎么办呀?谢谢
gx_huang 发表于 2020-6-19 14:54 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-19 13:56
开漏的话,列线接上拉电阻啦。行线没接上拉电阻,怎么办呀?谢谢

假设行是输出,列是输入,输出OD,输入上拉,这你好好理解。
按键按下,有输出0,相关的输入也是0,这难道还不理解?
gx_huang 发表于 2020-6-19 14:56 | 显示全部楼层

凡事不能靠试呀,都可以预先想好的,不知道原理,不知道要试多少回
 楼主| Cjy_JDxy 发表于 2020-6-19 16:13 | 显示全部楼层
gx_huang 发表于 2020-6-19 14:54
假设行是输出,列是输入,输出OD,输入上拉,这你好好理解。
按键按下,有输出0,相关的输入也是0,这难 ...

第2句我理解。
第一句,行没接上拉,可以输出低,无法输出高。
 楼主| Cjy_JDxy 发表于 2020-6-19 16:14 | 显示全部楼层
gx_huang 发表于 2020-6-19 14:56
凡事不能靠试呀,都可以预先想好的,不知道原理,不知道要试多少回

我只写过51的矩阵键盘,STM32的没写过,不太一样。
gx_huang 发表于 2020-6-19 16:45 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-19 16:13
第2句我理解。
第一句,行没接上拉,可以输出低,无法输出高。

线与,当然不需要输出高,如何可以输出高,不就打架了,一个高一个低打架呀。
输出高就是高阻。
gx_huang 发表于 2020-6-19 16:45 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-19 16:14
我只写过51的矩阵键盘,STM32的没写过,不太一样。

有些51也有推挽输出,也会打架的,51和STM32没有本质区别
 楼主| Cjy_JDxy 发表于 2020-6-19 17:56 | 显示全部楼层
gx_huang 发表于 2020-6-19 16:45
线与,当然不需要输出高,如何可以输出高,不就打架了,一个高一个低打架呀。
输出高就是高阻。 ...

谢谢!我再想想
 楼主| Cjy_JDxy 发表于 2020-6-19 18:48 | 显示全部楼层
gx_huang 发表于 2020-6-19 16:45
有些51也有推挽输出,也会打架的,51和STM32没有本质区别
  1. void KEY_Init(void)
  2. {

  3. GPIO_InitTypeDef  GPIO_InitStructure;
  4.        
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PD端口时钟
  6.        
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;                                 //LED0-->PA.8 端口配置
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;                  //推挽输出

  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  10. GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8

  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ;                                 //LED0-->PA.8 端口配置
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //推挽输出
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  14. GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8
  15.        
  16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;                             //LED1-->PD.2 端口配置, 推挽输出
  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //推挽输出
  18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  19. GPIO_Init(GPIOB, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  20.        

  21. }
  22. void Hang_Output(void)
  23. {
  24.         GPIO_InitTypeDef  GPIO_InitStructure;
  25.        
  26. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PD端口时钟
  27.        


  28. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ;                                 //LED0-->PA.8 端口配置
  29. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;                  //推挽输出
  30. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  31. GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8
  32.        
  33. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;                             //LED1-->PD.2 端口配置, 推挽输出
  34. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;                  //推挽输出
  35. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  36. GPIO_Init(GPIOB, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  37.        
  38. }
  39. void Hang_Input(void)
  40. {
  41.         GPIO_InitTypeDef  GPIO_InitStructure;
  42.        
  43. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PD端口时钟
  44.        


  45. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ;                                 //LED0-->PA.8 端口配置
  46. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //推挽输出
  47. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  48. GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8
  49.        
  50. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;                             //LED1-->PD.2 端口配置, 推挽输出
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //推挽输出
  52. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  53. GPIO_Init(GPIOB, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  54.        
  55. }
  56. void Lie_Input(void)
  57. {
  58.         GPIO_InitTypeDef  GPIO_InitStructure;
  59.        
  60. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PD端口时钟
  61.        
  62. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;                                 //LED0-->PA.8 端口配置
  63. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  //上拉输入
  64. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  65. GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8
  66. }

  67. void Lie_Output(void)
  68. {
  69.         GPIO_InitTypeDef  GPIO_InitStructure;
  70.        
  71. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PD端口时钟
  72.        
  73. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;                                 //LED0-->PA.8 端口配置
  74. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;                  //推挽输出
  75. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  76. GPIO_Init(GPIOE, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8
  77. }
  78. unsigned char GetKey(void)
  79. {
  80.        
  81.         unsigned char keyvalue = 0;
  82.         uint16_t hangvalue=0;
  83.        
  84. // 第1回合第1步
  85.         KEY_Init();
  86.         delay_us(20);
  87.         GPIO_ResetBits(GPIOE,GPIO_Pin_6);                                                  //PE.6,5,4,3 输出低
  88.         GPIO_SetBits(GPIOE,GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3);                
  89.                
  90.        
  91.        
  92.         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  93.         if (hangvalue != 0x1f)// 从IO口输入,读IO口
  94.         {
  95.         // 读出的不是0x0f说明有按键被按下
  96.         // 第1回合第2步:读出端口从读出值来判断是哪一行
  97.                 delay_ms(20);
  98.                 GPIO_ResetBits(GPIOE,GPIO_Pin_6);                                                  //PE.6,5,4,3 输出低
  99.                 GPIO_SetBits(GPIOE,GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3);                                         
  100.                
  101.                
  102.                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  103.                 if (hangvalue != 0x1f)// 从IO口输入,读IO口
  104.                 {
  105.                         Hang_Output();
  106.                         Lie_Input();
  107.                         delay_us(20);
  108.                 // 第一回合中算出行号
  109.                         switch (hangvalue)
  110.                         {
  111.                                 case 0x0F:

  112.                                                                 keyvalue=4;

  113.                                         break;
  114.                                 case 0x17:
  115.                                                
  116.                                                                 keyvalue=5;
  117.                
  118.                                         break;
  119.                                 case 0x1b:
  120.                                                                 keyvalue=1;
  121.                                         break;
  122.                                 case 0x1d:
  123.                                                
  124.                                                
  125.                                                                 keyvalue=2;
  126.                                                                
  127.                                         break;
  128.                                 case 0x1e:
  129.                                                
  130.                                                
  131.                                                                 keyvalue=3;
  132.                                                                
  133.                                         break;
  134.                                
  135.                                 default: break;
  136.                                
  137.                         }
  138.                         Hang_Input();
  139.                         Lie_Output();
  140.                         delay_us(20);
  141.                         GPIO_ResetBits(GPIOE,GPIO_Pin_6 );                                                  //PE.6,5,4,3 输出低
  142.                         GPIO_SetBits(GPIOE,GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3);
  143.                         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  144.                         while (hangvalue != 0x1f)
  145.                         {
  146.                                
  147.                                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  148.                         }
  149.                         delay_ms(2);
  150.                         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  151.                         while (hangvalue != 0x1f)
  152.                         {
  153.                                
  154.                                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  155.                         }
  156.                         return keyvalue;
  157.                 }
  158.                
  159.         }
  160.         KEY_Init();
  161.         delay_us(20);
  162.        
  163.         GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
  164.         GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
  165.        
  166.         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  167.         if (hangvalue != 0x1f)// 从IO口输入,读IO口
  168.         {
  169.         // 读出的不是0x0f说明有按键被按下
  170.         // 第1回合第2步:读出端口从读出值来判断是哪一行
  171.                 delay_ms(20);
  172.                
  173.                 GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
  174.                 GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
  175.                
  176.                
  177.                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  178.                 if (hangvalue != 0x1f)// 从IO口输入,读IO口
  179.                 {
  180.                         Hang_Output();
  181.                         Lie_Input();
  182.                         delay_us(20);
  183.                 // 第一回合中算出行号
  184.                         switch (hangvalue)
  185.                         {
  186.                                 case 0x0F:
  187.                                                
  188.                                                
  189.                                                
  190.                                                                 keyvalue=9;
  191.                                                        
  192.                                         break;
  193.                                 case 0x17:
  194.                                                
  195.                                                
  196.                                                                 keyvalue=10;
  197.                                        
  198.                                         break;
  199.                                 case 0x1b:
  200.                                                
  201.                                                
  202.                                                                 keyvalue=6;
  203.                                                
  204.                                         break;
  205.                                 case 0x1d:
  206.                                                
  207.                                                
  208.                                                                 keyvalue=7;
  209.                                        
  210.                                         break;
  211.                                 case 0x1e:
  212.                                                
  213.                                                
  214.                                                                 keyvalue=8;
  215.                                                
  216.                                         break;
  217.                                
  218.                                        
  219.                                 default: break;
  220.                                
  221.                         }
  222.                         Hang_Input();
  223.                         Lie_Output();
  224.                         delay_us(20);
  225.                        
  226.                         GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
  227.                         GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_3);
  228.                         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  229.                         while (hangvalue != 0x1f)
  230.                         {
  231.                                
  232.                                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0300)>>5);
  233.                         }
  234.                        
  235.                        
  236.                         return keyvalue;
  237.                 }
  238.                
  239.         }
  240.         KEY_Init();
  241.         delay_us(20);
  242.        
  243.        
  244.         GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
  245.         GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_5);
  246.        
  247.        
  248.         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  249.         if (hangvalue != 0x3f)// 从IO口输入,读IO口
  250.         {
  251.         // 读出的不是0x0f说明有按键被按下
  252.         // 第1回合第2步:读出端口从读出值来判断是哪一行
  253.                 delay_ms(20);
  254.                
  255.                 GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
  256.                 GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_5);
  257.                
  258.                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  259.                 if (hangvalue != 0x3f)// 从IO口输入,读IO口
  260.                 {
  261.                         Hang_Output();
  262.                         Lie_Input();
  263.                         delay_us(20);
  264.                 // 第一回合中算出行号
  265.                         switch (hangvalue)
  266.                         {
  267.                                 case 0x1F:
  268.                                                
  269.                                                
  270.                                        
  271.                                                                 keyvalue=14;
  272.                                        
  273.                                         break;
  274.                                 case 0x2F:
  275.                                                
  276.                                                
  277.                                                                 keyvalue=15;
  278.                                
  279.                                         break;
  280.                                 case 0x37:
  281.                                                
  282.                                                
  283.                                                                 keyvalue=16;
  284.                                        
  285.                                         break;
  286.                                 case 0x3B:
  287.                                                
  288.                                                
  289.                                                                 keyvalue=11;
  290.                                        
  291.                                         break;
  292.                                 case 0x3D:
  293.                                                
  294.                                                
  295.                                                                 keyvalue=12;
  296.                                                
  297.                                         break;
  298.                                 case 0x3E:
  299.                                                
  300.                                                
  301.                                                                 keyvalue=13;
  302.                                
  303.                                         break;
  304.                                 default: break;
  305.                                
  306.                         }
  307.                         Hang_Input();
  308.                         Lie_Output();
  309.                         delay_us(20);
  310.                        
  311.                         GPIO_ResetBits(GPIOE, GPIO_Pin_4 );
  312.                         GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_5);
  313.                        
  314.                        
  315.                        
  316.                         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  317.                         while (hangvalue != 0x3f)
  318.                         {
  319.                                
  320.                                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  321.                         }
  322.                         delay_ms(2);
  323.                         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  324.                         while (hangvalue != 0x3f)
  325.                         {
  326.                                
  327.                                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  328.                         }
  329.                         return keyvalue;
  330.                 }
  331.                
  332.         }
  333.         KEY_Init();
  334.         delay_us(20);
  335.         GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5);
  336.         GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
  337.                        
  338.        
  339.         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  340.         if (hangvalue != 0x3f)// 从IO口输入,读IO口
  341.         {
  342.         // 读出的不是0x0f说明有按键被按下
  343.         // 第1回合第2步:读出端口从读出值来判断是哪一行
  344.                 delay_ms(20);
  345.                 GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5);
  346.                 GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
  347.                
  348.                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  349.                 if (hangvalue != 0x3f)// 从IO口输入,读IO口
  350.                 {
  351.                         Hang_Output();
  352.                         Lie_Input();
  353.                         delay_us(20);
  354.                 // 第一回合中算出行号
  355.                         switch (hangvalue)
  356.                         {
  357.                                 case 0x1F:
  358.                                                
  359.                                                
  360.                                                
  361.                                                                 keyvalue=20;
  362.                                        
  363.                                         break;
  364.                                 case 0x2F:
  365.                                                
  366.                                                
  367.                                                                 keyvalue=21;
  368.                                        
  369.                                         break;
  370.                                 case 0x37:
  371.                                                
  372.                                                
  373.                                                                 keyvalue=22;
  374.                                                
  375.                                         break;
  376.                                 case 0x3B:
  377.                                                
  378.                                                
  379.                                                                 keyvalue=17;
  380.                                        
  381.                                         break;
  382.                                 case 0x3D:
  383.                                                
  384.                                                                 keyvalue=18;
  385.                                        
  386.                                         break;
  387.                                 case 0x3E:
  388.                                                
  389.                                                
  390.                                                                 keyvalue=19;
  391.                                                
  392.                                         break;
  393.                                 default: break;
  394.                                
  395.                         }
  396.                         Hang_Input();
  397.                         Lie_Output();
  398.                         delay_us(20);
  399.                         GPIO_SetBits(GPIOE,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5);
  400.                         GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
  401.                        
  402.                        
  403.                         hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  404.                         while (hangvalue != 0x3f)
  405.                         {
  406.                                
  407.                                 hangvalue=(GPIO_ReadInputData(GPIOE)&0x07)+((GPIO_ReadInputData(GPIOB)&0x0380)>>4);
  408.                         }
  409.                        
  410.                         return keyvalue;
  411.                 }
  412.                
  413.         }
  414.         return 0;
  415. }
输出模式都改成开漏了。大神帮我看看,那儿还有问题?谢谢!
gx_huang 发表于 2020-6-20 10:10 | 显示全部楼层
1、没看以前的代码,既然是OD输出,就不需要行列一会输出一会输入的,也不需要在按键判断过程中反复初始化。
   主要主程序中初始化了行是OD输出,列是输入即可,其它地方无需再次初始化。
  其它地方需要的操作就是行输出,读出列输入即可,不需要反复初始化。
2、代码和注释要一致,这是对自己的尊重,也是对别人的尊重。不要的代码删除掉,很多冗余代码。
   行已经输出0111了,延时后又输出0111,这是画蛇添足。
   已经得到了键值,又判断是否有按键,并延时,不知道啥目的。
gx_huang 发表于 2020-6-20 10:16 | 显示全部楼层
从逻辑上考虑,你这个程序不适合实时多任务,延时20毫秒,影响多少其它任务呀。
要考虑程序效率,按键扫描程序,要去掉所有行列初始化的代码。
平时所有行输出为0,进入按键程序,判断是否有列输入被拉低,没有立即退出,这样效率最高。
有列输入别拉低,才0111、1011、1101、1110依次行输出,判断列输入。
退出行列扫描程序,行输出0000,方便下次按键判断,或者中断唤醒。
你的程序,像女人的裹脚布呀。
gx_huang 发表于 2020-6-20 10:23 | 显示全部楼层
你本来行输出0111,中途又初始化了行列端口,还得分析行输出是否变化了,没有必要插入无关的、没有必要的代码。
难道你怕GPIO状态中途紊乱了,需要反复初始化?
gx_huang 发表于 2020-6-20 10:24 | 显示全部楼层
不同初始化代码,列输入,一会高阻输入一会上拉输入。
混乱不堪!
 楼主| Cjy_JDxy 发表于 2020-6-20 11:04 | 显示全部楼层
gx_huang 发表于 2020-6-20 10:10
1、没看以前的代码,既然是OD输出,就不需要行列一会输出一会输入的,也不需要在按键判断过程中反复初始化 ...

谢谢!
2.
我是一行一行判断的。
 楼主| Cjy_JDxy 发表于 2020-6-20 11:05 | 显示全部楼层
gx_huang 发表于 2020-6-20 10:16
从逻辑上考虑,你这个程序不适合实时多任务,延时20毫秒,影响多少其它任务呀。
要考虑程序效率,按键扫描 ...

我是菜鸟
一叶倾城wwq 发表于 2020-6-20 14:00 | 显示全部楼层
本帖最后由 一叶倾城wwq 于 2020-6-20 14:10 编辑

直接讨论思路就好了,周末实在看不了代码楼主用的中断法吗?没怎么看代码,建议分时查询就好了,有确定的输出行,检测列上的电平来判断键值,很清晰明了的思路,IO口也不用反复在输出和输入之间切换,我看这个原理图,你可以一行一行的调试先,代码逻辑出问题的话把多余的屏蔽掉,先一点点调

评论

惭愧,刚进论坛时也很受大家的帮助  发表于 2020-6-20 14:01
keaibukelian 发表于 2020-7-9 14:04 | 显示全部楼层
延时去抖是一个经验值?会不会不可靠
labasi 发表于 2020-7-9 14:04 | 显示全部楼层
讨论的非常热烈
paotangsan 发表于 2020-7-9 14:04 | 显示全部楼层
硬件去抖比较好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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