[资料分享] 【蓝桥杯单片机05】独立按键的基本操作

[复制链接]
 楼主| ohy3686 发表于 2018-1-27 18:16 | 显示全部楼层 |阅读模式
【蓝桥杯单片机05】独立按键的基本操作
广东职业技术学院  欧浩源

    按键设计一般分为两种:独立按键和矩阵键盘。按键数量较少的用前者,按键数量较多的用后者。虽然两种设计都是操作按键,但是其键盘扫描方式和程序的设计思路是截然不同的。独立按键简单很多,矩阵键盘虽然复杂,只要掌握了本质思路,也没有什么困难之处。

1、独立按键的处理思路
    一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时候,只要扫描跟按键引脚相连的I/O端口,如果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有电磁干扰,也会使单片机的I/O端口产生低电平,这种干扰信号会让单片机误认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤掉,从而获得准确的按键状态信号。

2、单元实训题目
04-独立按键的基本操作.PNG

3、实现源码参考
  1. #include "reg52.h"  

  2. sbit HC138_A = P2^5;        
  3. sbit HC138_B = P2^6;        
  4. sbit HC138_C = P2^7;        

  5. sbit S7 = P3^0;        
  6. sbit S6 = P3^1;        
  7. sbit S5 = P3^2;        
  8. sbit S4 = P3^3;        

  9. unsigned char code SMG_NoDot[18] =
  10.     {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  11.      0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
  12.      0xbf,0x7f};

  13. void Delay(unsigned char t)
  14. {
  15.         while(t--);
  16. }

  17. void Init74HC138(unsigned char n)
  18. {
  19.         switch(n)
  20.         {
  21.                 case 4:
  22.                         HC138_A = 0;
  23.                         HC138_B = 0;
  24.                         HC138_C = 1;
  25.                         break;
  26.                 case 5:
  27.                         HC138_A = 1;
  28.                         HC138_B = 0;
  29.                         HC138_C = 1;
  30.                         break;
  31.                 case 6:
  32.                         HC138_A = 0;
  33.                         HC138_B = 1;
  34.                         HC138_C = 1;
  35.                         break;
  36.                 case 7:
  37.                         HC138_A = 1;
  38.                         HC138_B = 1;
  39.                         HC138_C = 1;
  40.                         break;
  41.                 case 8:
  42.                         HC138_A = 0;
  43.                         HC138_B = 0;
  44.                         HC138_C = 0;
  45.                         break;
  46.         }
  47. }

  48. void ShowKeyNum(unsigned char value)
  49. {
  50.         Init74HC138(6);
  51.         P0 = 0x01;
  52.         Init74HC138(7);
  53.         P0 = value;
  54. }

  55. void ScanKeys()
  56. {
  57.         if(S7 == 0)
  58.         {
  59.                 Delay(200);
  60.                 if(S7 == 0)
  61.                 {
  62.                         while(S7 == 0);
  63.                         ShowKeyNum(SMG_NoDot[1]);
  64.                 }
  65.         }
  66.         if(S6 == 0)
  67.         {
  68.                 Delay(200);
  69.                 if(S6 == 0)
  70.                 {
  71.                         while(S6 == 0);
  72.                         ShowKeyNum(SMG_NoDot[2]);
  73.                 }
  74.         }
  75.         if(S5 == 0)
  76.         {
  77.                 Delay(200);
  78.                 if(S5 == 0)
  79.                 {
  80.                         while(S5 == 0);
  81.                         ShowKeyNum(SMG_NoDot[3]);
  82.                 }
  83.         }
  84.         if(S4 == 0)
  85.         {
  86.                 Delay(200);
  87.                 if(S4 == 0)
  88.                 {
  89.                         while(S4 == 0);
  90.                         ShowKeyNum(SMG_NoDot[4]);
  91.                 }
  92.         }
  93. }
  94.                           
  95. void main()
  96. {
  97.         while(1)
  98.         {
  99.                 ScanKeys();
  100.         }
  101. }

评论

谢谢老师  发表于 2022-3-11 16:53
[url=home.php?mod=space&uid=2973972]@2573356463[/url] :你再看看  发表于 2022-3-11 16:52
[url=home.php?mod=space&uid=3183244]@刺客伍六七[/url] :这里的功能是松开按键数码管显示的数值才变化,S7==0说明S7按下了,所以一直在这里while循环,当按键松开,while(S7==0)循环条件不满足,所以执行下面的showkey  发表于 2021-3-31 00:32
[url=home.php?mod=space&uid=2973972]@2573356463[/url] :我觉得我不能理解while(S7 ==0),应该是while(S7 ==1)  发表于 2021-3-9 16:43
您好,我有一个疑惑,while(S7 == 0);这个语句是什么意思呀?如果我按下S7,按键扫描函数执行到判断S7被按下,然后进入while(S7 == 0);循环里,不断的执行空语句呀?,但是却会继续执行ShowKeyNum(SMG_NoDot[1]);语句。这是为什么呀?  发表于 2020-5-14 14:56
[url=home.php?mod=space&uid=3006548]@季冬[/url] :我知道了是跳帽没有换到23  发表于 2020-1-28 17:38
为什么我用这个程序下载到板子上没有反应呢  发表于 2020-1-26 20:32
山东电子小菜鸟 发表于 2018-1-28 11:40 | 显示全部楼层
感谢分享
一个拥抱 发表于 2018-3-20 16:35 | 显示全部楼层
楼主打算讲超声波的程序么
 楼主| ohy3686 发表于 2018-3-20 19:01 | 显示全部楼层
一个拥抱 发表于 2018-3-20 16:35
楼主打算讲超声波的程序么

现在开学了,没什么时间呀
一个拥抱 发表于 2018-3-22 21:40 | 显示全部楼层
ohy3686 发表于 2018-3-20 19:01
现在开学了,没什么时间呀

ok,谢谢
学无止境べ詹詹 发表于 2018-5-11 18:11 | 显示全部楼层
总结的真好啊
13068513785 发表于 2020-4-23 21:08 | 显示全部楼层
感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

3548

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