CT107D蓝桥杯单片机学习笔记-独立按键BTN、矩阵键盘KBD

1,209 阅读2分钟

独立按键BTN

首先需要将跳帽接到BTN(BUTTON),我们理解到 S7、S6、S5、S4 分别对应单片机的 P30~P33 端口,那么我们就可以用独立按键来简单的控制Led灯。

截取部分代码:

while(1)
{
    if(S7 == 0)  
	{
		Delay10ms();  //延时消抖,下同
		if(S7 == 0)
		{
			P0 = 0xff;   //关闭全部的LED灯
			while(!S7);  //确定按键松开
		}
	}
	if(S6 == 0)
	{
		Delay10ms();
		if(S6 == 0)
		{		
		    P0 = 0x00;  //打开全部的LED灯
			while(!S6);
		}
	}
	if(S5 == 0)
	{
		Delay10ms();
		if(S5 == 0)
		{
			while(1)
			{
				num++;
				Delay1000ms();          //长按,1秒增加一个计数num
				LED_display(num);       //LED_display定义了显示num个LED灯
				if(S5 == 1)             //松开即断开循环
					break;
			}
			while(!S5);
		}	
	}
	if(S4 == 0)
	{
		Delay10ms();
		if(S4 == 0)
		{
			num++;
			LED_display(num); //增加一个灯
			while(!S4);
		}
	}
	number_display(num);
}

独立按键中我们只需要注意P30~P33是否有延时消抖以及是否能够确保松开

矩阵键盘KBD

首先需要将跳帽接到KBD(KEYBOARD),接着在编程中通过P30~P37进行“行扫描”和“列扫描”确定我们按下键的位置.

需要注意的是理解上的P36和P37并不存在,我们用P42以及P44分别代替了P36和P37。

截取部分代码:

void key_scan()
{
	temp = 0x0f; P42 = 0; P44 = 0;  //列扫描
	if(temp != 0x0f)
	{
		Delay10ms(); //10ms延时
		if(temp != 0x0f) 
		{
			switch(temp)
			{
				case 0x0e:      // 0000 1110   
					scan_num = 1;
					break;
				case 0x0d:      // 0000 1101  
					scan_num = 5;
					break;
				case 0x0eb:      // 0000 1011  
					scan_num = 9;
					break;
				case 0x07:      // 0000 0111  
					scan_num = 13;
					break;
			}
			
			temp = 0xf0; P42 = 1; P44 = 1; //行扫描
			if(P44 == 0)
				scan_num += 0;      //P44 代替 P37
			while(P44 == 0);
			if(P42 == 0)            //P42 代替 P36
				scan_num += 1;
			while(P42 == 0);
			if(temp == 0xd0)        //1101 0000
				scan_num += 2;
			while(temp == 0xd0);
			if(temp == 0xe0)        //1110 0000
				scan_num += 3;
			while(temp == 0xe0);
		}
	}
}

实质就是先确定Y轴,再确定X轴,我们用scan_num分别代表16个按键:

switch(scan_num)
	{
		case 1:         //按键S7
	                //按键操作
			break;      
		case 2:         //按键S11
                        //按键操作
			break;
		case 3:         //按键S15
                        //按键操作
			break;
		case 4:         //按键S19
                        //按键操作
			break;
			.
			.
			.
			
	}

我们用表格可以直观的展示:

0000 1110 0000 1101 0000 1011 0000 01111
P44 = 0 S7(1) S11(2) S15(3) S19(4)
P42 = 0 S6(5) S10(6) S14(7) S18(8)
1101 0000 S5(9) S9(10) S13(11) S17(12)
1110 0000 S4(13) S8(14) S2(15) S16(16)