十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)
1.键盘的分类
编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘
非编码键盘:靠软件编程来识别的称为非编码键盘。独立键盘、矩阵键盘
2.按键消抖

如图,理想波形与实现波形之间是有区别的。实际波形在按下和释放的瞬间都有抖动现象,抖动事件的长短与按键的机械特性有关,一般为5~10ms。通常我们手动按下键然后立即释放,这个动作中稳定闭合时间超过20ms。因此检测键盘是否按下时,需加上去抖动操作。
一般有两种消抖方式:
硬件消抖:如图。或有专门去抖动的芯片。
软件消抖:通常用delay函数,将抖动的时间延时。
3.独立键盘

//独立键盘检测 + 数码管显示所按值
#include <reg52.h>
void delay_ms(unsigned int n);
sbit Key1 = P3^;
sbit Led1 = P1^; int main()
{
Key1 = ;
Led1 = ;
while()
{
if(Key1 == ) {
delay_ms(); //消抖
if(Key1 == ) {
Led1 =! Led1;
while(!Key1); //等待按键释放
}
}
}
return ;
} void delay_ms(unsigned int n) //误差 -0.651041666667us
{
unsigned char a,b;
unsigned int i;
for(i = ; i < n; i++) {
for(b=;b>;b--)
for(a=;a>;a--);
}
}
4.矩阵键盘


矩阵键盘模块示意图(根据模块电路即与I/O口相连情况简化)
(这里用的方法,自认为比郭天祥书上的方法好、更简单)
假设按下的键为1.
P3=0xf0 //1111 0000
temp = P3 //1110 0000 (1按下)确认所在列P3.4
P3 = 0x0f //0000 1111
temp2 = P3 //0000 1110 (1按下)确认所在行P3.0
temp = temp | temp2= 0xee // 1110 0000 | 0000 1110 = 1110 1110
每个按键的最后的temp值不同,故可以用此种方法检测。
//矩阵键盘检测 + 数码管显示所按值
#include <reg52.h>
sbit DUAN = P2^;
sbit WE = P2^;
unsigned char DuanTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char WeTable[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
unsigned char num;
void delay_ms(unsigned int n);
unsigned char key_jz();
void display(int num); int main()
{
while()
{
num = key_jz();
display(num);
}
return ;
} unsigned char key_jz()
{
unsigned char temp;
P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
delay_ms();
P3=0xf0;
temp=P3;
P3=0x0f;
temp|=P3;
switch(temp)
{
case 0xee:num=;break; //
case 0xde:num=;break; //
case 0xbe:num=;break; //3
case 0x7e:num='A';break; //A case 0xed:num=;break; //
case 0xdd:num=;break; //
case 0xbd:num=;break; //
case 0x7d:num='B';break; //B case 0xeb:num=;break; //
case 0xdb:num=;break; //
case 0xbb:num=;break; //
case 0x7b:num='C';break; //C case 0xe7:num='*';break; //*
case 0xd7:num=;break; //
case 0xb7:num='#';break; //#
case 0x77:num='D';break; //D } }
return num;
}
void display(int num)
{
//十位数
DUAN = ;
P0 = DuanTable[num/];
DUAN = ;
P0 = 0xFF;
WE = ;
P0 = WeTable[];
WE = ;
P0 = 0xFF;
delay_ms(); //个位数
DUAN = ;
P0 = DuanTable[num%];
DUAN = ;
P0 = 0xFF;
WE = ;
P0 = WeTable[];
WE = ;
P0 = 0xFF;
delay_ms();
} void delay_ms(unsigned int n) //误差 -0.651041666667us
{
unsigned char a,b;
unsigned int i;
for(i = ; i < n; i++) {
for(b=;b>;b--)
for(a=;a>;a--);
}
}

按下1时,显示1 按下A时,显示A的ASCII码65
十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)的更多相关文章
- 《十天学会单片机和C语言编程》
<十天学会单片机和C语言编程> 大家注意了这个文件只有最新版迅雷可以下载,下面的lesson几就是第几课.点击右键使用迅雷下载. ed2k://|file|[十天学会单片机和C语言编程]. ...
- 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)
1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...
- 十天学会单片机Day4串行口通信
并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...
- 十天学会单片机Day3 D/A与A/D转换器
D/A转换器 1.二进制权电阻网络型D/A转换器 基准电压Vref 数据D(d3d2d1d0) 输出模拟电压V0 i0 = Vref/8R i1 = Vref/4R i2 = Vref/ ...
- 十天学会单片机Day0点亮LED (锁存器、三极管、继电器)
C51常用的数据类型 数据类型 关键字 所占位数 表示数范围 无符号字符型 unsigned char 8 0~255 有符号字符型 char 8 -128~127 无符号整型 unsigned in ...
- 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用
1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...
- 十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)
1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用 ...
- MCU软件最佳实践——矩阵键盘驱动
1.矩阵键盘vs独立按键 在mcu应用开发过程中,独立按键比较常见,但是在需要的按键数比较多时,使用矩阵键盘则可以减少io占用,提高系统资源利用率.例如,某mcu项目要求有16个按钮,如果采用独立按键 ...
- 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
随机推荐
- 初探接口测试框架--python系列1
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 【CImg】简单的畸变矩形矫正
三个角点确定一个平面,畸变的平面可以看成是不同基底下同一图像的表示 ============================我是分割线============================= 1. ...
- EndNote文献管理
一直想写个博客,但是一直没有好好坐下来对自己工作进行一个梳理.从今天开始吧,争取多写一点. 今天,先介绍一下科技论文写作中经常使用的一款软件EndNote,这个软件,掌握它的使用方法后会觉得很方便:但 ...
- 如何制作prezi swf格式字体(prezi 中文字体)
如何制作prezi swf格式字体(prezi 中文字体) 文/玄魂 前言 Prezi软件虽然没有正式进入中国,但是中国的Prezi爱好者却在不遗余力的推广着Prezi.我接触这款软件比较晚,但是从接 ...
- nginx 配置文件参数说明
#运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log ...
- js的replace方法
今天在项目中发现,js的replace方法,其实只是替换第一个匹配的字符: 比如 backstreetboy.replace('b','B') 得到的结果是Backstreetboy,只是替换了第一个 ...
- OSGI.NET 学习笔记--应用篇
关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1. OSGI.NET 与UIOSP OSGi是Open Service Ga ...
- 《App研发录》知识点汇总
原文链接:http://www.jianshu.com/p/fc8c4638937e <App研发录>这部书是包建强写的,说来也巧,在读这边书之前在看池建强的<Mac 人生元编程&g ...
- 华为OJ平台——放苹果(典型整数划分问题)
题目描述: 输入m,n,分别表示苹果数与盘子的总数,要求输出苹果放在n个盘子的方法总数(注意511和151是一种情况),例如输入 7 3 输出8((7),(6,1),(5,2),(4,3),(5,1, ...
- swing 复选框
通过 box1 和 box2的 public boolean isSelected()的方法 返回按钮的状态. 如果选定了切换按钮,则返回 true,否则返回 false.