51单片机之按键扫描
描述:KEIL5编程,AT89C52单片机通过按键输入控制数码管显示该按键数值。
硬件:
电路仿真图(未运行)


电路仿真(运行)

程序:
按键扫描:控制每一行低电平,然后按下按键判断按键按下的行数以及按键列数,最后算出值。



#include <REGX52.H>
unsigned int Timer_Cnt = 0;
unsigned char code Digital_buff[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80 ,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned int Key_Num = 0; //°´¼üÊýÖµ
unsigned int Key_Flag = 0; //°´¼ü±êÖ¾Î>>
sbit key_row1 = P1^0;
sbit key_row2 = P1^1;
sbit key_row3 = P1^2;
sbit key_row4 = P1^3;
sbit key_col1 = P1^4;
sbit key_col2 = P1^5;
sbit key_col3 = P1^6;
sbit key_col4 = P1^7;
void Key_Scan()//°´¼üË¢ÐÂ
{
static unsigned char i=0;
++i;
i %= 4;
switch(i)//Ë¢ÐÂÐÐ
{
case 0:key_row1 = 0;key_row2 = 1;key_row3 = 1;key_row4 = 1;break;
case 1:key_row1 = 1;key_row2 = 0;key_row3 = 1;key_row4 = 1;break;
case 2:key_row1 = 1;key_row2 = 1;key_row3 = 0;key_row4 = 1;break;
case 3:key_row1 = 1;key_row2 = 1;key_row3 = 1;key_row4 = 0;break;
default:break;
}
if((key_col4 == 0)&&(Key_Flag == 0))//ÒÀ´ÎÅжϰ´¼üÊÇ·ñ°´ÏÂ
{
Key_Num = i*4;
Key_Flag = 1;
}
else if((key_col3 == 0)&&(Key_Flag == 0))
{
Key_Num = (i*4)+1;
Key_Flag = 1;
}
else if((key_col2 == 0)&&(Key_Flag == 0))
{
Key_Num = (i*4)+2;
Key_Flag = 1;
}
else if((key_col1 == 0)&&(Key_Flag == 0))
{
Key_Num = (i*4)+3;
Key_Flag = 1;
}//È·¶¨°´¼ü̧Æð
else if((key_col4 == 1||key_col3 == 1||key_col2 == 1||key_col1 == 1)&&Key_Flag == 1)
{
Key_Flag = 0;
}
}
void main()
{
P2 = Digital_buff[0];
while(1)
{
Key_Scan();
P2 = Digital_buff[Key_Num];
}
}