按键数码管显示复用后冲突问题

2020-01-23 14:42发布

用的51单片机,附电路图。

按键KEY与数码管COM端是复用的。

现在可以知道,把数码管的数据输出端设置为高阻输入。
按键即(COM)端,设置为标准IO口,可以检测到按键输入。

数码管显示时,
数码管的数据输出端设置为推挽输出。
按键即(COM)端,同时要设置为推挽才可以显示正常,

数码管显示用的是定时器中断显示。(6ms)。
按键在主循环,扫描输入(100ms)扫描1次。

用了按键程序,LED显示不正常。
用了LED显示程序,按键程序不正常。

不知道为什么?有没有人指一下点? KEY_COM.jpg (320.99 KB, 下载次数: 1) 下载附件 按键数码管复用电路 2013-5-15 08:40 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
46条回答
lmt50211
2020-01-24 10:58
void key_scan(void)
{
    P2IO &=0xe1;                          //*1110 0001*//

    delay(100);
    key_buf=0;                            //清按键值
    P1&=0x02;                             //关显示
    key_com=0;                            //开启按键公共端
    delay(100);

    if(key_2==0){key_buf|=0x01;}          //读按键1
    if(key_3==0){key_buf|=0x02;}          //读按键2
    if(key_4==0){key_buf|=0x04;}          //读按键3
    if(key_5==0){key_buf|=0x08;}          //读按键4

    P2IO |=0x1e;                          //*0001 1110*//
    key_com=1;                            //释放按键公共端

    if(key_buf==0)                        //无键
    {
        keyup_bit=0;                      //按键释放标志
        flash_not_bit=0;
        key_cnt_short=0;                  //清去抖计数
        key_cnt_long=0;                   //清长按计数
    }
    else                                  //有键处理
    {
        if(keyup_bit)                     //按键按下标志
        {
            if(++key_cnt_long>=200)        //长按 40->200
            {
                key_cnt_long-=50;         //4Hz   15->50
                flash_not_bit=1;          //快速调节不闪烁
                key_pro();                //按键处理
            }
            else
            {
                return;
            }
        }
        else                              //
        {
            if(++key_cnt_short>=20)       //去抖  5->20
            {
                key_cnt_short=0;
                keyup_bit=1;              //短按
                short_buz(1,short_buz_time);
                key_pro();
            }
        }
    }
}

一周热门 更多>