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


相关推荐

  • Mybatis 动态SQL

    Mybatis 动态SQLMybatis动态SQL一.动态SQL数组array使用foreach标签<!–mybatis的集合操作知识点:如果遇到集合参数传递,需要将集合遍历标签:foreach循环遍历集合标签属性说明:1.collection表示遍历的集合类型1.1数组关键字array1.2List集合关键字lis

    2022年6月23日
    28
  • VS2005 build for Windows Mobile 6 SDK Samples[通俗易懂]

    VS2005 build for Windows Mobile 6 SDK Samples[通俗易懂]VS2005buildforWindowsMobile6SDKSamples C:/ProgramFiles/WindowsMobile6SDK/Samples/Common/CPP/Win32/MapiRule/mapirule.cpp Problem:Ifyoumeetthefollowingerror:SignToolError:No

    2022年7月14日
    17
  • SpringCloud—熔断器Hystrix的作用–解决灾难性雪崩效应

    SpringCloud—熔断器Hystrix的作用–解决灾难性雪崩效应

    2020年11月12日
    178
  • navicat for mysql 15 激活码【2021.10最新】

    (navicat for mysql 15 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    350
  • java后端开发职责_工作职责和岗位职责有什么区别

    java后端开发职责_工作职责和岗位职责有什么区别java后台开发岗位职责:1.参与项目后端的设计、开发工作,承担核心功能模块的代码编写,确保项目进度和质量;2.参与开发人员codereview工作,并能提供性能优化、安全性建议;3.参与系统架构设计、接口规范制定、技术文档编写等。4.参与现有系统的优化改进。岗位要求:1.本科及以上学历,计算机相关专业优先,【扎实的数据结构/算法与编码能力】;2.JAVA基础扎实,1年及以上JAV…

    2025年5月27日
    5
  • c绝对值函数图像_取绝对值(C、C++、js)

    c绝对值函数图像_取绝对值(C、C++、js)在计算过程中 如果要确保返回正整 一般都要使用绝对值 编程语言通常都会提供取绝对值方法 下面分别看看 C C js 如何取绝对值 一 C 取绝对值 1 方法 Math Ads intvalue 2 说明 除支持整型外 还支持 float double decimal sbyte short long 3 命名空间 System4 举例 Math Abs 5 8 输出 3Math

    2025年8月14日
    2

发表回复

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

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