找回密码
 立即注册
首页 业界区 安全 独立按键的扫描

独立按键的扫描

兜蛇 2025-6-9 13:44:47
电路原理分析

按键部分[以使用K9\K10\K11\K12为例]

1.png

首先,将 KeyOut3 置 0 ,其他三条分路[KeyOut1、KeyOut2、KeyOut4]置1,此时, KeyOut3 分路的按键 K9\K10\K11\K12 作为 4 个独立按键处理
将此 4 个按键的状态直接送给小灯,即可控制小灯的亮灭:
按下 K9 ,此时 KeyIn1 变为 0
按下 K10 ,此时 KeyIn2 变为 0
按下 K11 ,此时 KeyIn3 变为 0
按下 K12 ,此时 KeyIn4 变为 0
小灯部分

小灯部分的电路原理分析详见https://www.cnblogs.com/EricsT/p/18442768
以下做简单概要
2.png

P1.4 置 0,即 ENLED 置0
在下图中将跳线连接在显示译码部分,即 ADDR0 与 P1.0 连线,ADDR1 与 P1.1 连线,ADDR2 与 P1.2 连线,ADDR3 与 P1.3 连线
P1.3 置 1,即 ADDR3 置1
3.png

通过以上使能下图的U3[74HC138]芯片
P1.0 置 0,即 ADDR0 置 0
P1.1 置 1,即 ADDR1 置 1
P1.2 置 1,即 ADDR2 置 1
4.png

通过以上,则U3芯片 A2 置 1,A1 置 1,A0 置 0,查询下图真值表可知 LEDS6 为 0
5.png

通过以上,下图中的Q16[9012]三极管导通,此时,只要DBX为0,则小灯就被点亮
6.png

即小灯被点亮:P1.0 = 0; P1.1 = 1; P1.2 = 1; P1.3 = 1; P1.4 = 0;
综合分析

KeyOut3 置 0,即 P2.1 置 0
P1.0 = 0; P1.1 = 1; P1.2 = 1; P1.3 = 1; P1.4 = 0; P2.1 = 0;其余为默认值
将 KeyIn1 的值给 DB7 ,则 K9 的状态控制 LED9 的状态
将 KeyIn2 的值给 DB6 ,则 K10 的状态控制 LED8 的状态
将 KeyIn3 的值给 DB5 ,则 K11 的状态控制 LED7 的状态
将 KeyIn4 的值给 DB4 ,则 K12 的状态控制 LED6 的状态
代码实现
  1. #include <reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. sbit LED9 = P0 ^ 7;
  8. sbit LED8 = P0 ^ 6;
  9. sbit LED7 = P0 ^ 5;
  10. sbit LED6 = P0 ^ 4;
  11. sbit KeyIn4 = P2 ^ 7;
  12. sbit KeyIn3 = P2 ^ 6;
  13. sbit KeyIn2 = P2 ^ 5;
  14. sbit KeyIn1 = P2 ^ 4;
  15. void main(void)
  16. {
  17.     //使能U3[74HC138]芯片
  18.     ADDR3 = 1;
  19.     ENLED = 0;
  20.    
  21.     // LEDS6 为 0
  22.     ADDR0 = 0;
  23.     ADDR1 = 1;
  24.     ADDR2 = 1;
  25.    
  26.     //keyOut3 为0,其他均为1
  27.     P2 = 0xFD;
  28.    
  29.     while (1)
  30.     {
  31.         LED9 = KeyIn1;//K9控制LED9
  32.         LED8 = KeyIn2;//K10控制LED8
  33.         LED7 = KeyIn3;//K11控制LED7
  34.         LED6 = KeyIn4;//K12控制LED6
  35.     }
  36. }
复制代码
电路原理分析

数码管部分

7.png

LEDS2为低电平,Q14导通,数码管可使用
数码管电路以及真值表内容详见https://www.cnblogs.com/EricsT/p/18460817
代码部分
  1. #include <reg52.h>
  2. sbit ADDR0 = P1 ^ 0;
  3. sbit ADDR1 = P1 ^ 1;
  4. sbit ADDR2 = P1 ^ 2;
  5. sbit ADDR3 = P1 ^ 3;
  6. sbit ENLED = P1 ^ 4;
  7. sbit KeyIn4 = P2 ^ 7;
  8. unsigned char code LedChar[] =//数码管显示字符转换表
  9. {
  10.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  11.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  12. };
  13. void main(void)
  14. {
  15.         bit backup = 1;//定义一个位变量,保存前一次扫描的按键值
  16.         unsigned char cnt = 0;//定义一个计数变量,记录按下的次数
  17.         ENLED = 0;//选择数码管DS3进行显示
  18.         ADDR3 = 1;
  19.         ADDR2 = 0;
  20.         ADDR1 = 1;
  21.         ADDR0 = 0;
  22.         P2 = 0xF7;//P2.3置0,即keyOut1输出低电平
  23.         P0 = LedChar[cnt];//显示按键次数初值
  24.         while (1)
  25.         {
  26.                 if (backup != KeyIn4)//当前值与前次值不相等说明此时按键有动作
  27.                 {
  28.                         if (0 == backup)//如果前次值为0,则说明当前由0变1,即按键弹起
  29.                         {
  30.                                 cnt++;//按键次数+1
  31.                                 if (cnt >= 10)//只用一个数码管显示,所以加到10就清零重新开始
  32.                                         cnt = 0;
  33.                                 P0 = LedChar[cnt];
  34.                         }
  35.                         backup = KeyIn4;//更新备份为当前值,以备进行下次比较
  36.                 }
  37.         }
  38. }
复制代码
 bit51单片机特有的变量类型,bit型是1位数据,只占用一个位(bit)的内存,用法和其他的基本数据类型一样。优点:节省内存空间,8个bit变量才相当于一个char变量所占用的空间。只有0和1两个值
以上代码实现的主要功能:在按下按键后弹起的过程中,数码管会显示按键弹起次数,当按键弹起10次数码管会变成0,重新开始计数,按下的时候,不作任何处理

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册