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. 基于RBAC模型的通用企业权限管理系统

    1. 为什么我们需要基于RBAC模型的通用企业权限管理系统 管理信息系统是一个复杂的人机交互系统,其中每个具体环节都可能受到安全威胁.构建强健的权限管理系统,保证管理信息系统的安全性是十分重要的.权限 ...

  2. Android中常用的5大布局详述

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面. 所有的布局方式都可以归类为ViewGroup的 ...

  3. cookie、session、sessionid 与jsessionid

    可查看 http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html

  4. 使用 iMacros 来自动化日常的工作

    利用 iMacros 的浏览器附加组件来提高工作效率 介绍 iMacros 这个强大的工具,使用简单的范例演示了如何使用这个工具来完成对于网页的操作,对于大量的具有重复性的工作内容尤其可以提高效率.对 ...

  5. jmeter的分布式部署

    在使用Jmeter进行性能测试时,如果并发数比较大(比如5000+并发),单台电脑的配置(CPU和内存)可能无法支持(公司配的联想e450家庭用笔记本一般到1000就会卡死),这时可以使用Jmeter ...

  6. [Java] 我的Coding Style 总结

    1. 缩进 采用4个空格的缩进方式 2. tab 不采用"hard" tab. 需要更改编辑器的默认配置.将tab值改成4个空格. 3. 换行 3.1 一行不超过75个字符 3.2 ...

  7. nginx 配置高并发

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  8. 洛谷P1467 循环数 Runaround Numbers

    P1467 循环数 Runaround Numbers 89通过 233提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 循环数是 ...

  9. android大项目运行中出现问题汇总

    Android 项目中,特别是当项目文件和规模达到一定的程度后,会引发一些平常不常见的问题. 下面对遇到的一些问题做一个汇总和总结. scenario 1: 在项目中,我们采用了chromimum内核 ...

  10. No.004 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...