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

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 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
45条回答
xiaobendan001
1楼-- · 2020-01-24 06:08
扫描时间太长了吧,显示的时间也长,按键的时间也长
6MS*4=24MS了,也算可以吧
按键100MS就太长了,要是10次消抖动的话,岂不是1秒钟才能反应过来?
说一下我的设计习惯,把按键的COM接到一个IO上,每个按键串联二极管(防止两个同时按下时影响显示),在扫描显示输出的时候,读一下这个IO就行了,这样不用来回倒腾什么推挽啥的了,简单方便。我用的定时中断是2MS的,消抖动是计数10次有效,否则视为无效。
xiaobendan001
2楼-- · 2020-01-24 06:46
 精彩回答 2  元偷偷看……
lmt50211
3楼-- · 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();
            }
        }
    }
}
wenking99
4楼-- · 2020-01-24 16:27
这个是长短按键处理吧。
因为共阴极没有用三极管驱动,要点亮数码管,必须要设定公共端为推挽输出,数码管数据端也必须设定为推挽输出才能点亮。
其它方式都不行。

要按键检测也必须设定数码管数据端为高阻输入,数码管公共端,即按键检测端为标准IO,才可以检测到按键。
其它方式都不行。

所以上述程序为什么要先设定端口模式的原因。
wenking99
5楼-- · 2020-01-24 19:40
        while ( 1 )
        {
                WDT_action();//喂狗
                if ( g_time_5MS_Fg )//5ms数码管显示
                {
                        g_time_5MS_Fg = 0;
                        Display_Led();//LED显示程序不能跟下面Get_Key按键检测同时,用了数码管会闪,没有按键也会按下输出。
                        g_key_scan_count++;
                       
                        if ( g_key_scan_count >= 20 )//100ms
                        {
                                g_key_scan_count = 0;
                                //key = Get_Key ( );
                        }
                }
68336016
6楼-- · 2020-01-24 21:31
怎么不正常法?说来看看

我刚刚整了个140多个数码管,30多个按键,数据IO口复用的,显示跟按键扫描都很正常。

一周热门 更多>