蓝桥杯单片机必备知识—–(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js array 数组添加与删除数据

    js array 数组添加与删除数据//新建数组varids=newArray();//向数组中添加数据ids.push(1);//删除下标为i的数组元素ids.remove(i);//自定义删除函数:Array.prototype.remove=function(dx){if(isNaN(dx)||dx>this.length){returnfalse;}…

    2022年6月10日
    53
  • python的input格式_javascript设计模式与开发实践 pdf

    python的input格式_javascript设计模式与开发实践 pdffileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件readlines()方法,区别在于:前者是一个迭代对象,即每次只生成一行,需要用for循环迭代。后者是一次性读取所有行。在碰到大文件的读取时,前者无疑效率更高效。用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。【典型用法】importfileinputf…

    2022年5月3日
    55
  • 真理的基本的属性是_thread和handler区别

    真理的基本的属性是_thread和handler区别原文地址:http://blog.csdn.net/luckeryin/article/details/5649144C#中,Thread类有一个IsBackground的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。个人感觉这样的解释等于没有解释..Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一

    2022年10月16日
    2
  • 浓缩就是精华「建议收藏」

    浓缩就是精华「建议收藏」 『凡人牧场』人生启示录:被称为世上最经典的25句话(转载)   作者:晶晶鱼 提交日期:2003-12-3115:32:40    1,记住该记住的,忘记该忘记的。改变能改变的,接受不能改变的。      2,能冲刷一切的除了眼泪,就是时间,以时间来推移感情,时间越长,冲突越淡,仿佛不断稀释的茶。      3,怨言是上天得至人类最大的供物,也是人

    2022年6月29日
    22
  • tomcat最大并发数连接数_lvs最大并发数

    tomcat最大并发数连接数_lvs最大并发数Tomcat默认配置的最大请求数是150,也就是说同时支持150个并发如何设置提高并发数修改catalina.sh:rem以下配置为JVM参数调优setJAVA_OPTS=-serverrem以服务器模式启动,启动速度慢,但更稳定,性能更好-Xms8192Mrem由于本机内存为16G,这里就设置成8G(实际并未达到最大内存的80%)-Xm…

    2025年6月17日
    1
  • python下载安装教程(官网)

    python下载安装教程(官网)python官方网站下载、自定义安装教程,亲测有效,有疑问可直接留言

    2022年4月29日
    53

发表回复

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

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