用的51单片机,附电路图。
按键KEY与数码管COM端是复用的。
现在可以知道,把数码管的数据输出端设置为高阻输入。
按键即(COM)端,设置为标准IO口,可以检测到按键输入。
数码管显示时,
数码管的数据输出端设置为推挽输出。
按键即(COM)端,同时要设置为推挽才可以显示正常,
数码管显示用的是定时器中断显示。(6ms)。
按键在主循环,扫描输入(100ms)扫描1次。
用了按键程序,LED显示不正常。
用了LED显示程序,按键程序不正常。
不知道为什么?有没有人指一下点?
KEY_COM.jpg (320.99 KB, 下载次数: 1)
下载附件
按键数码管复用电路
2013-5-15 08:40 上传
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;
}
如果只调试按键部分,很奇怪,为什么把后面注释部分加上去,按键都检测不到了。
扫描的时候,开始时不是都已经重新赋值了吗?
不明白怎么回事,高手指点。
哎呀呀,把电路改成这样吧
定时器一直开着;
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 ( );
}
}
接下来,消抖,按下,弹开,长按,多按键,都是原来的思路
一周热门 更多>