学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)
这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘、键盘消抖等)包含原理图、代码等
- (一)基础补充
- 1.键盘的任务
- 2.键盘的识别
- 3.如何消除按键的抖动
- 4.非编码键盘与编码键盘
- 5.非编码键盘的扫描方式
- (1)查询扫描:
- (2)定时扫描:
- (3)中断扫描:
- (二)独立键盘
- 1.独立键盘原理图
- 2.独立键盘K1控制LED1代码实现
- (三)矩阵键盘
- 1.矩阵键盘原理图
- 2.矩阵键盘对应数码管输出0到代码实现
(一)基础补充
1.键盘的任务
(1)判别是否有键按下?若有,进入下一步。
(2)识别哪一个键被按下,并求出相应的键值。
(3)根据键值,找到相应键值的处理程序入口。
2.键盘的识别
按键的闭合与否,反映在行线输出电压上就是呈现高电平或低电平,单片机通过对行线电平的高低状态的检测,便可以确认按键是否按下或松开。为了确保单片机对一次按键动作只确认一次按键有效(所谓按键有效,是指按下按键后,一定要再松开),必须消除抖动期t1和t3的影响。
3.如何消除按键的抖动
(1)用软件延时来消除按键抖动,基本思路是:在检测到有键按下时,该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线电平是否仍为低电平,如果仍为低电平,则确认该行确实有键按下。当按键松开时,行线的低电平变为高电平,执行一段延时10ms的子程序后,检测该行线为高电平,说明按键确实已经松开。
(2)采用专用的键盘/显示器接口芯片,这类芯片中都有自动去抖动的硬件电路。
4.非编码键盘与编码键盘
(1)非编码键盘是指按下按键,键号信息不能直接得到,要通过软件来获取。非编码键盘常见的有独立式键盘和矩阵式键盘两种结构。
(2)编码键盘是指当按键按下后,能直接得到按键的键号,例如使用专用的键盘接口芯片。
5.非编码键盘的扫描方式
(1)查询扫描:
利用单片机空闲时,调用键盘扫描子程序,反复扫描键盘,来响应键盘的输入请求,如果单片机的查询频率过高,虽能及时响应键盘的输入,但也会影响其他任务的进行。如果查询的频率过低,有可能出现键盘输入的漏判现象。所以要根据单片机系统的繁忙程度和键盘的操作频率,来调整键盘扫描的频率。
(2)定时扫描:
单片机可每隔一定的时间对键盘扫描一次,即定时扫描。这种方式通常是利用单片机内的定时器产生的定时中断,进入中断子程序后对键盘进行扫描,在有键按下时识别出按下的键,并执行相应键的处理程序。由于每次按键的时间一般不会小于100ms,所以为了不判漏有效的按键,定时中断的周期一般小于100ms。
(3)中断扫描:
为了进一步提高单片机扫描键盘的工作效率,可采用中断扫描方式,即键盘只有在有按键按下时,才会向单片机发出中断请求信号。单片机响应中断,执行键盘扫描中断服务子程序,识别出按下的按键,并跳向该按键的处理程序。如果无键按下,单片机将不理睬键盘。该方式的优点是只有有按键按下时才会进行处理,所以实时性强,工作效率高。
(二)独立键盘
1.独立键盘原理图
独立式键盘的特点是各键相互独立,每个按键各接一条I/O口线,通过检测I/O口输入线的电平状态,很容易判断哪个按键被按下。
2.独立键盘K1控制LED1代码实现
#include<reg52.h>
sbit led1=P2^0;//因为led1由p2^0口控制
sbit k1=P3^1;//P31口的输出电平由按键k1控制
void delay(int i)
{while(i--);
}
void keyproc()
{if(k1==0){delay(1000);//延时消抖if(k1==0){led1=~led1;}while(!k1) ;}
}
void main()
{while(1){keyproc();}
}
(三)矩阵键盘
1.矩阵键盘原理图
矩阵式(也称行列式)键盘通常用于按键数目较多的场合,它由行线和列线组成,按键位于行、列交叉点上,其接口电路如上图。
2.矩阵键盘对应数码管输出0到代码实现
#include "reg52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define GPIO_DIG P0
#define GPIO_KEY P1uchar code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,0x39, 0x5e, 0x79, 0x71};//静态数码管码值uint KeyColValue;
uint KeyLineValue;void delay(uint i) //延时函数
{while(i --);
}void KeyDown() //键盘按键扫描函数
{char a; GPIO_KEY = 0x0f;if(GPIO_KEY != 0x0f)//检测4行中哪一行按键是否按下{delay(1000); //延时消抖if(GPIO_KEY != 0x0f) //再次检测4行中哪一行按键是否按下{switch(GPIO_KEY) //根据IO的值来确定哪一行按键按下{case(0x07): KeyColValue = 0; break;case(0x0b): KeyColValue = 1; break;case(0x0d): KeyColValue = 2; break;case(0x0e): KeyColValue = 3; break;}}}GPIO_KEY = 0xf0;if(GPIO_KEY != 0xf0) //检测4行中哪一列按键是否按下{delay(1000); //延时消抖if(GPIO_KEY != 0xf0) //再次检测4行中哪一列按键是否按下{switch(GPIO_KEY) //根据IO的值来确定哪一列按键按下{case(0x70): KeyLineValue = 0; break;case(0xb0): KeyLineValue = 1; break;case(0xd0): KeyLineValue = 2; break;case(0xe0): KeyLineValue = 3; break;}}while((a < 50) && (GPIO_KEY != 0xf0)) //延时,确保没有按键再按下{delay(1000);a ++;}}
}void main()
{while(1){KeyDown();//检测按键是否按下GPIO_DIG = smgduan[KeyLineValue*4 + KeyColValue];//根据按键的行列值,静态数码管显示相应的值}
}
最后还想说的是,看到最后的朋友们,如果对你有用,点赞收藏哦!
创作不易,还需要你们的支持,后续持续更新51单片机系列。
学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)相关推荐
- 学习笔记:51单片机(STC89C52)如何定时10ms
1.定时器如何定时 首先大致描述一下定时器的定时原理,其实本质就一句话:每经过一个机器周期,寄存器就加1. 这里就又要解释什么是时钟周期,什么是机械周期.我们的51单片机无论是开发板还是最小系统板上, ...
- 学习笔记之-51单片机特殊功能寄存器
一.前言 学习51单片机的过程中,其实就是学习怎么用它的特殊功能寄存器(有些寄存器是我们看不到的),特殊功能寄存器是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据 ...
- 强化学习笔记(一)基础篇
强化学习笔记(一)基础篇 目录 1.强化学习相关概念 2.强化学习与监督学习和非监督学习的区别 3.强化学习分类 4.三对重要概念 目录 写在前面:本文系小编学习邹伟老师等人编著的<强化学习&g ...
- MyBatis学习笔记(1)—使用篇
MyBatis学习笔记(1)-使用篇 MyBatis学习笔记(2)-映射关系篇 MyBatis学习笔记(3)-高级映射之一对一映射 Mybatis学习笔记(4)-高级映射之一对多映射 Mybatis学 ...
- FPGA系统性学习笔记连载_Day1数字电路基础篇
FPGA系统性学习笔记连载_Day1数字电路基础篇 连载<叁芯智能FPGA设计与研发就业班-第一天> <数字电路基础1> 原创作者:紫枫术河 转载请联系群主授权,否则追究责任 ...
- 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)
嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...
- 嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器)
嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器) 定时器/计数器简介 TH与TL TMOD工作模式寄存器 TCON定时器控制寄存器 定时器操作实例 定时器/计数器简介 在单片机中, ...
- HFSS学习笔记(一)基础篇 操作界面简介和使用前的准备工作
HFSS学习笔记(一)基础篇 操作界面简介和使用前的准备工作 一.HFSS工作界面简介 各区域的功能: 二.设计的步骤 1.创建工程文件 2.进行设计前的准备工作 一.HFSS工作界面简介 各区域的功 ...
- 安卓学习笔记(一)入门篇
总结<第一行代码>Android学习笔记(一)入门篇 1.入门 Android的四层架构和四大组件 运行第一个Android程序 日志工具Log AndroidStudio快捷键 GIT的 ...
最新文章
- python控制流_Python 的控制流代码混淆
- 第十四次ScrumMeeting博客
- 【原创】源智工作流聚合步骤模型
- PHP on Windows Azure 入门教学系列(2) ——利用SQL Azure做一个简单的访问计数器...
- java 获取指定后缀名的文件
- 奇数在前,偶数在后;奇数按从大到小排序;偶数按从小到大排序。对其重新排序。
- 3D优化之ShadowGun系列二:浓烟,使用面片模拟粒子效果
- excel两列数据对比找不同_怎么在excel中对比两列数据并查找重复项?
- 计算机win7如何加快开机速度,Win7系统如何提高开机速度?提高开机速度的三种方法步骤...
- UG NX二次开发-外部模式
- VMware安装Linux详细教程
- imap服务器不支持身份验证方法,POP/IMAP 客户端身份验证失败 | Microsoft Docs
- 1968:Misspelling
- PDF怎么编辑修改内容的免费方法
- 学生成绩排名 (用结构体数组按成绩排名)
- matlab算kdj指标,KDJ指标(随机指标)详解
- arcmap小技巧之获取行政区划及json格式转shp,json转csv
- rabbitmq系列(三)消息幂等性处理
- 博弈论——非合作博弈 什么是纳什均衡
- thinkpad如何屏蔽bios更新 提示电池_华硕(圣骑)100系 200系 BIOS更新支持8代CPU软件刷新...
热门文章
- Error--解决使用Application Loader提交ipa包审核时的报错:ERROR ITMS-90168: The binary you uploaded was invalid....
- Javascript类的创建
- PHP向服务器错误记录、文件或远程目标发送一个错误
- linux下编程epoll实现将GPS定位信息上报到服务器
- Spring AMQP + Rabbit 配置多数据源消息队列
- Python教程:丛入门到实践
- 图片 滚动切换效果(五) 高级篇
- OC学习篇之---类的初始化方法和点语法的使用
- 浏览器构造页面的原理
- 实现IMSI、IMEI查询