十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)

1.键盘的分类

  编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘

  非编码键盘:靠软件编程来识别的称为非编码键盘。独立键盘、矩阵键盘

2.按键消抖

            

  如图,理想波形与实现波形之间是有区别的。实际波形在按下和释放的瞬间都有抖动现象,抖动事件的长短与按键的机械特性有关,一般为5~10ms。通常我们手动按下键然后立即释放,这个动作中稳定闭合时间超过20ms。因此检测键盘是否按下时,需加上去抖动操作。

一般有两种消抖方式:

   硬件消抖:如图。或有专门去抖动的芯片。

   软件消抖:通常用delay函数,将抖动的时间延时。

3.独立键盘

 1 //独立键盘检测 + 数码管显示所按值
 2 #include <reg52.h>
 3 void delay_ms(unsigned int n);
 4 sbit Key1 = P3^4;
 5 sbit Led1 = P1^0;
 6
 7 int main()
 8 {
 9     Key1 = 1;
10     Led1 = 1;
11     while(1)
12     {
13         if(Key1 == 0) {
14             delay_ms(20);        //消抖
15             if(Key1 == 0) {
16                 Led1 =! Led1;
17                 while(!Key1);    //等待按键释放
18             }
19         }
20     }
21     return 0;
22 }
23
24 void delay_ms(unsigned int n)   //误差 -0.651041666667us
25 {
26     unsigned char a,b;
27     unsigned int i;
28     for(i = 0; i < n; i++) {
29         for(b=4;b>0;b--)
30             for(a=113;a>0;a--);
31     }
32 }

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值不同,故可以用此种方法检测。

 1 //矩阵键盘检测 + 数码管显示所按值
 2 #include <reg52.h>
 3 sbit DUAN = P2^6;
 4 sbit WE = P2^7;
 5 unsigned char DuanTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
 6                               0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
 7 unsigned char WeTable[]    = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
 8 unsigned char num;
 9 void delay_ms(unsigned int n);
10 unsigned char key_jz();
11 void display(int num);
12
13 int main()
14 {
15     while(1)
16     {
17         num = key_jz();
18         display(num);
19     }
20     return 0;
21 }
22
23 unsigned char key_jz()
24 {
25     unsigned char temp;
26     P3=0xf0;
27     temp=P3;
28     if(temp!=0xf0)
29     {
30          delay_ms(20);
31         P3=0xf0;
32         temp=P3;
33         P3=0x0f;
34         temp|=P3;
35         switch(temp)
36         {
37              case 0xee:num=1;break;             //1
38             case 0xde:num=2;break;              //2
39             case 0xbe:num=3;break;              //3
40             case 0x7e:num=‘A‘;break;            //A
41
42             case 0xed:num=4;break;              //4
43             case 0xdd:num=5;break;              //5
44             case 0xbd:num=6;break;              //6
45             case 0x7d:num=‘B‘;break;            //B
46
47             case 0xeb:num=7;break;              //7
48             case 0xdb:num=8;break;              //8
49             case 0xbb:num=9;break;              //9
50             case 0x7b:num=‘C‘;break;            //C
51
52             case 0xe7:num=‘*‘;break;            //*
53             case 0xd7:num=0;break;              //0
54             case 0xb7:num=‘#‘;break;            //#
55             case 0x77:num=‘D‘;break;            //D
56
57
58         }
59
60     }
61     return num;
62 }
63 void display(int num)
64 {
65      //十位数
66     DUAN = 1;
67     P0 =  DuanTable[num/10];
68     DUAN = 0;
69     P0 = 0xFF;
70     WE = 1;
71     P0 = WeTable[4];
72     WE = 0;
73     P0 = 0xFF;
74     delay_ms(2);
75
76     //个位数
77     DUAN = 1;
78     P0 =  DuanTable[num%10];
79     DUAN = 0;
80     P0 = 0xFF;
81     WE = 1;
82     P0 = WeTable[5];
83     WE = 0;
84     P0 = 0xFF;
85     delay_ms(1);
86 }
87
88
89 void delay_ms(unsigned int n)   //误差 -0.651041666667us
90 {
91     unsigned char a,b;
92     unsigned int i;
93     for(i = 0; i < n; i++) {
94         for(b=4;b>0;b--)
95             for(a=113;a>0;a--);
96     }
97 }

                      

按下1时,显示1                                                   按下A时,显示A的ASCII码65

  

时间: 2024-08-07 06:08:02

十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)的相关文章

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

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

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

并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通信方式 是将数据字节分成一位一位的形式在一条传输线上逐个地传送. 串行通信传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂. 3.异步串行通信方式 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程.为使双方的收发协调,要求发送和接收设备

十天学会单片机Day0点亮LED

C51常用的数据类型 数据类型 关键字 所占位数 表示数范围 无符号字符型 unsigned char 8 0~255 有符号字符型 char 8 -128~127 无符号整型 unsigned int 16 0~65535 有符号整型 int 16 -32768~32767 无符号长整型 unsigned long 32 0~2^32-1 有符号长整型 long 32 -2^31~2^31-1 单精度实型 float 32 3.4e-38~3.4e38 双精度实型 double 64 1.7e

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

1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE BUS).SPI(Serial Peripheral Interface)总线及Microwire/PLUS等. 2.IIC IIC总线只有两根双向信号线.一根是数据线SDA,另一根是时钟线SCL. IIC总线通过上拉电阻接正电源.当总线空闲时,两根线均为高电平.连到总线上的任一器件输出的低电平,都

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

1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用于 允许模拟输出 将模拟输入编程为单端或差分输入 低半字节选择一个由高半字节定义的模拟输入通道.如果自动增量标志(AUTO-INCREMENT FLAG)置1,每次A/D转换后通道号将自动增加. 5.开始 停止信号 1 void Start() 2 { 3 SDA = 1; 4 delay(); 5

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

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉. [Arduino]108种传感器模块系列实验(资料+代码+图形+仿真) 实验二十六:4X4矩阵键盘模块(轻触式按键) 矩阵键盘 是单片机外部设备中所使用的排布类似于矩阵的键盘组.矩阵式结构的键盘显

4*4矩阵键盘原理分析以及代码展示

简单介绍下矩阵键盘的原理: 矩阵键盘4个输入端口ROW[3:0] 接收由FPGA产生的键盘扫描输入信号,而4个输出COL[3:0] 将按键操作的信息变化输入到FPGA扫描分析电路,进而得到按键的操作码. 输入端口分别接了4个上拉电阻,当4个输入端口输入若都为1时,则有无论按哪个按键,输出都为1,所以 若刚开始的时候对四个输入端口赋0,则只要按下任何一个按键,键盘上的4个输出则肯定有1变为0,而且能够判断到是哪一列,但是并不知道是哪一行,所以此时就要用到键盘扫描,何为键盘扫描,就是只要让输入端口的

AVR单片机教程——矩阵键盘

本文隶属于AVR单片机教程系列. ? 开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测.但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法. 矩阵键盘 这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动.我们先来看看它的原理. 每个按键有两个引脚,当按键按下时接通.每一行的一个引脚接在一起,分别连接到左边4个端口,称为"行引脚":每一列的另一个引脚接在一起,分别连接到右边的4个端口,称

疑问----单片机矩阵键盘行列反转扫描法

学到矩阵键盘这一块对网上别人写的C代码有些疑问,希望有能看到的大牛帮助解答. 矩阵键盘和独立键盘原理图: 原理:对于图右侧的矩阵键盘,把P3口的低四位(P3.0 ~ P3.3)和高四位(P3.4 ~ P3.7)分别置1,只要有按键被按下,那么与之对应的P3口某一位将由高电平被拉低,两次分别测得了行值和列值即确定了哪一个按键被按下了. 比如:先把低四位赋高电平即 P3 = 0000_1111 假如 S15 被按下了,那么 P3.2 就被拉成低电平即 P3 = 0000_1011 ,此时再把高四位赋