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

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条回答
wenking99
1楼-- · 2020-01-25 03:14
 精彩回答 2  元偷偷看……
wenking99
2楼-- · 2020-01-25 05:20
我现在单独用按键测试

Byte Get_Key ( void )
{
        BYTE byKey = 0;

        P1M0 |= 0xfc;    //数码管数据端高阻输入
        P1M1 &= ~0xfc;       
        P2M0 |= 0x06;   ///数码管数据端高阻输入
        P2M1 &= ~0x06;               

        P2M0 &= ~0x20;;        //数码管公共端设置为标准IO口,即按键输入端
        P2M1 &= ~0x20
        P3M0 &= ~0x1c;                //数码管公共端设置为标准IO口,即按键输入端
        P3M1 &= ~0x1c;
        P2 |= 0X20;              //设置按键输入引脚为高电平
        P3 |= 0X1C;             //设置按键输入引脚为高电平
       
        if ( P25 == 0 )//KEY_MENU按键按下
        {
              UartSendByte(1);        //测试
              byKey = 1;
        }

        //恢复推挽输出
        //P1M0 &= ~0xfc;        //数码管数据端设置为推挽输出
        //P1M1 |= 0xfc;          
        //P2M0 &= ~0x06; //数码管数据端设置为推挽输出
        //P2M1 |= 0x06;          

        //P2M0 &= ~0x20;
        //P2M1 |= 0x20;   //数码管公共端设置为推挽输出
        //P3M0 &= ~0x1c;
        //P3M1 |= 0x1c;    //数码管公共端设置为推挽输出

        return byKey;
}

如果只调试按键部分,很奇怪,为什么把后面注释部分加上去,按键都检测不到了。
扫描的时候,开始时不是都已经重新赋值了吗?

不明白怎么回事,高手指点。
xiaowu191
3楼-- · 2020-01-25 08:20
https://www.amobbs.com/forum.php?mod=attachment&aid=MTEyNzkzfDdhMjJlMzBjYjAzMzViNTI1MGZkMzBkYTViN2QyYzMyfDE1Nzg4MTAwMzE%3D&request=yes&_f=.png

哎呀呀,把电路改成这样吧
xiaowu191
4楼-- · 2020-01-25 12:49
key_int任意姐一个IO口吧

定时器一直开着;

while ( 1 )
        {
                WDT_action();//喂狗
                if ( g_time_5MS_Fg )//5ms数码管显示
                {
                        g_time_5MS_Fg = 0;
                                               
                                                ////读按键
                                                if(!key_io)
                                                {
                                                        key_value |= (0x01 << g_byLedCount);
                                                }
                                                else
                                                {
                                                        key_value &= ~(0x01 << g_byLedCount);
                                                }
                                               
                        Display_Led();//LED显示程序不能跟下面Get_Key按键检测同时,用了数码管会闪,没有按键也会按下输出。
                        g_key_scan_count++;
                       
                        if ( g_key_scan_count >= 20 )//100ms
                        {
                                g_key_scan_count = 0;
                                //key = Get_Key ( );
                        }
                }

接下来,消抖,按下,弹开,长按,多按键,都是原来的思路
bbssilverkey
5楼-- · 2020-01-25 13:15
ADC采集按键,轻松又愉快,想多少就搞多少
wenking99
6楼-- · 2020-01-25 17:18
 精彩回答 2  元偷偷看……

一周热门 更多>