单片机键盘扫描程序与原理图

合集下载

51单片机矩阵键盘原理

51单片机矩阵键盘原理

51单片机矩阵键盘原理51单片机矩阵键盘原理矩阵键盘是一种常用的输入设备,可以通过少量的I/O口控制多个按键。

51单片机作为嵌入式系统中常用的控制器,也可以通过控制矩阵键盘来实现输入功能。

1. 矩阵键盘的结构矩阵键盘由多个按键组成,每个按键都有一个引脚与其他按键共用,形成了一个按键矩阵。

例如,4x4的矩阵键盘有16个按键,其中每行和每列各有4个引脚。

2. 矩阵键盘的工作原理当用户按下某一个按键时,该按键所在行和列之间会形成一个电路通路。

这时,51单片机可以通过扫描所有行和列的电路状态来检测到用户所按下的具体按键。

具体实现过程如下:(1)将每一行引脚设置为输出状态,并将其输出高电平;(2)将每一列引脚设置为输入状态,并开启上拉电阻;(3)逐一扫描每一行引脚,当发现某一行被拉低时,则表示该行对应的某一个按键被按下;(4)记录下该行号,并将该行引脚设置为输入状态,其余行引脚设置为输出状态;(5)逐一扫描每一列引脚,当发现某一列被拉低时,则表示该列对应的是刚才所记录下的行号及其对应的按键;(6)通过行号和列号确定具体按键,并进行相应的处理。

3. 代码实现下面是一个简单的51单片机矩阵键盘扫描程序:```c#include <reg52.h> //头文件sbit row1 = P1^0; //定义引脚sbit row2 = P1^1;sbit row3 = P1^2;sbit row4 = P1^3;sbit col1 = P1^4;sbit col2 = P1^5;sbit col3 = P1^6;sbit col4 = P1^7;unsigned char keyscan(void) //函数定义{unsigned char keyvalue; //定义变量while(1) //循环扫描{row1=0;row2=row3=row4=1; //设置行状态 if(col1==0){keyvalue='7';break;} //读取按键值 if(col2==0){keyvalue='8';break;}if(col3==0){keyvalue='9';break;}if(col4==0){keyvalue='/';break;}row2=0;row1=row3=row4=1;if(col1==0){keyvalue='4';break;}if(col2==0){keyvalue='5';break;}if(col3==0){keyvalue='6';break;} if(col4==0){keyvalue='*';break;}row3=0;row1=row2=row4=1; if(col1==0){keyvalue='1';break;} if(col2==0){keyvalue='2';break;} if(col3==0){keyvalue='3';break;} if(col4==0){keyvalue='-';break;}row4=0;row1=row2=row3=1; if(col1==0){keyvalue='C';break;} if(col2==0){keyvalue='0';break;} if(col3==0){keyvalue='=';break;} if(col4==0){keyvalue='+';break;}}return keyvalue; //返回按键值}void main() //主函数{unsigned char key;while(1) //循环读取{key = keyscan(); //调用函数}}```以上代码实现了一个简单的矩阵键盘扫描程序,可以通过调用`keyscan()`函数来获取用户所按下的具体按键值。

stm32键盘扫描电路原理

stm32键盘扫描电路原理

stm32键盘扫描电路原理
STM32键盘扫描电路原理是通过使用STM32微控制器的GPIO(通用输入/输出)功能和外部硬件电路,实现对键盘的扫描和检测。

1. 首先需要将键盘的按键连接到STM32微控制器的GPIO引脚上。

可以使用矩阵排列的方式来连接多个按键。

2. 然后将STM32微控制器的GPIO设置为输入模式,需要扫描的按键对应的GPIO引脚设置为输入。

3. 在代码中,设置一个循环,依次对每一个按键进行扫描。

可以使用GPIO外部中断来触发按键的扫描。

4. 在每次扫描过程中,将某一个按键对应的GPIO引脚设置为高电平,并读取引脚的状态。

5. 如果读取到的引脚状态为高电平,则表示该按键被按下。

6. 根据读取到的按键状态,可以执行相应的操作。

需要注意的是,如果使用矩阵排列的方式连接多个按键,还需要使用GPIO引脚的输出模式来控制矩阵的行和列。

总之,STM32键盘扫描电路原理是通过STM32微控制器的GPIO和外部硬件电路,实现对键盘的扫描和检测。

单片机按键程序设计

单片机按键程序设计

单片机按键程序设计单片机按键的基本原理其实并不复杂。

通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。

在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。

在实际的按键程序设计中,有多种方式可以实现按键检测。

其中一种常见的方法是查询法。

这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。

以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。

当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。

除了查询法,还有中断法可以用于按键检测。

中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。

```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。

51单片机矩阵键盘扫描程序

51单片机矩阵键盘扫描程序
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256;//重新赋值2ms
TL0=(65536-2000)%256;
Display(0,8); //调用数码管扫描
}
/*------------------------------------------------
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}
/*------------------------------------------------
uS延时函数,含有输入参数unsigned char t,无返回值
unsigned char是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5 uS

单片机矩阵键盘行列扫描程序学习资料

单片机矩阵键盘行列扫描程序学习资料
switch(key)
{
case 0x7e:P0=dofly[0];break;//0按下相应的键显示相对应的码值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar keyscan(void);
void delay(uint i);
void main()
{
uchar key;
P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan();//调用键盘扫描,
//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍

键盘扫描原理

键盘扫描原理

键盘扫描原理
键盘是计算机输入设备中最常用的一种,它通过将人们的按键操作转换成计算机可以识别的信号,从而实现了人机交互。

而键盘的核心部分就是键盘扫描原理,它是如何实现的呢?
首先,我们需要了解键盘的工作原理。

当我们按下键盘上的某一个按键时,就会产生一个按键信号,这个信号会通过键盘的电路传输到计算机主机上。

而键盘扫描原理就是指计算机是如何检测到这个按键信号的。

键盘扫描原理的核心就是矩阵扫描。

键盘上的每一个按键都对应着一个电路,这些电路会以矩阵的形式排列在键盘的背后。

当我们按下某一个按键时,对应的电路就会闭合,从而产生一个按键信号。

计算机会通过扫描这个矩阵来检测到按键信号的产生。

具体来说,计算机会以一定的频率扫描键盘上的每一个按键,检测它们是否产生了按键信号。

这个扫描的频率通常很高,所以我们按下按键时几乎可以立即得到响应。

一旦计算机检测到有按键信号产生,它就会将这个信号转换成相应的键值,从而实现了按键的输入。

除了矩阵扫描,现代键盘还采用了一些其他技术来提高性能和稳定性。

比如采用了多种防抖动技术,防止因按键抖动而产生误操作;采用了多种按键轮询技术,提高了按键的灵敏度和反应速度;还采用了多种按键编码技术,提高了按键的识别准确性和稳定性。

总的来说,键盘扫描原理是键盘工作的核心,它通过矩阵扫描等技术实现了对按键信号的检测和转换,从而实现了人机交互。

随着技术的不断发展,键盘的性能和稳定性会不断提高,为人们的使用体验带来更多的便利和舒适。

《单片机矩阵键盘》课件

《单片机矩阵键盘》课件

矩阵键盘的原理
深入了解矩阵键盘的组成结构、工作原理和扫描方式。
组成结构 工作原理
矩阵键盘由按键和行列引脚组成的矩阵状结构。 通过扫描按键矩阵的行和列,确定被按下的按键。
扫描方式
逐行、逐列或矩阵扫描,用于检测按键的状态。
矩阵键盘的接口设计
详细介绍矩阵键盘的电路设计、接口连接和设计注意事项。
电路设计
设计适合矩阵键盘的电路,确保 信号的正确传输和按键的可靠检 测。
接口连接
将矩阵键盘与单片机进行正确的 接线连接,以实现按键信号的读 取。
设计注意事项
注意接口的稳定性、防抖动处理 和按键状态的判别。
矩阵键盘的编程实现
教授GPIO口的配置、矩阵键盘的扫描方法和状态码处理的编程实现。
1
GPIO口的配置
设置单片机的GPIO引脚,用于连接和控
实验效果演示
展示实验结果,演示矩阵键盘 的按键功能。
总结和展望
总结本课程的学习内容,展望矩阵键盘在更多应用场景中的发展。
1 总结本课程的学习内容
2 展望更多应用场景
回顾矩阵键盘的原理、接口设计和编程实现, 总结学习收获。
探讨矩阵键盘在电子设备、控制系统等领域 的应用前景。
矩阵键盘的扫描方法
ቤተ መጻሕፍቲ ባይዱ
2
制矩阵键盘的行和列。
编写扫描程序,逐行或逐列扫描矩阵键
盘,读取按键状态。
3
状态码处理
根据读取的按键状态码,进行相应的处 理和响应,实现按键功能。
实验演示
展示实验环境的介绍、实验步骤和实验效果。
实验环境介绍
介绍搭建实验所需的硬件和软 件环境。
实验步骤
详细说明进行实验的步骤和操 作流程。

71 键盘工作原理

71 键盘工作原理
(1)键盘与显示器能同时工作; (2)扫描式键盘工作方式; (3)扫描式传感器工作方式; (4)用选通方式送入输入信号; (5)带有8字符的键盘先入先出存储器(FIFO); (6)触点回弹时两键封锁或N键巡回; (7)双排8字或单个16字的数字显示器; (8)可右入或左入的16字节显示器RAM; (9)工作方式可由CPU编程; (10)可编程扫描定时、键盘送入时有中断输出。
图7-10为采用BCD或十六进制——七段锁存译码驱 动器MC14495构成的多位数码管静态显示器与8031的接 口电路。
9
P1.0 P1.1 P1.2 P1.3
8031
P1.4 P1.5 P1.6 P1.7
AB C D LE
MC14 4 9 5
abcd efg
AB C D
LE
MC14 4 9 5
abcd efg
序流程图见图7-3(b)。见书上192页
3
7.2 LED(Light Emitting Diode)数码管 显示器的工作原理
7.2.1 LED的工作原理 常用的LED器2 件:七段数码管和“米3 ”字数码管,如下图所4 示。
它们是由若干只发光二极管做在一起构成的。
D
N
G
g f ab
10 9 8 7 6
R7,LOOP
CLR P1.7
RET
2、动态显示方式 在动态显示方式中,被显示的数据直接由P1口的低4位输出, P1.4~P1.6用来选择数码管,经译码后产生输入锁存选通信 号,由P1.7来控制多位显示器数据字符的改写和锁存。当 P1.7为高电平时,允许改写各位的显示字符;当P1.7输出低 电平时,0~7=1。各位显示字符不变。下面是将显示器缓冲 区78H~7FH中的BCD码送数码管显示器的程序。

51单片机原理图

51单片机原理图

2.3 51单片机增强型学习系统各组成部份原理图及功能简介2.3.1 共阴极数码管动态扫描控制图2.2 51单片机增强型学习系统的四位共阴极数码管动态扫描硬件连接原理图AT89S51单片机P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。

作为输出口用时,每位能驱动8个TTL 逻辑门电路,对端口写“1”可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上接电阻。

AT89S51单片机P2口是一个带有内部上拉电阻的8位双向I/O 口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL 逻辑门电路。

对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2口送出高8位地址数据。

在访问8位地址的外部数据存储器(如执行MOVX @Ri 指令)时,P2口线上的内容(也即特殊功能寄存器SFR 区中P2寄存器的内容),在整个访问期间不改变。

Flash 编程或校验时,P2亦接收高位地址和其它控制信号。

在上面的硬件连接原理图里,我们用到的是P0和P2口控制四位数码管显示的。

四位数码管显示的方式是动态扫描显示,动态扫描显示是单片机中应用最为广泛的一种显示方式之一。

其接口电路如上图是把所有显示器的8个笔划段a-h同名端连在一起由单51单片机增强型学习系统片机的P0.0~P0.7控制,而每一个数码管的公共极(阴极)是各自独立地受单片机P2.7~P2.4控制。

CPU向字段输出口P0口送出字形码时,所有数码管接收到相同的字形码,但究竟是那个数码管亮则取决于P2.7~P2.4的输入结果,所以我们就可以自行决定何时显示哪一位了。

单片机控制系统按键的类型

单片机控制系统按键的类型

012 3 0
456 7 1
8 9 10 11 2
12 13 14 15 3
0 123
图7.5 矩阵式键盘结构
+5 V
矩阵式键盘中,行、列线分别连接到按键开关的两 端,行线通过上拉电阻接到+5V上。当无键按下时,行 线处于高电平状态;当有键按下时,行、列线将导通, 此时,行线电平将由与此行线相连的列线电平决定。这 是识别按键是否按下的关键。然而,矩阵键盘中的行线、 列线和多个键相连,各按键按下与否均影响该键所在行 线和列线的电平,各按键间将相互影响,因此,必须将 行线、列线信号配合起来作适当处理,才能确定闭合键 的位置。
图7.8是一种简易键盘接口电路,该键盘是由8051 P1口 的高、低字节构成的4×4键盘。键盘的列线与P1口的高4位 相连,键盘的行线与P1口的低4位相连,因此,P1.4P1.7是 键输出线,P1.0P1.3是扫描输入线。图中的4输入与门用于 产生按键中断,其输入端与各列线相连,再通过上拉电阻接 至+5 V电源,输出端接至8051的外部中断输入端。
2. 矩阵式键盘按键的识别 识别按键方法很多,其中最常见的方法是扫描法。下 面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。 按键按下时,与此键相连的行线与列线导通,行线在 无键按下时处在高电平。显然,如果让所有的列线也处在 高电平,那么,按键按下与否不会引起行线电平的变化, 因此,必须使所有列线处在低电平。只有这样,当有键按 下时,该键所在的行电平才会由高电平变为低电平。CPU 根据行电平的变化,便能判定相应的行有键按下。8号键按 下时,第2行一定为低电平。然而,第2行为低电平时,能 否肯定是8号键按下呢?
(3) 求按键位置。根据前述键盘扫描法,进行逐 列置0扫描。图7.6中,32个键的键值分布如下(键值 由4位十六进制数码组成,前两位是列的值,即A口数 据,后两位是行的值,即C口数据,X为任意值):

单片机经典长短按程序

单片机经典长短按程序

新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。

我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。

因为这是实际项目中总结出来的经验,学校里面学不到的东西。

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。

当然,我自己也是在多个项目用过,效果非常好的。

好了,工程人员的习惯,废话就应该少说,开始吧。

以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。

用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。

核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。

有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。

1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

2:算法1,用来计算触发变量的。

一个位与操作,一个异或操作,我想学过C 语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

51单片机的矩阵按键扫描的设计C语言程序

51单片机的矩阵按键扫描的设计C语言程序

51单片机的矩阵按键扫描的设计C语言程序以下为一个基于51单片机的矩阵按键扫描的设计C语言程序:```c#include <reg51.h>//定义端口连接到矩阵键盘sbit col1 = P2^0;sbit col2 = P2^1;sbit col3 = P2^2;sbit row1 = P2^3;sbit row2 = P2^4;sbit row3 = P2^5;sbit row4 = P2^6;//声明按键函数char read_keypad(;void maiwhile (1)char key = read_keypad(; // 读取按键值//根据按键值进行相应操作switch(key)case '1'://第一行第一列按键逻辑//在此处添加相应的代码break;case '2'://第一行第二列按键逻辑//在此处添加相应的代码break;//继续处理其他按键//...default://未识别到按键break;}}//按键扫描函数char read_keypacol1 = 0; col2 = 1; col3 = 1; // 激活第一列if (row1 == 0) { // 第一行第一列按键被按下while (row1 == 0); //等待按键释放return '1'; // 返回按键值}if (row2 == 0) { // 第二行第一列按键被按下while (row2 == 0); //等待按键释放return '4'; // 返回按键值}if (row3 == 0) { // 第三行第一列按键被按下while (row3 == 0); //等待按键释放return '7'; // 返回按键值}if (row4 == 0) { // 第四行第一列按键被按下while (row4 == 0); //等待按键释放return '*'; // 返回按键值}col1 = 1; col2 = 0; col3 = 1; // 激活第二列//处理第二列的按键逻辑//...col1 = 1; col2 = 1; col3 = 0; // 激活第三列//处理第三列的按键逻辑//...return '\0'; // 返回空字符表示未检测到按键```以上代码中,我们使用51单片机的P2端口连接到矩阵键盘的列和行,通过扫描不同的列和检测行的状态来判断按键是否被按下。

单片机按键 长按 短按

单片机按键 长按 短按
tim_count = 4;/*锁定长按*/
switch(key_num){
case 1:key_ret = 5;break;
case 2:key_ret = 6;break;
case 3:key_ret = 7;break;
case 4:key_ret = 8;break;
}
}
else{/*短按有效*/
}
ห้องสมุดไป่ตู้}
}
return key_ret;
}
if(key_flag){/*松手*/
key_flag = 0;
switch(key_num){
case 1:key_ret = 1;break;
case 2:key_ret = 2;break;
case 3:key_ret = 3;break;
case 4:key_ret = 4;break;
static bit key_flag = 0;
if((!SET)||(!KUP)||(!KDN)||(!KOK)){/*判断是否有键按下*/
if(++del_count==5){/*计数消抖*/
del_count = 0;
if(++tim_count>4){/*长按识别*/
key_flag = 0;/*短按无效*/
key_flag = 1;/*短按标志位*/
if(!SET)key_num = 1;/*一下用于识别按键*/
if(!KUP)key_num = 2;
if(!KDN)key_num = 3;
if(!KOK)key_num = 4;

实验五:独立式键盘实验

实验五:独立式键盘实验

实验五:独立式键盘实验4.5.1 实验目的1. 掌握单片机独立键盘接口设计方法。

2. 掌握单片机键盘扫描程序设计方法。

3. 掌握按键功能设计方法。

4. 掌握软件消除按键抖动方法。

4.5.2 实验预习1.熟悉Keil集成编译环境的使用方法。

2. 复习单片机C语言程序设计方法。

3. 复习独立键盘工作原理。

4. 复习按键去抖动方法。

4.5.3 实验原理实验板上提供4个独立按键,与单片机接口如图4.5.1所示,每个按键单独接单片机一个I/O接口。

只要将相应端口设为1,然后判断端口状态,如果仍为1,则按键处于断开(释放)状态,如果为0,则按键处于接通(闭合)状态。

图4.5.1 独立键盘电原理图4.5.4 预作实验任务1. 用Proteus仿真软件绘制独立键盘电路图,包括如图4.5.1所示键盘接口,单片机最小系统以及数码管动态显示电路。

2. 简述按键识别过程中如何等待按键释放。

3. 简述按键抖动对单片机系统工作性能的影响,并简介消除按键抖动的方法。

4. 编写按键识别函数,要求正确识别4个按键的状态,如果有按键按下则返回键值,从左到右四个键值分别为1~4。

并通过仿真或实验板验证(要求用软件的方法消除按键抖动)。

5.为实验板上4个按键设定不同的功能,在数码管上显示数字128,4个按键按下后分别对显示的数字做如下修改:key1:数字+1;key2:数字-1;key3:数字+10;key4:数字-10;流程图如图4.5.2所示,试设计完整程序(按键识别子程序KEYSCAN和动态显示子程序DISPLAY可直接调用这里省略)。

图4.5.2 按键功能设计流程图4.5.5 实验任务1.开机时数码管显示1002.按键key1一次数字加1,按键key2一次数字减1。

加到999时再加1归零,减到000时再减1得999。

3.按住键key3不放实现连加功能,每0.2s加1。

4.按住键key4不放实现连减功能,每0.2s减1。

4.5.6 实验步骤1.分析题意,确定算法,绘制主程序流程图。

单片机矩阵式键盘连接方法及工作原理

单片机矩阵式键盘连接方法及工作原理

矩阵式键盘的连接方法和工作原理什么是矩阵式键盘?当键盘中按键数量较多时,为了减少I/O 口线的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样做有什么好处呢?大家看下面的电路图,一个并行口可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别就越明显。

比如再多加一条线就可以构成20 键的键盘,而直接用端口线则只能多出一个键(9 键)。

由此可见,在需要的按键数量比较多时,采用矩阵法来连接键盘是非常合理的。

矩阵式结构的键盘显然比独立式键盘复杂一些,识别也要复杂一些,在上图中,列线通过电阻接电源,并将行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O 口则作为输入端。

这样,当按键没有被按下时,所有的输出端都是高电平,代表无键按下,行线输出是低电平;一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了,具体的识别及编程方法如下所述:二.矩阵式键盘的按键识别方法确定矩阵式键盘上任何一个键被按下通常采用“行扫描法”或者“行反转法”。

行扫描法又称为逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。

因此我们就以“行扫描法”为例介绍矩阵式键盘的工作原理:1.判断键盘中有无键按下将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中;若所有列线均为高电平,则表示键盘中无键按下。

2.判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:依次将行线置为低电平(即在置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

下面给出一个具体的例子:单片机的P1 口用作键盘I/O 口,键盘的列线接到P1 口的低4 位,键盘的行线接到P1 口的高4位,也就是把列线P1.0-P1.3 分别接4 个上拉电阻到电源,把列线P1.0-P1.3 设置为输入线,行线P1.4-P1.7 设置为输出线,4 根行线和4 根列线形成16 个相交点,如上图所示。

单片机89C52行列式键盘扫描程序(汇编)

单片机89C52行列式键盘扫描程序(汇编)

实验八键盘扫描显示实验所需软硬件:KeilSTC-ISPMCS-51 89C52实验箱程序清单:基于汇编语言//连线P0接8列(同时也是数码管的位选线)高电平选中某位。

P3低两位接行P1接数码管(段选线)低电平选中某段亮。

ORG 0000HLJMP MAINMAIN:MOV 30H,#00HMOV 31H,#00HMOV 32H,#00HMOV 33H,#00HMOV 34H,#00HMOV 35H,#00HBEGIN:ACALL SCANACALL CHECKACALL DISPSJMP BEGIN//子程序SCAN 全扫描2次扫描去抖SCAN: ;全扫描MOV R0,#00H ;去抖,扫描2次计数标志MOV A,#00HMOV P0,A ;送列扫描码LOOP:MOV A,P3 ;回读行信号ANL A,#03H ;只取低两位INC R0CJNE A,#03H,K1CLR F0 ;无键,置标志位为0K1:NOPNOPCJNE R0,#02H,LOOP;去抖,扫描2次SETB F0 ;有键,置标志位为1RET//子程序CHECK 逐列扫描确定键码CHECK:MOV R1,#0FEH ;开始逐列扫描,从第0列开始MOV R4,#00H ;记录列号MOV R5,#00H ;记录行号MOV A,R1PUSH ACC ;压栈保留第0列扫描码LOOP1:MOV P0,A ;送列扫描码MOV A,P3ANL A,#03HCJNE A,#03H,K2 ;有键转K2确定为哪一行POP ACC ;无键扫描下一列RL AINC R4CJNE R4,#08H,LOOP1 ; 是否扫描进行到最后一列RETK2:DEC SP ;为保证堆栈平衡CJNE A,#02H,K3 ;分支判断,看是否为第一行SJMP OVERK3:INC R5 ;不是第一行,就是第二行,行码加1 OVER:MOV A,R4ADD A,R5 ;行码+列码=键码PUSH ACC ;键码入栈保护NOPNOPLCALL SCAN ;扫描看手是否松开CJNE A,#03H,OVER ;A=03H,表示手未松开,继续扫描POP ACC ;手松开,键码出栈RET//子程序DISP 键码分离送数码管显示DISP:JNB F0,LOOP3 ;无键不分离键码MOV B,#10 ;有键,要进行十位和个位的分离DIV ABMOV 34H,A ;A为十位MOV 35H,B ;B为个位MOV R0,#30H ;送显示缓冲首地址MOV R2,#01H ;送位选信号,从最低位开始亮LOOP3:MOV A,#0FFHMOV P1,A ;段选:送灭码MOV A,R2MOV P0,A ;送位选信号MOV A,@R0 ;送显示缓冲数据MOV DPTR,#TAB ;查表求字形码MOVC A,@A+DPTRMOV P0,A ;送段选ACALL DELAY1MS ;延时以保持稳定INC R0 ;取下一个数MOV A,R2JB ACC.5,EXIT ;判断位选是否送到最高位RL A ;左移选下一个位。

键盘扫描原理

键盘扫描原理

笔记本键盘的总类:美式、英式、日本各个键盘的区别:键盘的扫描方式:逐行扫描法与线反转法现在的笔记本键盘一般都是16+8的方式,即16个pin输出,对应列;8个输入pin脚,对应行。

键盘输入与输出的结构如下:在Idel状态下,EC把16条输出线全部拉低,使能键盘扫描中断,这样当任意一个按键按下时,就会触发中断(ICU的INT11h),然后EC就开始逐列扫面,比如OUT(0,1,……,15)输出(1,1,……,1,0),(1,1,……,0,1)……(0,1,……,1,1),当数一个列扫描码,得到的行如输入信号为有一个为0的时候,这是得到的列扫描码与行扫描码就是这个键的扫面码。

比如上图按下S6的时候,列与行扫描码就分别为1101,1011。

然后通过扫描码在Scan table里面找对应的键码,传给OS,确定是哪个键。

在上面的图中,我们看到,在输入信号每个上面都有上拉电阻,这个电阻必须有除非EC的输入pin脚上面的有足够的上拉能力,否则扫描就会出现错误。

下图中,是一个正常的键盘矩阵图。

键盘上面的数字就与下面矩阵里面相同的数字对应。

普通键盘结构及工作原理键盘一般有独立式和行列式(矩阵式)两种。

当然还有其它的结构,比如交互式结构等等,不过其它的结构比较少用,在这里就不介绍了。

在中颖的单片机中,有些单片机的LCD 驱动引脚的SEGMENT 口可以共享按键扫描口,当选择为按键扫描口时,可以使用这些口来扫描按键,所以在外部电路可以连接LCD 和按键矩阵,采用分时扫描进行处理,下面也将介绍这个特殊应用的方法和注意的地方。

1、独立式键盘结构独立式键盘是指各个按键相互独立地连接到各自的单片机的I/O 口,I/O口只需要做输入口就能读到所有的按键。

独立式键盘可以使用上拉电阻也可以使用下拉电阻,基本原理是一样的。

使用上拉电阻的独立式键盘结构如图1-3 所示。

(上面这个图是有问题的,应该是行列式的键盘)图1-3 所示的是利用PB 口和PC 口共8 个I/O 口独自连接8 个按键,使用外部上拉电阻构成的独立式键盘。

基于单片机技术的按键扫描电路分析

基于单片机技术的按键扫描电路分析

四、实验验证
为了验证本次演示所介绍的基于单片机技术的按键扫描电路分析的正确性, 我们设计了一个简单的实验:通过单片机控制一个4×4的按键矩阵,实现8个按 键的扫描和识别。实验结果表明,该方法可以有效地实现对多个按键的扫描和识 别。
五、总结
本次演示详细介绍了基于单片机技术的按键扫描电路的基本概念、电路组成、 电路原理、电路板设计以及软件设计等方面的内容。通过实验验证,该方法可以 有效地实现对多个按键的扫描和识别。未来可以进一步研究如何提高按键扫描电 路的性能和稳定性,以及在实际应用中的优化问题。
3、输出控制:经过按键处理后,单片机根据预设的程序对外部设备进行控 制。例如,当按下某个按键时,单片机可以控制一个LED灯的亮灭。
二、单片机按键模块的设计方法
下面以8051单片机为例,介绍一种常见的单片机按键模块设计方法。
1、硬件设计:8051单片机具有 4个并行输入输出口(P0、P1、 P2、P3)
(1)按键抖动:按键抖动是由于按键过程中电压波动引起的现象。为了消 除按键抖动,可以在程序中加入去抖动算法,例如延时检测、两次确认等。
(2)连键:连键是指多个按键同时按下或相互连通的现象。为了避免连键 现象,可以在程序设计时增加防连键处理,例如为每个按键设置唯一的标识符, 同时按下多个按键时只识别其中的一个。
参考内容
在现代电子设备中,按键模块是一种常见的人机交互方式。通过按键,用户 可以向电子设备发送指令,控制设备的运行。单片机作为嵌入式系统的重要分支, 具有体积小、价格低、可靠性高等优点,因此在按键模块设计中具有广泛的应用。
一、单片机按键模块的基本原理
单片机按键模块的工作原理主要包括三个步骤:按键检测、按键处理和输出 控制。
if(KEY != key1) //如果检测到按键状态发生变化 key1 = KEY; //更新输出位状态

实验四键盘扫描及显示设计实验报告

实验四键盘扫描及显示设计实验报告

实验四键盘扫描及显⽰设计实验报告实验四键盘扫描及显⽰设计实验报告⼀、实验要求1. 复习⾏列矩阵式键盘的⼯作原理及编程⽅法。

2. 复习七段数码管的显⽰原理。

3. 复习单⽚机控制数码管显⽰的⽅法。

⼆、实验设备1.PC 机⼀台2.TD-NMC+教学实验系统三、实验⽬的1. 进⼀步熟悉单⽚机仿真实验软件 Keil C51 调试硬件的⽅法。

2. 了解⾏列矩阵式键盘扫描与数码管显⽰的基本原理。

3. 熟悉获取⾏列矩阵式键盘按键值的算法。

4. 掌握数码管显⽰的编码⽅法。

5. 掌握数码管动态显⽰的编程⽅法。

四、实验内容根据TD-NMC+实验平台的单元电路,构建⼀个硬件系统,并编写实验程序实现如下功能:1.扫描键盘输⼊,并将扫描结果送数码管显⽰。

2.键盘采⽤ 4×4 键盘,每个数码管显⽰值可为 0~F 共 16 个数。

实验具体内容如下:将键盘进⾏编号,记作 0~F,当按下其中⼀个按键时,将该按键对应的编号在⼀个数码管上显⽰出来,当再按下⼀个按键时,便将这个按键的编号在下⼀个数码管上显⽰出来,数码管上可以显⽰最近 4 次按下的按键编号。

五、实验单元电路及连线矩阵键盘及数码管显⽰单元图1 键盘及数码管单元电路实验连线图2实验连线图六、实验说明1. 由于机械触点的弹性作⽤,⼀个按键开关在闭合时不会马上稳定地接通,在断开时也不会⼀下⼦断开。

因⽽在闭合及断开的瞬间均伴随有⼀连串的抖动。

抖动时间的长短由按键的机械特性决定,⼀般为 5~10ms。

这是⼀个很重要的时间参数,在很多场合都要⽤到。

键抖动会引起⼀次按键被误读多次。

为了确保 CPU 对键的⼀次闭合仅做⼀次处理,必须去除键抖动。

在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。

按键的抖动,可⽤硬件或软件两种⽅法消除。

2. 为了减少键盘与单⽚机接⼝时所占⽤ I/O 线的数⽬,在键数较多时,通常都将键盘排列成⾏列矩阵形式。

3. 从数码管显⽰⽅式看,数码管分为静态显⽰和动态显⽰两种⽅式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

void keyscan(void) { temp = 0; P1=0xF0; //高四位输入 行为高电平 列为低电 delay(1); //延时 temp=P1; //读P1口 temp=temp&0xF0; //屏蔽低四位 temp=~((temp>>4)|0xF0); if(temp==1) // p1.4 被拉低 h=1; else if(temp==2) // p1.5 被拉低 h=2; else if(temp==4) // p1.6 被拉低 h=3; else if(temp==8) // p1.7 被拉低 h=4; dis_buf = h; dis_buf = dis_buf & 0x0f; // else // key=16; P1=0x0F; //低四位输入 列为高电平 行为低电平 delay(1); //延时 temp=P1; //读P1口 temp=temp&0x0F; temp=~(temp|0xF0); if(temp==1) //p1.0 被拉低 l=1; else if(temp==2) //p1.1 被拉低 l=2; else if(temp==4) //p1.2 被拉低 l=3; else if(temp==8) //p1.3 被拉低 l=4; //else // key=16;
keydown(); //调用按键判断检测程序 P2 = LED7Code[dis_buf%16]&0x7f; P3= LED7Code[dis_buf1%16]&0x7f; //LED7 0x7f为小数点 和共阳此处也是不一样; %16表示输出16进制 delay 0 1 2 3 4 5 6 7 8 9 a b c d e f unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0 /************************************************************* * * * 延时子程序 * * * *************************************************************/ void delay(uchar x) { uchar j; while((x--)!=0) //CPU执行x*12次,x=10 { for(j=0;j<125;j++) {;} } } /************************************************************* * * * 键扫描子程序 (4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行 * * P1.1 P1.2 P1.3为列 * * * *************************************************************/
#include <reg51.h> #define uchar unsigned char //宏的定义变量类型 uchar 代替 unsigned char #define uint unsigned int //宏的定义变量类型 uint 代替 unsigned int uchar dis_buf,dis_buf1; //显示缓存 uchar temp; uchar l,h; //键顺序吗 void delay0(uchar x); //x*0.14MS
dis_buf1= l; //键值入显示缓存 dis_buf1= dis_buf1 & 0x0f; } /************************************************************* * * *判断键是否按下 * * * *************************************************************/ void keydown(void) { P2=0xF0; P3=0xf0; //将高4位全部置1 低四位全部置0 if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一 个端口 { keyscan(); //调用按键扫描程序 } } /************************************************************* * * * 主程序 * * * *************************************************************/ main() { P1=0xFF; //置P0口 P2=0xFF; P3=0xff; //置P1口 delay(10); //延时 while(1) {
相关文档
最新文档