zoukankan      html  css  js  c++  java
  • 【蓝桥杯单片机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();
            }
    }
  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/ALittleBee/p/8406372.html
Copyright © 2011-2022 走看看