蓝桥杯单片机必备知识—–(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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • centos sqlite3安装及简单命令

    centos sqlite3安装及简单命令

  • VS Code关闭eslint校验

    VS Code关闭eslint校验一、产生原因:在编写vue代码的时候,一直因为格式问题报错,按照要求改了格式,虽不报错,但当选择格式化文档,就会再次报错,所以需要关闭格式校验功能。二、解决办法:①:若报错,可将鼠标放在报错位置,按照提示内容,单机右键,选择快速恢复;但后期影响继续存在②:关闭校验功能步骤:1.点击左下角的设置图标并选择设置2.搜索eslint,如图并勾选可取消报错:3.重启VSCode,编译时不再报错…

  • Linux 0.12 内核管理存储器

    Linux 0.12 内核管理存储器

  • threadlocal底层实现_什么是底层

    threadlocal底层实现_什么是底层ThreadLocal作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂性。package com.mupack;public class App{ private String content; public void setContent(String content) { this.content = content; } public Stri

  • C#中IntPtr类型

    1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。3.在调用API函数时,类似含有窗口句柄参数(HANDLE)的原型函数,应显示地声明为IntPtr类型。4.In…

  • Spring快速上手

    Spring快速上手

发表回复

您的电子邮箱地址不会被公开。

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