蓝桥杯单片机必备知识—–(6)矩阵按键

蓝桥杯单片机必备知识—–(6)矩阵按键

蓝桥杯单片机必备知识—–(6)矩阵按键

思路: 就是线反转法

线反转法:将控制行的线置高控制列的线置地,如果哪个低,则为哪一行有按键按下;然后将控制列的线置高控制行的线置地,如果哪个低,则为哪一列有按键按下。如此之后就可以确定到底是哪个按键按下。
在这里插入图片描述

注:跳线帽设置为KBD!!!!!

扫描键盘函数

void read_key()
{
   
	static unsigned char hang;
	static unsigned char state = 0;
	
	switch(state)
	{
   
		case 0:	
		{
   
			P3 = 0x0f;P42 = 0;P44 = 0; 
			if(P3 != 0x0f) state = 1;
		}break;
		case 1:
		{
   
			P3 = 0x0f; P42 = 0; P44 = 0;	//列置低,行置高
			if(P3 != 0x0f) 		//判断行
			{
   
				if(P33 == 0) hang = 1;
				if(P32 == 0) hang = 2;
				if(P31 == 0) hang = 3;
				if(P30 == 0) hang = 4;
				switch(hang)
				{
   
					case 1:
					{
   
						P3 = 0xf0;P42 = 1;P44 = 1;				//行置低,列置高
						if(P44 == 0){
    s4++;state = 2;hang = 0;}
						if(P42 == 0){
    s8++;state = 2;hang = 0;}
						if(P35 == 0){
   s12++;state = 2;hang = 0;}
						if(P34 == 0){
    s16++;state = 2;hang = 0;}
					}break;
					case 2:
					{
   
						P3 = 0xf0;P42 = 1;P44 = 1;
						if(P44 == 0){
    s5++;state = 2;hang = 0;}
						if(P42 == 0){
    s9++;state = 2;hang = 0;}
						if(P35 == 0){
   s13++;state = 2;hang = 0;}
						if(P34 == 0){
    s17++;state = 2;hang = 0;}
					}break;
					case 3:
					{
   
						P3 = 0xf0;P42 = 1;P44 = 1;
						if(P44 == 0){
    s6++;state = 2;hang = 0;}
						if(P42 == 0){
    s10++;state = 2;hang = 0;}
						if(P35 == 0){
   s14++;state = 2;hang = 0;}
						if(P34 == 0){
    s18++;state = 2;hang = 0;}
					}break;
					case 4:
					{
   
						P3 = 0xf0;P42 = 1;P44 = 1;
						if(P44 == 0){
    s7++;state = 2;hang = 0;}
						if(P42 == 0){
    s11++;state = 2;hang = 0;}
						if(P35 == 0){
   s15++;state = 2;hang = 0;}
						if(P34 == 0){
    s19++;state = 2;hang = 0;}
					}break;
				}
			}
			else state = 0;
		}break;
		case 2:		//判断按键是否松开
		{
   
			P3 = 0x0f;P42 = 0;P44 = 0;
			if(P3 == 0x0f) state = 0;
		}break;
	}
	
}

测试效果图:

在这里插入图片描述
一般蓝桥杯会使用s4s5s8s9小矩形键盘来测试你对矩阵键盘的掌握程度。
在这里插入图片描述

小矩阵键盘

void read_key()
{
   
	static unsigned char hang;
	static unsigned char state = 0;
	
	switch(state)
	{
   
		case 0:	
		{
   
			P3 = 0x0f;P42 = 0;P44 = 0;
			if(P3 != 0x0f) state = 1;
		}break;
		case 1:
		{
   
			P3 = 0x0f; P42 = 0; P44 = 0;
			if(P3 != 0x0f) 
			{
   
				if(P33 == 0) hang = 1;
				if(P32 == 0) hang = 2;
				switch(hang)
				{
   
					case 1:
					{
   
						P3 = 0xf0;P42 = 1;P44 = 1;
						if(P44 == 0){
    s4++;state = 2;hang = 0;}
						if(P42 == 0){
    s8++;state = 2;hang = 0;}
					}break;
					case 2:
					{
   
						P3 = 0xf0;P42 = 1;P44 = 1;
						if(P44 == 0){
    s5++;state = 2;hang = 0;}
						if(P42 == 0){
    s9++;state = 2;hang = 0;}
					}break;
				}
			}
			else state = 0;
		}break;
		case 2:
		{
   
			P3 = 0x0f;P42 = 0;P44 = 0;
			if(P3 == 0x0f) state = 0;
		}break;
	}
	
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100142.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JMeter之事务控制器

    JMeter之事务控制器

    2021年7月13日
    123
  • Map 的 key、value 是否允许为null

    Map 的 key、value 是否允许为null

    2021年6月19日
    159
  • hdoj 2602 Bone Collector 【01背包】

    hdoj 2602 Bone Collector 【01背包】

    2022年1月14日
    43
  • Redis删除策略和淘汰策略[通俗易懂]

    Redis删除策略和淘汰策略[通俗易懂]来的问题,Redis引入了定期删除策略(是他们的一个比较折中的方案)周期性轮询Redis库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除频度。实际上,在前面所说的删除策略,它针对的是expire命令进行的操作,也就是说那些具有时效性的数据(已经过期,并且还在占用内存的数据),我们在这里说的是针对那些并没有过期,或者是内存中的数据没有一个带有有效期,全是永久性数据,这时候删除策略就不起作用了,所以这个时候内存满了我们再去插入数据到内存是怎么做?删除这批key中已过期的。……

    2022年8月30日
    1
  • 使用JavaScript刷新验证码

    使用JavaScript刷新验证码今天学习了验证码的开发,日常生活中经常点验证码,今天自己也来做一个验证码                           首先是用一个文件产生随机验证码:  <%@pageimport="java.awt.*"%><%@pageimport="java.util.*"%><%@pa…

    2025年8月8日
    4
  • vscode设置字体大小和字体(vscode窗口字体大小设置)

    VScode如何设置字体大小第一步:首先打开vscode,在vscode的左下角有一个设置按钮,单机打开,选择settings选项第二步:在设置中查找font(字体)选项,并打开第三步:在font选项内,选择fontsize,就可以设置字体的大小了还有一些其他的关于字体的设置也可以进行修改…

    2022年4月18日
    4.0K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号