【蓝桥杯单片机组】(3)键盘

避免错误,一律选择矩阵键盘方式。

比赛用开发板不可使用按键触发外部中断的方式来检测按键

P.S :使用IAP15转接板后,单片机P4.2代替P3.6,P4.4代替P3.7

sfr P4 = 0xc0;
sbit p36replace = P4^2;
sbit p37replace = P4^4;


编程步骤:

(1)将4条列线中的第一条置为0

(2)读行线

(3)判断行线中是否存在为0的行

(4)若存在,则有按键按下, 消抖

(5)读行线,判断是否有行线被置为0,若有,判断哪条行线被置为0,

(6)switch case 匹配行线

(7)(1)++

程序:


char liecode[4] = {0x7f, 0xbf, 0xdf, 0xef};
sfr P4 = 0xc0;
sbit p36replace = P4^2;
sbit p37replace = P4^4;
sfr AUXR = 0x8E;
int keycheck()
{

	char temp,value;
	int a;
	for(a=0;a<4;a++)
	{
		if(a == 0)
		{
			p37replace = 0;
			p36replace = 1;
			P3 = liecode[a];	
		}
		if(a == 1)
		{
			p37replace = 1;
			p36replace = 0;
			P3 = liecode[a];
		}
		
		if(a>1)
		{
			P3 = liecode[a];	//set P35.4=0
		}
		temp = P3;
		value = temp & 0x0f;	//check hang
		if(value != 0x0f)	//a key in this lie has been pressed
		{
			delayms(10);
			temp = P3;
			value = temp & 0x0f;	//check hang
			if(value != 0x0f)
			{
				if(value == 0x07)
				{
					key = 1;

					switch (a)
					{
						case 0:	key += 0;  break;	 
						case 1:	key += 4; break;
						case 2:	key += 8; break;
						case 3:	key += 12; break;
					}
					while((P3 & 0x0f) != 0x0f);
					return key;
				}
				if(value == 0x0b)
				{
					key = 2;
					switch (a)
					{
						case 0:	key += 0; break;
						case 1:	key += 4; break;
						case 2:	key += 8; break;
						case 3:	key += 12; break;
					}
					while((P3 & 0x0f) != 0x0f);
					return key;
				}
				if(value == 0x0d)
				{
					key = 3;
					switch (a)
					{
						case 0:	key += 0; break;
						case 1:	key += 4; break;
						case 2:	key += 8; break;
						case 3:	key += 12; break;
					}
					while((P3 & 0x0f) != 0x0f);
					return key;
				}
				if(value == 0x0e)
				{
					key = 4;
					switch (a)
					{
						case 0:	key += 0; break;
						case 1:	key += 4; break;
						case 2:	key += 8; break;
						case 3:	key += 12; break;
					}
					while((P3 & 0x0f) != 0x0f);
					return key;
				}

			}
		}
	}
			return key;
}
若keycheck()置于主程序,需要放在while(1)中,若置于中断中:

void main()
{

	cls_buzz();
	t0_init();

	while(1)
	{
	   display(value);	
		
	}

}

void t0_interpt() interrupt 1
{

	EA = 0;
//	TH0 = (65536-45872)/256;		//设置定时初值
//	TL0 = (65536-45872)%256;		//设置定时初值
	TL0 = 0xCD;	
	TH0 = 0xD4;
    value = keycheck();
	EA = 1;
	
}




你可能感兴趣的:(蓝桥杯单片机组)