单片机 单个按键和两个按键同时按下 检测实现

两个按键 Key1和Key2,三个按键实现三种功能

  1. Key1单独按下
  2. Key2单独按下
  3. Key1和Key2同时按下

if(Key1 == 0)  
{  
    __delay_ms(TWOKEY_DELAY);       //两个按键按下的时间差,要小于这个延时,否则判断为单个按键按下
    if(Key1 == 0)  
    {  
        if(Key2 == 0)  
        {  
            function_Press2Keys();  //两个按键同时按下执行函数  
            while(Key2 == 0); //松手检测  
        }  
        else   
        {  
            function_Key1();  //Key1单独按下执行函数
            while(Key1 == 0); //松手检测  
        }  
    }  
}  

if(Key2 == 0)
{
    __delay_ms(TWOKEY_DELAY);       //两个按键按下的时间差,要小于这个延时,否则判断为单个按键按下 
    if(Key2 == 0 )
    {
        if(Key1 == 0)
        {
            function_Press2Keys();  //两个按键同时按下执行函数  
            while(Key1 == 0); //松手检测  
        }
        else 
        {
            function_Key2();  //Key2单独按下执行函数
            while(Key2 == 0); //松手检测
        }
    }
    else;
}    

在嵌入式系统中,使用单个按键控制两位数码管显示是一个常见的应用场景。下面是一个基本的实现思路步骤: ### 实现思路 1. **硬件连接**: - 将单个按键连接到单片机的某个输入引脚(例如,P3.2)。 - 将两位数码管的段选引脚(a-gdp)连接到单片机的输出引脚。 - 将两位数码管的位选引脚(位1位2)连接到单片机的输出引脚。 2. **软件设计**: - 初始化单片机的I/O口。 - 编写按键扫描函数,检测按键的按下释放。 - 编写数码管显示函数,控制两位数码管的显示内容。 - 在主循环中,根据按键的按下次数更新数码管的显示内容。 ### 代码示例 ```c #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit KEY = P3^2; // 按键连接到P3.2 sbit DIGIT1 = P2^0; // 数码管位选1 sbit DIGIT2 = P2^1; // 数码管位选2 uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管0-9的段选码 void Delay(uint ms) { uint i, j; for(i = ms; i > 0; i--) for(j = 110; j > 0; j--); } uchar Key_Scan() { if(KEY == 0) { Delay(10); // 消抖 if(KEY == 0) { while(KEY == 0); // 等待按键释放 return 1; } } return 0; } void Display(uchar num) { uchar tens = num / 10; uchar units = num % 10; DIGIT1 = 0; // 选择位1 P0 = table[tens]; Delay(5); DIGIT1 = 1; // 关闭位1 DIGIT2 = 0; // 选择位2 P0 = table[units]; Delay(5); DIGIT2 = 1; // 关闭位2 } void main() { uchar count = 0; while(1) { if(Key_Scan()) { count++; if(count > 99) { count = 0; } } Display(count); } } ``` ### 说明 - **按键扫描**:通过检测按键引脚的电平变化来判断按键是否被按下,并进行简单的消抖处理。 - **数码管显示**:将两位数码管的显示内容分解为十位个位,分别控制段选位选引脚。 - **主循环**:在主循环中,根据按键的按下次数更新数码管的显示内容。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值