• 【蓝桥杯单片机05】独立按键的基本操作


    【蓝桥杯单片机05】独立按键的基本操作
    广东职业技术学院 欧浩源

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

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

    2、单元实训题目

    3、实现源码参考

    #include "reg52.h"  
    
    sbit HC138_A = P2^5;        
    sbit HC138_B = P2^6;        
    sbit HC138_C = P2^7;        
    
    sbit S7 = P3^0;        
    sbit S6 = P3^1;        
    sbit S5 = P3^2;        
    sbit S4 = P3^3;        
    
    unsigned char code SMG_NoDot[18] = 
        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
         0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
         0xbf,0x7f};
    
    void Delay(unsigned char t)
    {
            while(t--);
    }
    
    void Init74HC138(unsigned char n)
    {
            switch(n)
            {
                    case 4:
                            HC138_A = 0;
                            HC138_B = 0;
                            HC138_C = 1;
                            break;
                    case 5:
                            HC138_A = 1;
                            HC138_B = 0;
                            HC138_C = 1;
                            break;
                    case 6:
                            HC138_A = 0;
                            HC138_B = 1;
                            HC138_C = 1;
                            break;
                    case 7:
                            HC138_A = 1;
                            HC138_B = 1;
                            HC138_C = 1;
                            break;
                    case 8:
                            HC138_A = 0;
                            HC138_B = 0;
                            HC138_C = 0;
                            break;
            }
    }
    
    void ShowKeyNum(unsigned char value)
    {
            Init74HC138(6);
            P0 = 0x01;
            Init74HC138(7);
            P0 = value;
    }
    
    void ScanKeys()
    {
            if(S7 == 0)
            {
                    Delay(200);
                    if(S7 == 0)
                    {
                            while(S7 == 0);
                            ShowKeyNum(SMG_NoDot[1]);
                    }
            }
            if(S6 == 0)
            {
                    Delay(200);
                    if(S6 == 0)
                    {
                            while(S6 == 0);
                            ShowKeyNum(SMG_NoDot[2]);
                    }
            }
            if(S5 == 0)
            {
                    Delay(200);
                    if(S5 == 0)
                    {
                            while(S5 == 0);
                            ShowKeyNum(SMG_NoDot[3]);
                    }
            }
            if(S4 == 0)
            {
                    Delay(200);
                    if(S4 == 0)
                    {
                            while(S4 == 0);
                            ShowKeyNum(SMG_NoDot[4]);
                    }
            }
    }
                              
    void main()
    {
            while(1)
            {
                    ScanKeys();
            }
    }
  • 相关阅读:
    数论基础(维诺格拉多夫著,裘光明译) 勘误
    微观经济学现代观点(Hal R. Varian) 复习题 1.1
    微分学里的中值定理
    数论基础(维诺格拉多夫著,裘光明译) 勘误
    分数的一种分拆方法
    C++正则表达式的初步使用
    如何用消息系统避免分布式事务
    阿里云表格存储全面升级,打造一站式物联网存储新方案
    探究 Java 应用的启动速度优化
    技术干货|基于Apache Hudi 的CDC数据入湖「内附干货PPT下载渠道」
  • 原文地址:https://www.cnblogs.com/ALittleBee/p/8406372.html
Copyright © 2020-2023  润新知