找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1201|回复: 7
收起左侧

求大神帮我解决一下这个问题,关于单片机按键的 有两个开关a和b,和一个变量c

[复制链接]
ID:980515 发表于 2021-11-13 04:06 | 显示全部楼层 |阅读模式
有两个开关a和b,和一个变量c,a,b按下是都是低电平
如果a先按下,b再按下,执行c++
如果b先按下,a再按下,执行c--

回复

使用道具 举报

ID:980515 发表于 2021-11-13 04:08 | 显示全部楼层
如果可以的话,求一个程序,这个琢磨了好几天就是不行
回复

使用道具 举报

ID:161164 发表于 2021-11-13 20:16 来自手机 | 显示全部楼层
当a先按下,b再按下时,a需不需要保持? 如不需要,按a再按b的最久间格是多久?
回复

使用道具 举报

ID:624769 发表于 2021-11-13 20:39 | 显示全部楼层
荷包蛋PPL 发表于 2021-11-13 04:08
如果可以的话,求一个程序,这个琢磨了好几天就是不行

你要先定一个规则,
1) 单独按下 A 或 B 算不算 按键了?
2) 1算得话, 那么单独按下多久之内 按下另一个才算组合?
3) 2成立的话, 那么如果 超时,比如A按下,一直没有按B 算A按下了,那么这个时候B又按下了,到底是组合键忽略? A的结果放弃,组合键成立? 还是 A 也成立, 组合键也成立,算两次按键?  还是说算 A, B 各一次?

然后,按照放手顺序 也要考虑这些问题。

最好,先用笔画一个流程图, 如果,那么, 否则,  各种情况考虑一下,定个规则。不然设计出来的按键很可能不按你想得方式动作。(当然,按下后 while 傻等,可以避免这些意外情况,那么你也考虑,是否使用while 傻等这种方式)
回复

使用道具 举报

ID:980515 发表于 2021-11-14 08:01 来自手机 | 显示全部楼层
188610329 发表于 2021-11-13 20:39
你要先定一个规则,
1) 单独按下 A 或 B 算不算 按键了?
2) 1算得话, 那么单独按下多久之内 按下另 ...

感谢提醒 我弄好了
回复

使用道具 举报

ID:213173 发表于 2021-11-14 11:05 | 显示全部楼层
给你写个示例,理解后可以发挥各种应用场景。也可以用于旋转编码器。
无标题.jpg

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit key_A = P3^0;
  5. sbit key_B = P3^1;
  6. uchar code table[]={//共阴数码管段码"0~f"
  7. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar num;
  10. uchar sign;
  11. bit flag1,flag2;

  12. void key_scan()
  13. {
  14.         static uchar count;

  15.         if(!key_A||!key_B)//任意按键按下
  16.         {
  17.                 if(++count>=100)//消抖
  18.                 {
  19.                         count=0;
  20.                         if(!key_A && key_B && !flag1)//判断谁先按下
  21.                         {
  22.                                 flag1=1;                                                //状态标志1
  23.                                 sign=1;
  24.        
  25.                         }
  26.                         if(!key_B && key_A && !flag1)//判断谁先按下
  27.                         {
  28.                                 flag1=1;                                                //状态标志1
  29.                                 sign=2;
  30.                         }
  31.                         if(!key_B && !key_A && flag1 && !flag2)//两个按键先后都按下
  32.                         {
  33.                                 flag2=1;                                                        //状态标志2
  34.                                 switch(sign)
  35.                                 {
  36.                                         case 1: if(num<9)num++; break;
  37.                                         case 2: if(num>0)num--; break;
  38.                                 }
  39.                         }
  40.                 }
  41.         }
  42.         else
  43.         {
  44.                 if(flag1==1)//按下一个中途抬起或结束按键都抬起
  45.                 {
  46.                         sign=0;//复位
  47.                         flag1=0;//复位
  48.                         flag2=0;//复位
  49.                 }
  50.                 count=0;//复位
  51.         }
  52. }

  53. void main()
  54. {         
  55.         while(1)
  56.         {
  57.                 key_scan();
  58.                 P2=table[num];
  59.         }
  60. }
复制代码



回复

使用道具 举报

ID:980515 发表于 2021-11-14 17:53 来自手机 | 显示全部楼层
wulin 发表于 2021-11-14 11:05
给你写个示例,理解后可以发挥各种应用场景。也可以用于旋转编码器。

感谢大神
回复

使用道具 举报

ID:824490 发表于 2021-11-15 08:59 | 显示全部楼层
这个逻辑 就是EC11的,可以借来用用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表