用的51单片机,附电路图。
按键KEY与数码管COM端是复用的。
现在可以知道,把数码管的数据输出端设置为高阻输入。
按键即(COM)端,设置为标准IO口,可以检测到按键输入。
数码管显示时,
数码管的数据输出端设置为推挽输出。
按键即(COM)端,同时要设置为推挽才可以显示正常,
数码管显示用的是定时器中断显示。(6ms)。
按键在主循环,扫描输入(100ms)扫描1次。
用了按键程序,LED显示不正常。
用了LED显示程序,按键程序不正常。
不知道为什么?有没有人指一下点?
KEY_COM.jpg (320.99 KB, 下载次数: 1)
下载附件
按键数码管复用电路
2013-5-15 08:40 上传
按键的时候,我已经把定时器关闭了的。
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;
}
按理说,扫描和按键,我都是重新设定端口方向的。为什么还是会相互有影响?
一周热门 更多>