汇编实验之矩阵 键盘

合集下载

矩阵键盘实验

矩阵键盘实验

* 实验名 : 矩阵键盘实验* 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3 * 实验效果 : 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

* 注意:***************************************************************** **************/#include<reg51.h>#include"lcd.h"unsigned char PuZh[]=" Pechin Science ";/**************************************************************** **************** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无***************************************************************** **************/void main(void){unsigned char i;LcdInit();for(i=0;i<16;i++){LcdWriteData(PuZh[i]);}while(1){}}#include"lcd.h"/**************************************************************** **************** 函数名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输入 : c* 输出 : 无* 说名 : 该函数是在12MHZ晶振下,12分频单片机的延时。

***************************************************************** **************/void Lcd1602_Delay1ms(uint c) //误差 0us{uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);}}}/**************************************************************** **************** 函数名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输入 : com* 输出 : 无***************************************************************** **************/#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能LCD1602_RS = 0; //选择发送命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //放入命令Lcd1602_Delay1ms(1); //等待数据稳定LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}#elsevoid LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能清零LCD1602_RS = 0; //选择写入命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;// Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4; //发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif/**************************************************************** **************** 函数名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输入 : dat* 输出 : 无***************************************************************** **************/#ifndef LCD1602_4PINSvoid LcdWriteData(uchar dat) //写入数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择输入数据LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}#elsevoid LcdWriteData(uchar dat) //写入数据{LCD1602_E = 0; //使能清零LCD1602_RS = 1; //选择写入数据LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; //写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;}#endif/**************************************************************** **************** 函数名 : LcdInit()* 函数功能 : 初始化LCD屏* 输入 : 无* 输出 : 无***************************************************************** **************/#ifndef LCD1602_4PINSvoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x38); //开显示LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}#elsevoid LcdInit() //LCD初始化子程序{LcdWriteCom(0x32); //将8位总线转为4位总线LcdWriteCom(0x28); //在四位线下的初始化LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}#endif#ifndef __LCD_H_#define __LCD_H_/**********************************当使用的是4位数据传输的时候定义,使用8位取消这个定义**********************************/#define LCD1602_4PINS/**********************************包含头文件**********************************/#include<reg51.h>//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif/**********************************PIN口定义**********************************/#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); //误差 0us /*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat) ;/*LCD1602初始化子程序*/void LcdInit();#endif。

实验一 矩阵键盘检测

实验一  矩阵键盘检测

实验一矩阵键盘检测一、实验目的:1、学习非编码键盘的工作原理和键盘的扫描方式。

2、学习键盘的去抖方法和键盘应用程序的设计.二、实验设备:51/AVR实验板、USB连接线、电脑三、实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。

我们可以通过键盘输入数据或命令来实现简单的人机通信。

1、按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。

前者造价低,后者寿命长.目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别.全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成.由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

2、按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。

也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。

此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。

当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。

因此,键信息输入是与软件结构密切相关的过程。

对于一组键或一个键盘,通过接口电路与单片机相连.单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

实验七,矩阵式键盘输入实验汇总

实验七,矩阵式键盘输入实验汇总

实验七、矩阵式键盘输入实验一、实验目的1.学习矩列式键盘工作原理2.学习矩列式接口的电路设计和程序设计二、实验设备1.仿真器2.单片机最小系统实验教学模块3.矩阵式键盘实验模块4.动态扫描数码管显示模块三、实验要求要求实现:在矩阵式键盘中的某个键被按下时,8位LED动态显示器上最低位显示该键对应的字符,以前的字符向高位推进1位(即类似于计算器)。

注意,在进行该项实验之前,请先进行实验二“数码管动态扫描显示实验”。

四、实验原理矩阵式由行线和列线组成,按键位于行、列的交叉点上。

如图所示,一个4*4的行、列结构可以构成一个由16个按键的键盘。

很明显,在按键数量较多的场合,矩阵式键盘与独立式键盘相比,要节省很多的I/0口。

图7-1 矩阵式键盘结构4.1 矩阵式键盘工作原理按键设置在行、列交节点上,行、列分别连接到按键开关的两端。

行线通过上拉电阻接到VCC上。

平时无按键动作时,行线处于低电平状态,而当有按键按下时,列线电平为低,行线电平为高。

这一点是识别矩阵式键盘是否被按下的关键所在。

因此,各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。

4.2 按键识别方法下面以图7-2中4号键被按下为例,来说明此键是如何被识别出来的。

前已述及,键被按下时,与此键相连的行线电平将由与此键相连的列线电平决定,而行线电平在无键按下时处于高电平状态。

如果让所有列线处于高电平那么键按下与否不会引起行线电平的状态变化,始终是低电平,所以,让所有列线处于高电平是没法识别出按键的。

现在反过来,让所有列线处于低电平,很明显,按下的键所在行电平将也被置为高电平,根据此变化,便能判定该行一定有键被按下。

但我们还不能确定是这一行的哪个键被按下。

所以,为了进一步判定到底是哪—列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。

当第1列为低电平,其余各列为高电平时,因为是键4被按下,所以第1行仍处于低电平状态;当第2列为低电平,其余各列为高电平时,同样我们会发现第1行仍处于低电平状态,直到让第4列为低电平,其余各列为高电平时,因为是3号键被按下,所以第1行的高电平转换到第4列所处的高电平,据此,我们确信第1行第4列交叉点处的按键即3号键被按下。

矩阵键盘程序

矩阵键盘程序

/****************************************************************************** ** 实验名: 矩阵键盘实验* 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3* 实验效果: 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

* 注意:******************************************************************************* /#include<reg51.h>#define GPIO_DIG P0#define GPIO_KEY P1unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char KeyValue;//用来存放读取到的键值void Delay10ms(); //延时10msvoid KeyDown(); //检测按键函数/****************************************************************************** ** 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无******************************************************************************* /void main(void){while(1){KeyDown();GPIO_DIG=~DIG_CODE[KeyValue];}}/****************************************************************************** ** 函数名: KeyDown* 函数功能: 检测有按键按下并读取键值* 输入: 无******************************************************************************* /void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{Delay10ms();//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{//测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测{Delay10ms();a++;}}}}/****************************************************************************** ** 函数名: Delay10ms* 函数功能: 延时函数,延时10ms* 输入: 无******************************************************************************* /void Delay10ms(void) //误差0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}。

矩阵式键盘设计实训报告

矩阵式键盘设计实训报告

一、实验目的1. 掌握矩阵式键盘的工作原理及电路设计方法。

2. 熟悉单片机与矩阵键盘的接口连接及编程技巧。

3. 提高动手实践能力,培养创新意识。

二、实验设备1. 单片机实验平台2. 矩阵键盘模块3. 数字多用表4. 编译器(如Keil51)5. 连接线三、实验原理矩阵键盘是一种常用的键盘设计方式,通过行列交叉点连接按键,从而实现多个按键共用较少的I/O端口。

矩阵键盘通常采用逐行扫描的方式检测按键状态,当检测到按键按下时,根据行列线的电平状态确定按键位置。

四、实验内容1. 矩阵键盘电路设计2. 矩阵键盘编程3. 矩阵键盘测试与调试五、实验步骤1. 电路设计(1)根据矩阵键盘的规格,确定行线和列线的数量。

(2)将行线和列线分别连接到单片机的I/O端口。

(3)在行线上串联电阻,防止按键抖动。

(4)连接电源和地线。

2. 编程(1)初始化单片机的I/O端口,将行线设置为输出,列线设置为输入。

(2)编写逐行扫描程序,逐行拉低行线,读取列线状态。

(3)根据行列线状态判断按键位置,并执行相应的操作。

3. 测试与调试(1)将编写好的程序下载到单片机中。

(2)连接矩阵键盘,观察按键是否正常工作。

(3)使用数字多用表检测行列线电平,确保电路连接正确。

(4)根据测试结果,对程序进行调试,直到矩阵键盘正常工作。

六、实验结果与分析1. 电路连接正确,按键工作正常。

2. 逐行扫描程序能够正确检测按键位置。

3. 按键操作能够触发相应的程序功能。

七、实验总结1. 通过本次实训,掌握了矩阵式键盘的工作原理及电路设计方法。

2. 熟悉了单片机与矩阵键盘的接口连接及编程技巧。

3. 提高了动手实践能力,培养了创新意识。

八、心得体会1. 在实验过程中,遇到了电路连接错误和程序调试困难等问题,通过查阅资料、请教老师和同学,最终成功解决了问题。

2. 本次实训让我深刻体会到理论知识与实际操作相结合的重要性,同时也认识到团队合作的重要性。

九、改进建议1. 在电路设计过程中,可以考虑增加去抖动电路,提高按键稳定性。

矩阵键盘设计实验报告

矩阵键盘设计实验报告

矩阵键盘设计实验报告
矩阵键盘是一种特殊的电子输入设备,其特殊性在于每个按键可以仅由几根线连接而成。

这可以将按键尺寸缩小,同时也减少了接線复杂度。

在本次实验中,我们设计了一个4*4的矩阵键盘。

矩阵键盘的外型是4 *4的按键,其中每个按键由一个PIN组成,连接起来分别连接在一个不同的ROW与COL上。

在使用矩阵键盘时,我们将其连接到一台电脑上,通过电脑程序监视每行每列的通断状态,当一行或者一列被按下,程序会自动捕捉,来表示一个字符或者code.
首先,我们先准备一台电脑,再连接矩阵键盘的各个PIN,用8个信号线将矩阵键盘连接到单片机,再用USB线将单片机连接到电脑上,使用PL 2303驱动链接矩阵键盘和电脑终端。

单片机负责捕获ROW和COL的信号,计算并识别矩阵键盘的按键,将计算出的字符发送至电脑终端,进行小程序的检测。

在电脑端,我们使用Apple系统的终端运行.bash,编写简单的shell脚本实现对矩阵键盘信号识别。

脚本将不断检测矩阵键盘信号状态,根据捕捉到的ROW和COL信号,将其映射出字符信息,在一定时间内输出至终端。

在实验的最后,我们检验了所设计的矩阵键盘是否符合预期效果。

通过代码发送进行按键操作,能检测到正确的字符,表明矩阵键盘的设计及实现满足要求。

本次实验可以作为以后矩阵键盘的参考,深入研究程序软件,提高实验效率。

实验七 矩阵式键盘

实验七   矩阵式键盘

实验七矩阵式键盘一、实验目的1.掌握矩阵式键盘处理的方法。

二、实验内容1.用4×4键盘的键值定义为0~15,并在二位LED数码管上动态显示出来。

三、实验步骤说明用4×4键盘的键值定义为0~15,并在二位LED数码管上动态显示出来。

1) 硬件P0口为字形码,P2口为字选码。

P1控制键盘,其中P1.0~P1.3为输出扫描码,P1.4~P1.7为回复码。

2)程序框架定义函数和数组void DelayMS(uchar x) ;// 延时子程序void Display(uchar y); // 显示子程序uchar keys();// 求键值子程序uchar keyno();//判断是否有键按下uchar code DSY_CODE[] = {0x28, 0x7e, 0xa2, 0x62, 0x74, 0x61, 0x21, 0x7a, 0x20, 0x60};uchar key_value=99;//按键键值//-----------------------------------------------------------------// 主程序//-----------------------------------------------------------------void main(){while(1){设置P1.0~P1.3为输入口全1,P1.4~P1.7为列值,置全0。

调显示函数,显示键值key_value如果有键按下调键值函数并赋给key_value}}//-----------------------------------------------------------------// 延时子程序//-----------------------------------------------------------------void DelayMS(uchar x){}//-----------------------------------------------------------------// 显示子程序//-----------------------------------------------------------------void Display(uchar y){显示黑屏;显示十位延时显示黑屏;显示个位延时}//-----------------------------------------------------------------// 判断是否有键按下子程序,没有返回0,有返回1//-----------------------------------------------------------------uchar keyno(){}//-----------------------------------------------------------------uchar keys();// 求键值子程序,返回键值//-----------------------------------------------------------------uchar keys(){设置P1.0~P1.3为输入口全1,P1.4~P1.7为列值,置全0。

矩阵键盘实验报告

矩阵键盘实验报告

矩阵键盘实验报告矩阵键盘实验报告引言:矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。

本实验旨在通过对矩阵键盘的研究和实验,深入了解其原理和工作机制,并探索其在实际应用中的潜力。

本文将从实验目的、实验步骤、实验结果和讨论四个方面进行论述。

实验目的:1. 理解矩阵键盘的工作原理;2. 掌握矩阵键盘的接线方法;3. 通过实验验证矩阵键盘的可靠性和稳定性。

实验步骤:1. 准备实验材料:矩阵键盘、电路板、导线等;2. 连接电路:将矩阵键盘与电路板通过导线连接;3. 编写程序:使用C语言编写程序,实现对矩阵键盘的扫描和按键检测;4. 烧录程序:将编写好的程序烧录到单片机中;5. 运行实验:按下矩阵键盘上的按键,观察电路板上的指示灯是否亮起。

实验结果:经过实验,我们成功地完成了矩阵键盘的接线和程序烧录,并进行了按键测试。

在按下不同的按键时,电路板上相应的指示灯亮起,证明了矩阵键盘的正常工作。

讨论:1. 矩阵键盘的工作原理:矩阵键盘是由行线和列线组成的,每个按键都与行线和列线相连。

当按下某个按键时,对应的行线和列线会短接,从而使得电流流过该按键,被检测到。

2. 矩阵键盘的接线方法:在本实验中,我们采用了常见的4行4列的接线方式,即将矩阵键盘的4个行线连接到单片机的4个输入引脚上,将4个列线连接到单片机的4个输出引脚上。

3. 矩阵键盘的可靠性和稳定性:通过实验,我们发现矩阵键盘具有较高的可靠性和稳定性。

即使在长时间使用和频繁按键的情况下,矩阵键盘仍能正常工作,并且按键的检测准确率较高。

4. 矩阵键盘的应用潜力:矩阵键盘广泛应用于各种电子产品中,如计算机、手机、电视遥控器等。

它具有结构简单、成本低廉、易于集成等优点,因此在电子产品设计中具有广阔的应用前景。

结论:通过本次实验,我们对矩阵键盘的工作原理和接线方法有了更深入的了解,并验证了其可靠性和稳定性。

矩阵键盘作为一种常见的输入设备,在电子产品设计中具有重要的地位和潜力。

实验三 矩阵键盘检测实验

实验三  矩阵键盘检测实验

实验三矩阵键盘识别实验
一、实验目的
掌握单片机I/O口的输入检测的方法、矩阵按键的识别方法、键盘消抖等。

学会实时程序的调试技巧。

二、实验原理
我们在手动按键的时候,由于机械抖动或是其它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。

三、实验内容
实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0到F,6个数码管同时静态显示即可。

下图中按键s6-s218条线分别联接p3口相连,p3.0~p3.3控制1~4行,p3.4~p3.7控制1~4列。

图1 实验板键盘电路原理图
四、实验步骤
1、按实验要求在Keil中创建项目,编辑、编译程序。

2、将编译生成的目标码文件(后缀为.Hex)传入实验板中。

3、在实验板上运行程序,观察实验运行结果并记录。

汇编矩阵键盘程序

汇编矩阵键盘程序

方法一、ORG 0000HLJMP MAINORG 0100HMAIN:MOV P1,#0F0H //P1口设初值F0,矩阵按键高四位置1,低四位置0,JNB P1.4,Y0 //用JNB检测按键端口,P1.4口低电平跳转 Y0JNB P1.5,Y1JNB P1.6,Y2JNB P1.7,Y3SJMP MAINY0:MOV 30H,#00HMOV P1,#0EFHJNB P1.4,X0MOV P1,#0DFHJNB P1.4,X1MOV P1,#0BFHJNB P1.4,X2MOV P1,#07FHJNB P1.4,X3Y1:MOV 30H,#01HMOV P1,#0EFHJNB P1.0,X0MOV P1,#0DFHJNB P1.1,X1MOV P1,#0BFHJNB P1.2,X2MOV P1,#7FHJNB P1.3,X3Y2:MOV 30H,#02HMOV P1,#0EFHJNB P1.0,X0MOV P1,#0DFHJNB P1.1,X1MOV P1,#0BFHJNB P1.2,X2MOV P1,#7FHJNB P1.3,X3Y3:MOV 30H,#03HMOV P1,#0EFHMOV P1,#0DFHJNB P1.1,X1MOV P1,#0BFHJNB P1.2,X2MOV P1,#7FHJNB P1.3,X3X0:MOV 31H,#00HACALL DELAYMOV P1,#0F0HLJMP JISUANX1:MOV 31H,#01HACALL DELAYMOV P1,#0F0HLJMP JISUANX2:MOV 31H,#02HACALL DELAYMOV P1,#0F0HLJMP JISUANX3:MOV 31H,#03HACALL DELAYMOV P1,#0F0HLJMP JISUAN JISUAN:MOV A,31HMOV B,#04HMUL ABADD A,30HMOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ACC:MOV A,P1ANL A,#0F0HXRL A,#0F0HJNZ CCLCALL MAIN DELAY: MOV R4,#0C5HD1: MOV R5,#43HD0: MOV R6,#10HDJNZ R5,D0DJNZ R4,D1RETTAB: DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 DB 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71方法二、ORG 0000HLJMP STARTKEYSBUF EQU 30HORG 0100HSTART:MOV P1,#0F0HMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ STARTLCALL DELAYMOV P1,#0F0HMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ STARTMOV P1,#0FEH //第0行置0CLR P1.0MOV A,P1ANL A,#0F0H //与逻辑,高位保留CJNE A,#0E0H,K1 //高四位为1110,数字0亮MOV KEYSBUF,#0LJMP DISPLAYK1: CJNE A,#0D0H,K2 // 高四位为1101,数字1亮MOV KEYSBUF,#1LJMP DISPLAYK2: CJNE A,#0B0H,K3// 高四位为1011,数字2亮MOV KEYSBUF,#2LJMP DISPLAYK3: CJNE A,#070H,K4 //高四位为0111,数字3亮MOV KEYSBUF,#3LJMP DISPLAYK4: MOV P1,#0FDH //第1行置0MOV A,P1ANL A,#0F0HCJNE A,#0E0H,K5 //高四位为1110,数字4亮MOV KEYSBUF,#4LJMP DISPLAYK5: CJNE A,#0D0H,K6 // 高四位为1101,数字5亮MOV KEYSBUF,#5LJMP DISPLAYK6: CJNE A,#0B0H,K7// 高四位为1011,数字6亮MOV KEYSBUF,#6LJMP DISPLAYK7: CJNE A,#070H,K8 //高四位为0111,数字7亮MOV KEYSBUF,#7LJMP DISPLAYK8: MOV P1,#0FBH //第2行置0MOV A,P1ANL A,#0F0HCJNE A,#0E0H,K9 //高四位为1110,数字8亮MOV KEYSBUF,#8LJMP DISPLAYK9: CJNE A,#0D0H,K10 // 高四位为1101,数字9亮MOV KEYSBUF,#9LJMP DISPLAYK10: CJNE A,#0B0H,K11// 高四位为1011,数字A亮MOV KEYSBUF,#10LJMP DISPLAYK11: CJNE A,#070H,K12 //高四位为0111,数字B亮MOV KEYSBUF,#11LJMP DISPLAYK12: MOV P1,#0F7H //第3行置0MOV A,P1ANL A,#0F0HCJNE A,#0E0H,K13 //高四位为1110,数字C亮MOV KEYSBUF,#12LJMP DISPLAYK13: CJNE A,#0D0H,K14 // 高四位为1101,数字D亮MOV KEYSBUF,#13LJMP DISPLAYK14: CJNE A,#0B0H,K15// 高四位为1011,数字E亮MOV KEYSBUF,#14LJMP DISPLAYK15:MOV KEYSBUF,#15 //高四位为0111,数字F亮LJMP DISPLAYDISPlAY:MOV DPTR,#TABMOV A,KEYSBUFMOVC A,@A+DPTRMOV P0,ACC: MOV A,P1ANL A,#0F0HXRL A,#0F0HJNZ CCLJMP STARTDELAY:MOV R6,#10D1:MOV R7,#248D2:DJNZ R7,D2DJNZ R6,D1RETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND。

实验5-独立键盘和矩阵键盘

实验5-独立键盘和矩阵键盘

实验5 独立键盘和矩阵键盘一、实验目的1、学会用C语言进行独立按键应用程序的设计。

2、学会用C语言进行矩阵按键应用程序的设计。

二、实验内容1、独立按键:对四个独立按键编写程序:当按k1时,8个LED同时100ms闪烁;当按k2时,8个LED从左到右流水灯显示;当按k3时,8个LED从右到左流水灯显示;当按k4时,8各LED同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭;2、矩阵按键:采用键盘扫描方式,顺序按下矩阵键盘后,在一个数码管上顺序显示0~F,采用静态显示即可。

3、提高部分(独立按键、定时器、数码管动态扫描):编写程序,实现下面的功能。

用数码管的两位显示一个十进制数,变化范围为00~59,开始时显示00,每按一次k1,数值加1;每按一次k2,数值减1;每按一次k3,数值归零;按下k4,利用定时器功能使数值开始自动每秒加1;再按一次k4,数值停止自动加1,保持显示原数。

三、实验步骤1、硬件连接(1)使用MicroUSB数据线,将实验开发板与微型计算机连接起来;(2)在实验开发板上,用数据线将相应接口连接起来;2、程序烧入软件的使用使用普中ISP软件将HEX文件下载至单片机芯片内。

查看结果是否正确。

四、实验结果——源代码1. #include "reg52.h"typedef unsigned char u8;typedef unsigned int u16;#define LED P2sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;const char tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u8 code begMid[]={0x7e, 0xbd,0xdb,0xe7, 0xdb, 0xbd, 0x7e}; void Delay(u16 i){ while(i--);}void KeyDown(){u8 i;if(key2==0){Delay(1000);if(key2==0){for(i=0;i<8;i++){LED=tab[i];Delay(50000);}while(!key2);}LED=0xff;}else if(key1==0){Delay(1000);if(key1==0)for(i=0;i<3;i++){LED=0x00;Delay(10000);LED=0xff;Delay(10000);}}}}void Int0Init(){IT0=1;EX0=1;EA=1;}void Int1Init(){IT1=1;EX1=1;EA=1;} void main(){Int0Init();Int1Init();while(1){KeyDown();}}void Int0() interrupt 0{u8 i;if(key3==0){Delay(1000);if(key3==0)for(i=7;i>=0;i--){LED=tab[i];Delay(50000);}}}}void Int1() interrupt 2{u8 i;if(key4==0){Delay(1000);if(key4==0){for(i=0;i<=6;i++){LED=begMid[i];Delay(50000);}}}}2.#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 KeyValue;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//??0~F?? void delay(u16 i){while(i--);}void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f){delay(1000);if(GPIO_KEY!=0x0f){GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0)){delay(1000);a++;}}}}void main(){LSA=0;LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=smgduan[KeyValue];}}3.#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;#define KEYPORT P3sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit key1=P3^1;sbit key2=P3^0;sbit key3=P3^2;sbit key4=P3^3;u16 t;u8 sec;u8 DisplayData[2];u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Time1Init(){TMOD |= 0x10;TH1=0Xd8;TL1=0Xf0;EA=1;ET1=1;}void delay(u16 i){while(i--); }void DigDisplay(){u8 i;for(i=0;i<2;i++){switch(i){case 0:LSA=0;LSB=0;LSC=0;break;case 1:LSA=1;LSB=0;LSC=0;break;}P0=DisplayData[i];delay(100);P0=0x00;}}void datapros(){DisplayData[0]=smgduan[sec%10];DisplayData[1]=smgduan[sec/10];}void main(){Time1Init();while(1){if(key4==0){delay(1000);if(key4==0){TR1=!TR1;while(key4==0);}}if(key3==0){delay(1000);if(key3==0){sec=0;while(key3==0);}}if(key2==0){delay(1000);if(key2==0){sec--;while(key2==0);}}if(key1==0){delay(1000);if(key1==0){sec++;while(key1==0);}}}}void Time1() interrupt 2{TH1=0Xd8;TL1=0Xf0;t++;if(t==100){t=0;sec++;if(sec>=60){sec=0;}}datapros();DigDisplay();}五、实验体会——结果分析1、独立按键:位定义四个按键key1、key2、key3、key4,宏定义LED为P2口,tab数组保存流水灯D0-D7依次点亮的数值,begMid数组保存流水灯同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。

8086矩阵键盘显示

8086矩阵键盘显示

1. 实验要求利用可编程并行接口芯片 8255A 设计一个键盘与 LED 显示器接口。

1)系统设置一个 4 行×4 列的行/ 列扫描式键盘和一个 8 位的共阴极七段数码管2)键盘提供 0~F 这 16 个十六进制数字键,采用行/列扫描式接口,数码管采用动态扫描的方式;3)编写程序,将键盘键入的数字,采用左移的方式显示在数码管上;4)按下 C 键清除所有显示内容。

2. 实验目的1)熟练掌握 8086 汇编语言程序设计以及可编程接口芯片应用技术;2)掌握 Proteus 仿真软件的基本操作与调试功能;3)掌握基于 Proteus 的 8086 应用系统软硬件设计与调试方法与步骤,并完成仿真实验3. 实验分析本实验可具体分解为三大部分,分别是扫描式矩阵键盘的实现,左移数码管的实现以及清零键的实现。

扫描式矩阵键盘的原理如下:设定行线输出,列线输入,行线逐行输出0,如果某列有按键,则列线输入为 0;若无按键,列线输入全为 1。

在本实验中,我们将 8255A 的 C 口单元作为负责扫描式键盘的端口。

在代码的编程上,我们让 C 口的低四位输出全为 0,高四位输入检查是否有 0从而判断是否有按键按下,该段语句通过 loop 语句完成循环进行重复检查按键的按下情况。

假如有按键按下,则通过逐行扫描的形式获取按下按键的行数以及列数,再通过该行数与该列数形成的坐标信息得出是哪个按键按下。

左移数码管的实现需要两个子功能:第一个功能是要输出键盘对应的数字,第二个功能是要实现数字的左移功能。

本实验中,我们将 8255A的 A 口负责键盘对应字形码的输出, B 口负责对应位码的输出。

首先,在获取键盘按下的坐标后,我们在对应的表格中得到要输出的字形码。

接着字形码入栈和出栈的操作以及指针sp 的操作实现对应码数和字型码的输出,也就成功实现了左移功能。

程序中必须设定延时以防止两个数同时显示。

清零键的设定实现的是按下清零键消除数码管中所有显示数字的功能。

矩阵键盘实验报告

矩阵键盘实验报告

自主学习用实验矩阵键盘识别实验
一、实验目的
1、掌握 4×4 矩阵键盘的工作原理和键盘的扫描方式。

2、掌握键盘的去抖方法和键盘应用程序的设计。

二、实验设备
1、PC 机一台;
2、开放式模块化单片机教学实验箱一台;
3、USB 下载线一根。

三、实验内容
自行编制程序,用 51 单片机实现 4×4 矩阵键盘扫描,采用线反转法;并实现当S11按下时在数码管上显值“0”,当S12按下时在数码管上显值“1”……,即依次将 S11 至S26按下,在数码管上依次显示十六进制数“0-F”,矩阵键盘原理图如图1-1 所示。

单片机与数码管接口电路原理图如图 1-2 所示。

图 1-1 矩阵键盘接口电路
图 1-2 数码管接口电路原理图
四、思考题
1.画出所编程序的流程图;
2.若要实现2×4 矩阵键盘,软硬件作如何修改。

答:将行线P2^3, P2^4接线去掉。

程序对应部分P2=0xfd; P2=0xfe;删掉。

3.实验中有何故障、问题出现,是否得到解决?如何解决的?问题:显示值对应出错。

原来是共阳段码和共阴段码弄相反了。

矩阵键盘实训报告心得(3篇)

矩阵键盘实训报告心得(3篇)

第1篇一、引言随着科技的不断发展,计算机键盘已经成为我们日常生活中不可或缺的输入设备。

矩阵键盘作为一种新型的键盘技术,因其高可靠性、低功耗、高集成度等优点,被广泛应用于计算机、手机、POS机等领域。

为了更好地掌握矩阵键盘的原理和应用,我参加了本次矩阵键盘实训课程。

以下是我对本次实训的心得体会。

二、实训内容本次实训主要包括以下内容:1. 矩阵键盘原理学习:通过学习矩阵键盘的原理,了解其组成结构、工作方式以及按键扫描方法。

2. 矩阵键盘电路设计:根据实训要求,设计一个矩阵键盘电路,包括按键电路、驱动电路、扫描电路等。

3. 矩阵键盘软件编程:编写程序实现矩阵键盘的功能,包括按键扫描、按键消抖、按键识别等。

4. 矩阵键盘实物制作与调试:将设计好的电路板焊接成实物,并进行调试,确保矩阵键盘能够正常工作。

三、实训心得1. 矩阵键盘原理的认识通过本次实训,我对矩阵键盘的原理有了更深入的了解。

矩阵键盘由行列线构成,行列交叉处放置按键。

当按键被按下时,会形成一条通路,使得行列线之间存在一定的关系。

通过扫描行列线,可以判断出哪个按键被按下,从而实现键盘的功能。

2. 电路设计能力的提升在实训过程中,我学会了如何设计矩阵键盘电路。

首先,根据实训要求,确定了电路的组成和功能。

然后,根据电路原理图,选择合适的元器件,并绘制出电路原理图。

最后,根据电路原理图,焊接电路板,并对电路进行调试。

通过这个过程,我的电路设计能力得到了很大的提升。

3. 软件编程能力的提高在实训过程中,我学会了编写矩阵键盘的软件程序。

首先,根据实训要求,确定了程序的功能和实现方式。

然后,使用C语言编写程序,实现按键扫描、按键消抖、按键识别等功能。

最后,将程序烧写到单片机中,并进行调试。

通过这个过程,我的软件编程能力得到了很大的提高。

4. 实物制作与调试的体会在实训过程中,我将设计好的电路板焊接成实物,并对实物进行调试。

在焊接过程中,我学会了如何正确焊接电路板,以及如何避免常见的焊接问题。

4×4矩阵按键模拟编程及控制仿真(汇编+C语言)

4×4矩阵按键模拟编程及控制仿真(汇编+C语言)

4×4矩阵按键模拟编程及控制仿真(汇编+C语言)4×4矩阵按键模拟编程及控制仿真(中级实验)实验介绍:利用单片机控制一组矩阵按键(4×4)以及一个数码管,当按键按下后,数码管会显示按下按键的序号。

共16个按键,序号从0开始,一直到F。

(矩阵按键较独立按键更节省I/O口,例如在本例中,共有16个按键,仅仅需要8个I/O 口,而采用独立按键则需要16个I/O 口。

在I/O口使用较多,且按键较多的情况下可以采用。

但是矩阵按键的程序要比独立按键复杂。

)实验目的:通过本次实验,理解矩阵按键的结构以及工作原理。

能够根据使用需求,独立设计矩阵按键的电路图,能够编程实现对矩阵按键的控制。

通过与独立按键的对比,理解矩阵按键与独立按键的硬件及软件的区别。

通过对比的方式,理解各自的优缺点。

仿真原理图:使用Proteus仿真软件搭建仿真原理图如下图所示。

图1图2使用仿真软件Proteus搭建的原理图参考如图1所示。

(注意事项:一般情况下,采用矩阵按键的形式来控制单片机时,按键数量较多,所以在摆放按键的时候要成行成列的防止,一方面是比较美观,另外一方面是便于编程控制。

另外矩阵按键电路比较复杂,电路连线往往比较多,为了让电路看起来更加简洁,可以采用“Terminal Label”的方式进行连线。

如图2所示,电路连接简化很多。

)编程思路:对于独立按键,编程过程较为简单,按照顺序逐个编写就行。

主要分为两种编程控制方法:按键扫描的方式以及中断的方式。

按键扫描的方式需要实时扫描每个按键是否按下。

编程时,首先通过单片机实时判断第一个按键是否按下,如果按下就执行相应的程序。

只要编制出来第一个按键的程序,其他按键的程序基本相同,只要稍作修改即可。

也可以使用中断的方式实现,这种方式一般需要配合外部的电路来实现。

掌握外部中断控制的读者,可以使用。

矩阵按键的编程思路一般为:实时判断按键的按下情况,首先将连接每一行按键的单片机引脚设置为低电平(每一列按键的单片机引脚设置为输入状态即高电平),判断哪一列按键有按下。

矩阵键盘资料(在实验五十中)

矩阵键盘资料(在实验五十中)

TECHISHINE
有了表 50-2,要写出键盘译码电路的 VHDL 程序就非常容易了,尤其针对有表可以对照
的电路设计,只要使用 CASE-WHEN 或 WHNE-ELSE 语句,便可轻松完成设计。
表 50-2 键盘参数表
SEL2~SEL0 KIN3~KIN0
对应的 键盘译 按键功 按键 码输出 能
010
1101
REG 10010 功能键
1011
C
01100 字母 C
表 50-1 按键位置与数码关系
122
Beijing Techshine Technology Co.
TECHISHINE
SEL2~SEL0 000
KIN3~KIN0 1110 1101 1011
对应的按键 0 6
LAST
0111
CTRL
1110
1
1101
7
001
1011
STEP
0111
EMPTY1
5
1101
B
111
1011
ENTER
0111
NONE
光靠矩阵键盘是无法正确地完成输入工作的,另外还需搭配以下几个电路模块: 1、 时钟产生电路
当一个系统中使用不同操作频率的脉冲波形时,最方便的方法就是利用一个自由计数器 来产生各种频率。本电路中就使用三种不同频率的工作脉冲波形。它们分别是:系统时钟(它 是系统内部所有时钟的提供者,频率最高)、弹跳消除取样信号、键盘扫描信号和七段显示器 扫描信号。在很多的电路设计中,键盘扫描信号和七段显示器扫描信号可以使用相同的时钟 信号,本设计也采用此方法。
Beijing Techshine Technology Co.

矩阵键盘程序(汇编+lcd显示)

矩阵键盘程序(汇编+lcd显示)

; p0接lcd; p2接矩阵键盘rs equ p1.5 ;确定具体硬件的连接方式rw equ p1.6 ;确定具体硬件的连接方式e equ p1.7 ;lcd1602引脚org 0hmain:acall startmov p0,#8fh ;写入显示起始地址(第一行第一个位置)acall enable ;调用写入命令子程序mov r0,#2fhmov 2fh,#30hmov r6,#1acall write1d: mov 56h,#0mov r1,#50hmov 54h,#2fhtest: ;键盘扫描mov p2,#0f0hmov a,p2cjne a,#0f0h,havesjmp testhave:mov a,#0fehnext:mov b,amov p2,aread:mov a,p2anl a,#0F0hcjne a,#0F0h,scondmov a,brl acjne a,#0efh,nextscond:acall daymov a,p2anl a,#0f0hcjne a,#0f0h,jssjmp testjs:mov r2,amov a,banl a,#0fhorl a,r2ajmp mains1: cjne a,#0d7h,s4mov b,#31h ;1的ACSII值为31Hajmp yzs4: cjne a,#0b7h,s7mov b,#34hajmp yzs7: cjne a,#77h,s0mov b,#37hajmp yzs0: cjne a,#0ebh,s2mov b,#30hajmp yzs2: cjne a,#0dbh,s5mov b,#32hajmp yzs5: cjne a,#0bbh,s8mov b,#35hajmp yzs8: cjne a,#7bh,s3mov b,#38hajmp yzs3: cjne a,#0ddh,s6mov b,#33hajmp yzs6: cjne a,#0bdh,s9mov b,#36hajmp yzs9: cjne a,#7dh,testmov b,#39hajmp yzyz:mov a,56hcjne a,#0,yz1sjmp yz2yz1:cjne @r1,#10,yz2ajmp testyz2:cjne r1,#50h,yz3mov 55h,#0mov 58h,#0mov a,56hmov 56h,#1mov 50h,#0mov r0,#20hyz3:cjne @r1,#1,yz4mov r0,54hcjne @r0,#30h,yz4mov @r0,#0mov @r1,#0yz4:mov r2,#8yz5:mov a,54hsubb a,r2mov r0,amov a,@r0dec r0mov @r0,adec r2inc r0mov a,r0cjne a,54h,yz5mov r0,54hmov @r0,bacall showajmp testshow:acall startmov a,#8fhsubb a,@r1mov p0,a ;写入显示起始地址(第一行第一个位置)acall enable ;调用写入命令子程序mov a,54hsubb a,@r1mov r0,ainc @r1mov a,@r1mov r6,aacall write1ret;lcd1602部分start:mov p0,#1h ;清屏并光标复位acall enable ;调用写入命令子程序mov p0,#8h ;设置显示模式:8位2行5x7点阵acall enable ;调用写入命令子程序mov p0,#0ch ;显示器开、光标关acall enable ;调用写入命令子程序mov p0,#6h ;文字不动,光标自动右移acall enable ;调用写入命令子程序retenable:clr rs ;写入控制命令的子程序clr rwclr eacall delaysetb eretwrite1:mov a,@r0lcall write2 ;调用写入数据寄存器子程序inc r0 ;取码指针加1djnz r6,write1retwrite2:mov p0,asetb rs ;rs=1clr rw ;rw=0准备写入数据clr e ;e=0执行显示命令acall delay ;判断液晶模块是否忙?(用延时代替) setb e ;e=1retdelay:mov r2,#2fhdl1:mov r3,#0fhdjnz r3,$djnz r2,dl1retday:mov r2,#100 ;按键延时0.1sdl3:mov r3,#250dl2:nopnopdjnz r3,dl2djnz r2,dl3retend。

实验二 矩阵键盘实验

实验二 矩阵键盘实验

实验二矩阵键盘实验一、实验目的(1)掌握矩阵键盘行列设计方法;(2)掌握矩阵键盘识别方法;(3)掌握矩阵键盘去抖原理;(4)掌握矩阵键盘控制LED或数码管的设计方法;二、实验原理电路图参考实验板电路。

1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。

然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。

这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。

由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

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

计算机原理实验室实验报告课程名称:姓名学号班级成绩设备名称及软件环境实验名称矩阵键盘实验日期一.实验内容掌握4×4矩阵式键盘程序识别原理及4×4矩阵式键盘按键的设计方法。

二.理论分析或算法分析用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。

4×4矩阵式键盘识别电路原理图:键盘中对应按键的序号排列:电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)1、4×4矩阵键盘识别处理。

2、每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

3、程序流程图:4、汇编源程序:;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100H START: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START ;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1MOV COUNT,#0LJMP DKK1: CJNE A,#0DH,K2MOV COUNT,#4LJMP DKK2: CJNE A,#0BH,K3MOV COUNT,#12 K4: NOPLJMP DKSW1: MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1 LJMP DKK5: CJNE A,#0DH,K6MOV COUNT,#5 LJMP DKK6: CJNE A,#0BH,K7MOV COUNT,#9 LJMP DKK7: CJNE A,#07H,K8MOV COUNT,#13 K8: NOPLJMP DKSW2: MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2 LJMP DKK9: CJNE A,#0DH,KAMOV COUNT,#6 LJMP DKKA: CJNE A,#0BH,KBMOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW4LCALL DELAY10MS JZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KD MOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KEMOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KFMOV COUNT,#11 LJMP DKKF: CJNE A,#07H,KGMOV COUNT,#15 KG: NOPLJMP DKSW4: LJMP PANDUANDK: RET;;;;;;;;;;显示程序;;;;;;;;;;XIANSHI: MOV A,COUNTMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>unsigned char code table[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};void main(void){ unsigned char i,j,k,key;while(1){ P3=0xff; //给P3口置1//P3_4=0; //给P3.4这条线送入0//i=P3;i=i&0x0f; //屏蔽低四位//if(i!=0x0f) //看是否有按键按下//{ for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);if(i!=0x0f) //再次判断按键是否按下//{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}P0=table[key]; //送数到P0口显示//}P3=0xff;P3_5=0; //读P3.5这条线//i=P3;i=i&0x0f; //屏蔽P3口的低四位//if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);i=P3; //再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){ switch(i) //如果有,显示相应的按键//{ case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}P0=table[key]; //送入P0口显示//}}P3=0xff;P3_6=0; //读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:break;case 0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0; //读P3.7这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)五.结论报告提交日期(注意:内容写不下时允许表格添加新行。

A4纸张(全班要求统一)边距上下左右2厘米,表格要求满页,字体宋体5号,固定单倍行距,文字部分用汉字排版格式,左对齐)(本备注允许删除)。

相关文档
最新文档