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

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-23 19:09
没有人看,自己顶一下
lxa0
2楼-- · 2020-01-23 20:22
显示的时候不要扫描键盘
summarize
3楼-- · 2020-01-23 23:13
 精彩回答 2  元偷偷看……
wenking99
4楼-- · 2020-01-24 02:13
这个电路不需要同时按下两个按键的。
按键的时候,我已经把定时器关闭了的。

void Display_Led ( void )
{
        Byte idata value;
       
        g_byLedCount++;
        if(g_byLedCount >= 4)                                                //重新开始
        {
                g_byLedCount = 0;
        }       
        value = Display_Tab[g_DisplayBuff[g_byLedCount]];       

       
        P1M0 &= ~0xfc;        //数据端设置推挽输出
        P1M1 |= 0xfc;          
        P2M0 &= ~0x06;          //数据端设置推挽输出
        P2M1 |= 0x06;   
       
        P2M1 |= 0x20;         //公共端设置推挽输出
        P3M1 |= 0x1c;
       
        P16 = (bit) (value & 0x80);
        P21 = (bit) (value & 0x40);
        P13 = (bit) (value & 0x20);
        P14 = (bit) (value & 0x10);
        P15 = (bit) (value & 0x08);
        P17 = (bit) (value & 0x04);
        P12 = (bit) (value & 0x02);
        P22 = (bit) (value & 0x01);

        switch(g_byLedCount)//循环扫描
        {       
                case 0:
                {               
                        COM1 = 0;
                        COM2 = 1;
                        COM3 = 1;
                        COM4 = 1;
                } break;
               
                case 1:
                {
                        COM1 = 1;
                        COM2 = 0;
                        COM3 = 1;
                        COM4 = 1;
                } break;                       
                case 2:
                {
                        COM1 = 1;
                        COM2 = 1;
                        COM3 = 0;
                        COM4 = 1;
                } break;               
                case 3:
                {
                        COM1 = 1;
                        COM2 = 1;
                        COM3 = 1;
                        COM4 = 0;
                } break;
               
                default : break;
        }
}

Byte Get_Key ( void )
{
        BYTE byKey = 0;

       ET0 = 0;                //关闭中断(即关闭led扫描)
  
        P1M0 |= 0xfc;   //按键时,数据端高阻输入
        P1M1 &= ~0xfc;       
        P2M0 |= 0x06;   //按键时,数据端高阻输入
        P2M1 &= ~0x06;
       
        P2M1 &= ~0x20;        //按键时,公共端标准IO口
        P3M1 &= ~0x1c;
       
        if ( KEY_MENU == 0 )//是否按键了。
        {
                 byKey = 1;
                 goto  KEY_EXIT;
        }
        if ( KEY_UP == 0 ) //是否按键了。
        {
                 byKey = 2;
                 goto  KEY_EXIT;
        }
        if ( KEY_DOWN == 0 )//是否按键了。
        {
                 byKey = 3;
                 goto  KEY_EXIT;
        }
        if ( KEY_ENTER == 0 )//是否按键了。
        {
                 byKey = 4;
        }

KEY_EXIT:               
        ET0 = 1;                                             //打开扫描显示

        return byKey;
}

按理说,扫描和按键,我都是重新设定端口方向的。为什么还是会相互有影响?
zjk
5楼-- · 2020-01-24 03:28
貌似这样不行吧,用个74hc595试试啊
wenking99
6楼-- · 2020-01-24 05:27
硬件是这样做的,别人这样用可以。

一周热门 更多>