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键盘检测(独立键盘、矩阵键盘)的更多相关文章

  1. 《十天学会单片机和C语言编程》

    <十天学会单片机和C语言编程> 大家注意了这个文件只有最新版迅雷可以下载,下面的lesson几就是第几课.点击右键使用迅雷下载. ed2k://|file|[十天学会单片机和C语言编程]. ...

  2. 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)

    1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...

  3. 十天学会单片机Day4串行口通信

    并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...

  4. 十天学会单片机Day3 D/A与A/D转换器

    D/A转换器 1.二进制权电阻网络型D/A转换器 基准电压Vref 数据D(d3d2d1d0) 输出模拟电压V0 i0 = Vref/8R    i1 = Vref/4R     i2 = Vref/ ...

  5. 十天学会单片机Day0点亮LED (锁存器、三极管、继电器)

    C51常用的数据类型 数据类型 关键字 所占位数 表示数范围 无符号字符型 unsigned char 8 0~255 有符号字符型 char 8 -128~127 无符号整型 unsigned in ...

  6. 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用

    1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...

  7. 十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)

    1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用 ...

  8. MCU软件最佳实践——矩阵键盘驱动

    1.矩阵键盘vs独立按键 在mcu应用开发过程中,独立按键比较常见,但是在需要的按键数比较多时,使用矩阵键盘则可以减少io占用,提高系统资源利用率.例如,某mcu项目要求有16个按钮,如果采用独立按键 ...

  9. 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

随机推荐

  1. HDU 2209 翻纸牌游戏 状态BFS

    翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem De ...

  2. HDU1325

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1325 #include<stdio.h> #include<algorithm&g ...

  3. 如何设置修改WPS批注上的用户信息名称

    http://jingyan.baidu.com/article/6b18230953cec7ba59e1596b.html 点击左上角的“WPS文字”:   选择“选项”:   点击“用户信息”: ...

  4. java web学习

    一直想下决心好好学下java web,但是总是间断,虽然我的方向是ios,但是觉得后台也是相当重要,毕竟移动端实际上更多也就是展示后台拉取到的信息,搞移动端的不能总是受制于后台,各位看官觉得呢? 这两 ...

  5. uitableviewcell高度自适应笔记

    今天看了几篇uitableviewcell高度自适应的文章,大体分为两种方式. 第一种方式,cell里面有label,在cellforrow绘制的时候计算Label的可能高度,并且在此时重新计算cel ...

  6. js中字符串,数字之间转换的常用方法

    var number={ num:, num1:"2你好" }; //将数字转换为字符串 var str=number.num.toString();//十进制 );//二进制 ) ...

  7. console.log在线调试

    前端开发人员工作有时候会用到console.log,PC端直接能打开开发者工具.但是移动端就不太方便了,为此提供一种简单的方法,只需2步: 1.打开http://jsconsole.com/  输入: ...

  8. SAP实际成本与物料帐

    [ittype-SAP帮主]: SAP实际成本与物料帐->Beginning Inventory [库存数量,标准价值,差异] (上一期结转) 收到(Receipts)    -->Pro ...

  9. Ubuntu系统使用记录(持续更新)

    本篇文章记录在虚拟机上跑Ubuntu16.04遇到的一系列问题,熟悉一下Ubuntu的相关操作,进入终端的方法ctrl+alt+t. 1.修改屏幕分辨率,进入系统默认的是800x600 即便能够进入s ...

  10. 实例分析ELF文件动态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第6章 可执行文件的装载与进程 第7章 动态链接 <Linux GOT与PLT> 开发平台 ...