键盘扫描
- 格式:doc
- 大小:27.00 KB
- 文档页数:2
键盘扫描实验实验报告一、实验目的1. 掌握线反转法键盘扫描原理。
2. 了解单片机的输入和输出过程,理解单片机的数据采集过程。
二、实验内容单片机外接4x4键盘,通过线反转法判断按下的键,并在数码管上显示按键对应的数字。
第一行从左到右分别是开关K0, K1, K2, K3,第二行从左到右分别是K4, K5, K6, K7以此类推。
当按下Kn时,在数码管上显示数字n。
三、实验原理线翻转法:先对行(R0-R3)置0,对列(R4-R7)置1。
当有键被按下时,会把按键所在的列的电位从1变0,记录下位置;然后再将行列翻转,记录下按下键的所在行,两数进行或运算,就可以得到一个唯一表示按下键的数字。
例如:假定R0-R7分别与单片机的P2.0-P2.7相连。
先把R4-R7置1,R0-R3置0(通过指令MOV P2, #0F0H实现)。
当键K5被按下时,R5电位被拉低为低电平。
此时,P2口表示的数为:1101 0000(0xD0);然后再置R4-R7为0,R0-R3为1,此时,R1电位被拉低为低电平,此时,P2口表示的数为:0000 1101(0x0D)。
将两数相与取反,得到:0010 0010。
四、实验过程1. 连接好单片机及其外围设备电路2. 编写汇编程序ORG LJMP KeyLJMP K7: CJNE R2, #82H, K8ORG 0100H MOV P0, #0F8H Init: CLR P1.3 LJMP KeyMOV P0, #0C0H K8: CJNE R2, #14H, K9 Key: MOV P2, #0F0H MOV P0, #080HMOV A, P2 LJMP KeyMOV R1, A K9: CJNE R2, #24H, K10MOV P2, #0FH MOV P0, #090HMOV A, P2 LJMP KeyORL A, R1 K10: CJNE R2, #44H, K11CPL A MOV P0, #088HMOV R2, A LJMP KeyJNZ KeyPro K11: CJNE R2, #84H, K12LJMP Key MOV P0, #083H KeyPro: CJNE R2, #11H, K1 LJMP KeyMOV P0, #0C0H K12: CJNE R2, #18H, K13LJMP Key MOV P0, #0C6H K1: CJNE R2, #21H, K2 LJMP KeyMOV P0, #0F9H K13: CJNE R2, #28H, K14LJMP Key MOV P0, #0A1H K2: CJNE R2, #41H, K3 LJMP KeyMOV P0, #0A4H K14: CJNE R2, #48H, K15LJMP Key MOV P0, #086H K3: CJNE R2, #81H, K4 LJMP KeyMOV P0, #0B0H K15: CJNE R2, #88H, K16LJMP Key MOV P0, #08EH K4: CJNE R2, #12H, K5 LJMP KeyMOV P0, #099H K16: LJMP KeyLJMP Key ENDK5: CJNE R2, #22H, K6MOV P0, #092HLJMP KeyK6: CJNE R2, #42H, K7MOV P0, #082H五、实验结果1. 当按下开关Kn时,数码管能够显示对应的数字。
一、实验目的1. 理解键盘扫描的基本原理。
2. 掌握使用C语言进行键盘扫描程序设计。
3. 学习键盘矩阵扫描的编程方法。
4. 提高单片机应用系统的编程能力。
二、实验原理键盘扫描是指通过检测键盘矩阵的行列状态,判断按键是否被按下,并获取按键的值。
常见的键盘扫描方法有独立键盘扫描和矩阵键盘扫描。
独立键盘扫描是将每个按键连接到单片机的独立引脚上,通过读取引脚状态来判断按键是否被按下。
矩阵键盘扫描是将多个按键排列成矩阵形式,通过扫描行列线来判断按键是否被按下。
这种方法可以大大减少引脚数量,降低成本。
本实验采用矩阵键盘扫描方法,使用单片机的并行口进行行列扫描。
三、实验设备1. 单片机开发板(如51单片机开发板)2. 键盘(4x4矩阵键盘)3. 连接线4. 调试软件(如Keil)四、实验步骤1. 连接键盘和单片机:将键盘的行列线分别连接到单片机的并行口引脚上。
2. 编写键盘扫描程序:(1)初始化并行口:将并行口设置为输入模式。
(2)编写行列扫描函数:逐行扫描行列线,判断按键是否被按下。
(3)获取按键值:根据行列状态,确定按键值。
(4)主函数:调用行列扫描函数,读取按键值,并根据按键值执行相应的操作。
3. 调试程序:将程序下载到单片机,观察键盘扫描效果。
五、实验程序```c#include <reg51.h>#define ROW P2#define COL P3void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);}void scan_key() {unsigned char key_val = 0xFF;ROW = 0xFF; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值}void main() {while (1) {scan_key();if (key_val != 0xFF) {// 执行按键对应的操作}}}```六、实验结果与分析1. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。
第一种------传统法uchar scanf(){P3=0xfe;temp=P3&0xf0;if(temp!=0xf0) //判断是否有键按下{delay(5);//给一个延时temp=P3&0xf0;if(temp!=0xf0) //再次判断是否有键按下{temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}}while(temp!=0xf0)//键起,推出程序{temp=P3&0xf0;}}P3=0xfd;temp=P3&0xf0;if(temp!=0xf0){delay(5);temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}}while(temp!=0xf0){temp=P3&0xf0;}}P3=0xfb;temp=P3&0xf0;if(temp!=0xf0){delay(5);temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}}while(temp!=0xf0){temp=P3&0xf0;}}P3=0xf7;temp=P3&0xf0;if(temp!=0xf0){delay(5);temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}}while(temp!=0xf0){temp=P3&0xf0;}}Return(num);}第二种——简单法uchar keyscan(void){uchar scancode,tmpcode;P3 = 0xf0; // 发全0行扫描码if ((P3&0xf0)!=0xf0) // 若有键按下{delay(5); // 延时去抖动if ((P3&0xf0)!=0xf0)// 延时后再判断一次,去除抖动影响{scancode = 0xfe;//相当于从第一行开始扫描1111 1110while((scancode&0x10)!=0) // 控制行我的理解while((P3&0xf0)!=0xf0)(原来的程序转了一个大弯)(原程序,首先进入,使其扫描全行,扫描一次退出;我的:按键复原后,才退出程序;我的程序要扫描多次,但前提是一定扫描得到{P3 = scancode; // 输出行扫描码其实P3变为了1101 1110(假设有键按下)其中因为有键按下,写入的1马上又变为0(只有当行和列都对应时,才会继续下面的运算)即:如果开始按的是1101 1011,那么P3显示的就是1111 1110列中就不会出现0if ((P3&0xf0)!=0xf0) // 本行有键按下(确定行){tmpcode = (P3&0xf0)|0x0f; //确定列return((~scancode)+(~tmpcode)); /* 返回特征字节码,为1的位即对应于行和列*/}elsescancode = (scancode<<1)|0x01; // 行扫描码左移一位,换另一行扫面}}}return(0); // 无键按下,返回值为0}第三种———先行扫描,再列扫描uchar keyscan(void){uchar tag1,tag2;tag1=0xff;tag2=0xff;P3 = 0xf0; // 发全0行扫描码if ((P3&0xf0)!=0xf0) // 若有键按下{delay(5); // 延时去抖动if ((P3&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响{tag1=P3;P3=0x0f;tag2=P3&0x0f;}}return(~(tag1|tag2)); }。
键盘扫描原理
键盘是计算机输入设备中最常用的一种,它通过将人们的按键操作转换成计算机可以识别的信号,从而实现了人机交互。
而键盘的核心部分就是键盘扫描原理,它是如何实现的呢?
首先,我们需要了解键盘的工作原理。
当我们按下键盘上的某一个按键时,就会产生一个按键信号,这个信号会通过键盘的电路传输到计算机主机上。
而键盘扫描原理就是指计算机是如何检测到这个按键信号的。
键盘扫描原理的核心就是矩阵扫描。
键盘上的每一个按键都对应着一个电路,这些电路会以矩阵的形式排列在键盘的背后。
当我们按下某一个按键时,对应的电路就会闭合,从而产生一个按键信号。
计算机会通过扫描这个矩阵来检测到按键信号的产生。
具体来说,计算机会以一定的频率扫描键盘上的每一个按键,检测它们是否产生了按键信号。
这个扫描的频率通常很高,所以我们按下按键时几乎可以立即得到响应。
一旦计算机检测到有按键信号产生,它就会将这个信号转换成相应的键值,从而实现了按键的输入。
除了矩阵扫描,现代键盘还采用了一些其他技术来提高性能和稳定性。
比如采用了多种防抖动技术,防止因按键抖动而产生误操作;采用了多种按键轮询技术,提高了按键的灵敏度和反应速度;还采用了多种按键编码技术,提高了按键的识别准确性和稳定性。
总的来说,键盘扫描原理是键盘工作的核心,它通过矩阵扫描等技术实现了对按键信号的检测和转换,从而实现了人机交互。
随着技术的不断发展,键盘的性能和稳定性会不断提高,为人们的使用体验带来更多的便利和舒适。
键盘扫描芯片键盘扫描芯片是一种用于扫描和控制键盘的集成电路芯片。
它通常嵌入在电脑、手机和其他类似设备的键盘部分。
键盘扫描芯片的功能主要包括以下几个方面:1. 扫描键盘:键盘扫描芯片将键盘上每一个按键都与一个特定的电路连接起来,通过扫描该电路的状态,可以检测到用户是否按下某个按键。
2. 解码按键:扫描芯片一旦检测到按键按下,就会将按键的码值转换为计算机可以识别的数据,然后传输给计算机或其他设备。
3. 键盘状态检测:键盘扫描芯片可以检测键盘上多个按键同时按下的情况,并且能够正确解析这些按键的状态。
4. 控制键盘发光:一些键盘扫描芯片还可以控制键盘上的背光灯或指示灯的亮灭,以提高键盘的可视性。
5. 噪声消除:键盘扫描芯片还可以通过消除按键产生的电磁干扰和噪声,提高键盘的信号质量。
键盘扫描芯片的工作原理主要分为以下几个步骤:1. 扫描电路:键盘扫描芯片通过一组复用电路,逐个扫描键盘上的每一个按键。
具体来说,它会按照一定的频率依次给每一个按键提供电流,然后通过检测电路的电流变化来确定该按键是否被按下。
2. 码值解码:一旦检测到按键按下,键盘扫描芯片会根据每个按键电路的位置和连接关系,将按键的码值转换为对应的计算机可识别的数据。
这样,计算机就能够知道用户按下了哪个按键。
3. 数据传输:键盘扫描芯片将解码后的数据传输给计算机或其他设备。
通常,它会通过串行或并行接口与计算机通信,并根据协议协商好的数据格式传输数据。
键盘扫描芯片的优势主要有以下几点:1. 高效稳定:键盘扫描芯片使用电路扫描的方式,可以快速稳定地扫描和检测键盘上的每一个按键,提高键盘的反应速度和稳定性。
2. 节省成本:键盘扫描芯片的集成度高、体积小,能够将多个功能集成在一个芯片中,减少了所需的电路板面积和元器件数量,从而降低了成本。
3. 可靠性:键盘扫描芯片可以通过软件算法和硬件检测机制,准确判断键盘上按键的状态,避免误操作和按键冲突,提高整个系统的可靠性。
按键扫描原理
按键扫描原理是指通过扫描矩阵来检测键盘上的按键状态。
在常见的键盘中,按键都被布置成一个矩阵的形式,每个按键都被安排在多行多列的位置上。
按键扫描原理的实现主要依靠两个主要组成部分,即行扫描和列扫描。
行扫描是指逐行地扫描键盘的每一行,通过向每一行施加电压或地电压来判断该行上是否有按键按下。
当扫描到某一行时,如果有按键按下,那么该行和对应按键所在的列之间就会有导通的电路。
这样,扫描程序就能够检测到按键的状态。
列扫描是指在行扫描的基础上,进一步扫描每一列,以确定具体按下了哪一个按键。
通过给某一列施加电压,并扫描每一行的电平状态,就可以判断被按下的按键所在的具体位置。
基于行列扫描的原理,键盘控制芯片会不断地轮询键盘的每一行和每一列,以实时地检测键盘的按键状态。
一旦检测到按键的状态发生变化,键盘控制芯片就会将相应的按键码发送给计算机,以实现对按键的输入响应。
总结起来,按键扫描原理通过对按键布置成的矩阵进行行列扫描,以检测键盘上的按键状态。
行扫描用于判断哪一行上有按键按下,列扫描用于确定具体按下了哪一个按键。
这种扫描方式能够高效地检测键盘的按键状态,并实现按键输入的响应。
扫描键盘的原理
键盘扫描原理是通过一种叫做"矩阵扫描"的技术来实现的。
它
主要依靠键盘上方的一组电路来完成输入信号的检测和传递。
具体来说,键盘通常有多行多列的布局。
每个按键都与一个特定的行和列相连,形成一个按键矩阵。
当我们按下某个按键时,键盘的控制器会首先激活按键所在的行,然后依次检查每一列。
如果有任何一列检测到有电流通过,就说明该按键被按下。
为了实现这个过程,键盘内部的控制器会周期性地激活行,并读取列上的电流状况。
它会通过一个循环的方式,每次激活一行并读取所有列的状态,以此来获得所有按键的输入信号。
这种矩阵扫描的方式可以同时检测多个按键的状态,从而实现多键同时按下的功能。
一旦控制器检测到按键被按下,它会将相应的按键码发送给计算机,然后由操作系统或相应的应用程序来处理这个输入。
键盘控制器和计算机之间的通信通常是通过USB或PS/2接口完
成的。
总的来说,键盘的扫描原理就是基于矩阵扫描技术,通过激活行和读取列的方式,检测按键的输入信号,并将其传递给计算机进行处理。
简述列扫描方式检查键盘是否有键闭合的原理
列扫描方式是一种常见的检查键盘是否有键闭合的方法。
它的原理是通过对键盘上的每个键进行扫描,检测键盘是否有键闭合,并将闭合的键输出为相应的输入信号。
键盘是由多个按键组成的,每个按键都有一个开关。
当按下一个按键时,开关闭合,形成一个电路通路,键盘就会产生一个输入信号。
而当按键松开时,开关断开,电路中断,输入信号消失。
为了检测键盘是否有键闭合,列扫描方式首先对键盘的每一列进行扫描。
在扫描的过程中,通过给每一列加上电压,可以检测到是否有按键与该列连接,并产生输入信号。
如果有按键与某一列连接,则该列会检测到输入信号。
接下来,对于每一列检测到输入信号的情况,需要进一步检查该列中具体哪个按键闭合。
这时候,需要对该列中的每个按键进行逐个扫描。
通过给每个按键加上电压,可以检测到是否有按键闭合,并产生相应的输入信号。
如果有按键闭合,则可以确定该按键是闭合的。
通过对每一列进行扫描,并对每一列中的按键进行逐个扫描,列扫描方式可以检测到键盘是否有键闭合,并输出闭合的键为相应的输入信号。
这样,计算机或其他设备就可以根据输入信号进行相应的操作。
总结一下,列扫描方式是通过对键盘的每一列进行扫描,检测是否有按键闭合,并输出闭合的键为相应的输入信号。
它的原理是通过给每一列加上电压,检测是否有按键与该列连接,并通过逐个扫描每个按键,检测是否有按键闭合。
通过这种方式,可以准确地检测键盘是否有键闭合,并输出相应的输入信号。
这种方法简单、有效,被广泛应用于键盘的检测和输入信号的获取。
矩阵式键盘扫描原理矩阵式键盘是我们日常生活中经常接触到的一种输入设备,它广泛应用于计算机、手机、电视遥控器等各种电子产品中。
那么,矩阵式键盘是如何实现按键扫描的呢?接下来,我们将深入探讨矩阵式键盘的扫描原理。
矩阵式键盘通常由若干行和若干列的按键组成。
当用户按下某个按键时,按键所在的行和列会产生连接,从而形成一个电路。
为了检测用户按下的是哪个按键,系统需要对矩阵式键盘进行扫描。
首先,系统会将所有的列设置为输入状态,而所有的行设置为输出状态。
接着,系统会逐一地将每一行的状态设置为高电平,然后读取所有的列的状态。
如果某一列的状态为低电平,那么说明用户按下了与该列相对应的按键。
通过这种方式,系统可以确定用户按下的是哪个按键。
在实际应用中,为了提高扫描的效率,系统会采用一种称为“轮询”的方法。
轮询是指系统会以一定的时间间隔不断地重复上述的扫描过程,从而实时地检测用户的按键操作。
这样一来,即使用户按下按键的时间很短暂,系统也能够准确地捕捉到按键信息。
除了轮询方法,还有一种更高效的扫描方式,即采用中断的方式。
在这种方式下,系统会通过硬件中断或者定时器中断来实现按键的扫描。
当用户按下按键时,会触发相应的中断,系统会立即停止当前的任务,转而处理按键事件,从而提高了对按键的响应速度。
总的来说,矩阵式键盘的扫描原理是通过设置行和列的输入输出状态,逐一扫描每一行的状态,并读取所有列的状态,从而确定用户按下的是哪个按键。
在实际应用中,系统会采用轮询或中断的方式来实现对按键的实时检测和响应。
通过对矩阵式键盘扫描原理的深入了解,我们不仅能够更好地理解矩阵式键盘的工作原理,还能够为我们设计和开发新的输入设备提供一定的参考和启发。
希望本文能够对大家有所帮助,谢谢阅读!。
实验十、键盘扫描显示实验
一、实验目的
1、掌握键盘和显示器的接口方法和编程方法。
2、掌握键盘扫描和LED八段码显示器的工作方式。
二、实验内容
把矩阵键盘上的按键输入的键码在静态数码管上显示出来。
实验程序可分成三个模块:
①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
②显示模块:将显示单元的内容在显示器上动态显示。
③主程序:调用键盘输入模块和显示模块。
三、实验连线
JP4(按键)和JP8(P1)通过8PIN排线连接,JP10(P0)和JP3(数码管)通过8PIN排线连接。
四、实验步骤
根据要求写出程序如下:
#include<reg51.h>
#define unit unsigned int
#define uchar unsigned char
uchar Pre_KeyNo=12,KeyNo=12;
uchar smgcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};
void delay(unit ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
void keyscan()
{
uchar Tmp;
P1=0x0f;
delay(1);
Tmp=P1^0x0f;
switch(Tmp)
{
case 1:KeyNo=0;break;
case 2:KeyNo=1;break;
case 4:KeyNo=2;break;
case 8:KeyNo=3;break;
default:KeyNo=16;
}
P1=0xf0;
delay(1);
Tmp=P1>>4^0x0f;
switch(Tmp)
{
case 1:KeyNo+=0;break;
case 2:KeyNo+=3;break;
case 4:KeyNo+=6;break;
case 8:KeyNo+=9;break;
}
}
main()
{
P0=0x00;
while(1)
{
P1=0xf0;
if(P1!=0xf0)keyscan();
if(Pre_KeyNo!=KeyNo)
{
P0=smgcode[KeyNo-1];
Pre_KeyNo=KeyNo;
}
delay(100);
} }
保存编译生成hex文件并烧写入单片机,观察实验现象。
五、实验现象
按键区,s1到s12按键每按一个键,数码管从数字0到字母b的显示。
其中,按键按键s1、s5、s9显示0~2,按键s2、s6、s10显示3~5,按键s3、s7、s11显示6~8,按键s4、s8、s12显示9~b。
六、实验心得
这次实验是矩阵键盘扫描的线反转法的操作,实验结果也是符合要求。
但是过程中出现了问题,就是扫描数组里的数写成了共阴极,而实验箱的数码管是共阳极的,所以结果出错。
这次实验令我受益匪浅,同时也让我知道了程序不要一味抄书,要联系实际,才能得出最终正确的结果。