蓝桥杯单片机学习(Day13 矩阵键盘 )

现象:

            按键S7、S11、S15、S19数码管显示00-03
            按键S6、S10、S14、S18数码管显示04-07
            按键S5、S9、S13、S17数码管显示08-11
            按键S4、S8、S12、S16数码管显示12-15

矩阵键盘介绍:

        注意:J5接KBD矩阵键盘

        矩阵键盘就是4×4,一共16个按键。其工作原理是:一个按键周围有四个引脚,其中两个短接了有着上电时的电平,这时另外两个也有着相同的电平,但是由于键帽没有按下故而没有连通,检测原理是键帽按下时该两个引脚连通电平与两外两个引脚相同,检测按下。

        按键检测原理 :

 如图,因为每一时刻只能检测到一个按键,且每个引脚检测着四个键帽的按下与否,所以我们可以列坐标穷举。

        按键检测:

//行定义
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
//列定义
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;

void key_board()
{
    //第一行
    R1=0;
    R2=R3=R4=1;
    C1=C2=C3=C4=1;
    if(C1==0) //(1,1)
    {
        while(C1==0)  //等待按键松开
        key_value=0;
    }
    else if(C2==0)  //(1,2)
    {
        while(C2==0);
        key_value=1;
    }
    else if(C3==0)  //(1,3)
    {
        while(C3==0);
        key_value=2;
    }

    else if(C4==0)  //(1,4)
    {
        while(C4==0);
        key_value=3;
    }

    //第二行......依此类推

        完整代码:

#include <STC15F2K60S2.H>

//行定义
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
//列定义
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;


code unsigned char tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xFF};
unsigned char buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; //段选
unsigned char key_value=0xff;  //键值
bit flag;
void key_board();
void display();
//关闭蜂鸣器
void cls_buzz()
{
	P2=(P2&0x1f)|0xa0;
	P0=0x00;
	P2&=0x1f;
}
//关闭led
void cls_led()
{
	P2=(P2&0x1f)|0x80;
	P0=0xff;
	P2&=0x1f;
}
//定时器初始化+开启中断
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}

//主函数
void main()
{
	Timer0Init();
	cls_buzz();
	cls_led();
	while(1)
	{
		if(flag)
		{
			flag=0;
			key_board();
			if(key_value!=0xff)
			{
				buf[6]=key_value/10;
				buf[7]=key_value%10;
			}
		}
	}
}

//中断服务函数
void Timer0_Proc() interrupt 1
{
	static unsigned char ms;
	if(++ms==10)
	{
		flag=1;
		ms=0;
	}
	display();
}

//另外一种方法
//矩阵键盘
//void key_board()
//{
//	static unsigned char hang;
//	static unsigned char key_flag=0;
//	switch(key_flag)
//	{
//		case 0:
//		{
//			
//			P3=0x0f;
//			P42=0;
//			P44=0;
//			 //初始状态
//			if(P3!=0x0f)  //有按键按下
//				key_flag=1;
//		}
//		break;
//		case 1:  //1 进入行处理
//		{
//			P3=0x0f;
//			P42=0;
//			P44=0;
//			if(P3!=0x0f)  //有按键按下
//			{
//				if(P30==0){hang=1;}
//				else if(P31==0){hang=2;}
//				else if(P32==0){hang=3;}
//				else if(P33==0){hang=4;}  //检测在哪行按下
//				switch(hang)  //进入列处理
//				{
//					case 1:
//					{
//						P3=0xf0;  //P34属于高四位了 所以是P3=0xf0;
//						P42=1;  //进入列处理赋值1
//						P44=1;
//						if(P44==0){key_value=0;key_flag=2;}
//						else if(P42==0){key_value=1;key_flag=2;}
//						else if(P35==0){key_value=2;key_flag=2;}
//						else if(P34==0){key_value=3;key_flag=2;}
//					}
//					break;
//						case 2:
//					{
//						P3=0xf0;
//						P42=1;
//						P44=1;
//						if(P44==0){key_value=4;key_flag=2;}
//						else if(P42==0){key_value=5;key_flag=2;}
//						else if(P35==0){key_value=6;key_flag=2;}
//						else if(P34==0){key_value=7;key_flag=2;}
//					}
//					break;
//						case 3:
//					{
//						P3=0xf0;
//						P42=1;
//						P44=1;
//						if(P44==0){key_value=8;key_flag=2;}
//						else if(P42==0){key_value=9;key_flag=2;}
//						else if(P35==0){key_value=10;key_flag=2;}
//						else if(P34==0){key_value=11;key_flag=2;}
//					}
//					break;
//						case 4:
//					{
//						P3=0xf0;
//						P42=1;
//						P44=1;
//						if(P44==0){key_value=12;key_flag=2;}
//						else if(P42==0){key_value=13;key_flag=2;}
//						else if(P35==0){key_value=14;key_flag=2;}
//						else if(P34==0){key_value=15;key_flag=2;}
//					}
//					break;
//				}
//			} 
//		}
//		break;
//		case 2:
//		{
//			P3=0x0f;
//			P42=0;
//			P44=0;
//			if(P3==0x0f)  //松开按键
//				key_flag=0;
//		}
//		break;
//	}
//	
//}

//数码管显示
void display(void)
{
    static unsigned char com = 0;
    P0 = 0xff;
    P2 = ((P2 & 0x1f) | 0xE0);
    P2 &= 0x1f;

    P0 = 1 << com;
    P2 = ((P2 & 0x1f) | 0xC0);
    P2 &= 0x1f;

    P0 = tab[buf[com]];
    P2 = ((P2 & 0x1f) | 0xE0);
    P2 &= 0x1f;

    if(++com == 8)
    {
        com = 0;
    }
}
//矩阵键盘
void key_board()
{
	//第一行
	r1=0;
	r2=r3=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=0;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=1;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=2;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=3;
	}
	
		//第二行
	r2=0;
	r1=r3=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=4;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=5;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=6;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=7;
	}
	
		//第三行
	r3=0;
	r2=r1=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=8;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=9;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=10;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=11;
	}
	
		//第四行
	r4=0;
	r2=r3=r1=1;
	c1=c2=c3=c4=1;
	if(c1==0)
	{
		while(c1==0);//等待松开
		key_value=12;  //s7
	}
	else if(c2==0)
	{
		while(c2==0);
		key_value=13;
	}
	else if(c3==0)
	{
		while(c3==0);
		key_value=14;
	}
	else if(c4==0)
	{
		while(c4==0);
		key_value=15;
	}
}

         

 

         

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值