实验一矩阵键盘检测

合集下载

矩阵键盘检测实验

矩阵键盘检测实验

昆明理工大学信息工程与自动化学院学生实验报告(2013 —2014 学年第 2 学期)课程名称:单片机原理及接口技术开课实验室: 2014年5月27日一、上机目的及内容上机目的:掌握单片机I/O口的输入检测的方法、矩阵按键的识别方法、键盘消抖等。

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

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

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

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

三、所用仪器、材料(设备名称、型号、规格等或使用软件)Pc机一台,keil软件,stc-isp四、实验方法、步骤(或:程序代码或操作过程)1、按实验要求在KeilC中创建项目,编辑、编译程序。

2、将编译生成的目标码文件(后缀为.Hex)下载到实验板电路中。

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

程序代码:org 0000hwei bit p2.7duan bit p2.6main: mov p3,#0ffhmov a,p3setb weimov p0,#0ffhclr weimov dptr,#tablem1: mov p3,#0fehmov a,p3cjne a,#0feh,s1jmp s7s1: call delaymov a,p3cjne a,#0feh,s2jmp s7s2: mov a,p3cjne a,#0eeh,s3mov r2,#0jmp s8s3: mov a,p3cjne a,#0deh,s4mov r2,#1jmp s8s4: mov a,p3cjne a,#0beh,s5mov r2,#2jmp s8s5: mov a,p3cjne a,#7eh,s8mov r2,#3jmp s8s8: mov a,p3cjne a,#0feh,s8call displays7: nopjmp m2m2: mov p3,#0fdhmov a,p3cjne a,#0fdh,l0jmp l0l0: call delaymov a,p3cjne a,#0fdh,l2jmp l7l2: mov a,p3cjne a,#0edh,l3mov r2,#4jmp l8l3: mov a,p3cjne a,#0ddh,l4mov r2,#5jmp l8l4: mov a,p3cjne a,#0bdh,l5mov r2,#6jmp l8l5: mov a,p3cjne a,#7dh,l8mov r2,#7jmp l8l8: mov a,p3cjne a,#0fdh,l8call displayl7: nopjmp m3m3 : mov p3,#0fbhmov a,p3cjne a,#0fbh,a0jmp a0a0: call delaymov a,p3cjne a,#0fbh,a2jmp a7a2: mov a,p3cjne a,#0ebh,a3mov r2,#8jmp a8a3: mov a,p3cjne a,#0dbh,a4mov r2,#9jmp a8a4: mov a,p3cjne a,#0bbh,a5mov r2,#10jmp a8a5: mov a,p3cjne a,#7bh,a8mov r2,#11jmp a8a8: mov a,p3cjne a,#0fbh,a8call displaya7: nopjmp m4m4: mov p3,#0f7hmov a,p3cjne a,#0f7h,b0jmp b0b0: call delaymov a,p3cjne a,#0f7h,b2jmp b7b2: mov a,p3cjne a,#0e7h,b3mov r2,#12jmp b8b3: mov a,p3cjne a,#0d7h,b4mov r2,#13jmp b8b4: mov a,p3cjne a,#0b7h,b5mov r2,#14jmp b8b5: mov a,p3cjne a,#77h,b8mov r2,#15jmp b8b8: mov a,p3cjne a,#0f7h,b8call displayb7: nopjmp m1 display:setb weimov p0,#0c0hclr weisetb duanmov a,r2movc a,@a+dptrmov p0,aclr duanretdelay: mov r4,#20dl0: mov r7,#248djnz r7,$djnz r4,dl0rettable: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhdb 77h,7ch,39h,5eh,79h,71hend五、实验过程原始记录( 测试数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

实验一 矩阵键盘检测

实验一  矩阵键盘检测

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

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

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

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

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

前者造价低,后者寿命长。

目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

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

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。

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

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。

由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

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

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

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

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

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

对于一组键或一个键盘,通过接口电路与单片机相连。

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

单片机 矩阵键盘实验 实验报告

单片机 矩阵键盘实验 实验报告

单片机矩阵键盘实验实验报告一、实验目的本次实验的目的是掌握原理和方法,利用单片机识别矩阵键盘并编程实现键码转换功能,控制LED点亮显示。

二、实验原理矩阵键盘是一种由多路单向控制器输入行选择信号与列选择信号连接而形成的一一对应矩阵排列结构。

它广泛应用于电子游戏机、办公自动化设备、医疗仪器、家电控制及书籍检索机器等方面。

本次实验采用的矩阵键盘是一个4 x 4矩阵,用4段数码管显示按键编码,每个按键都可以输入一个代码,矩阵键盘连接单片机,实现一个软件算法来识别键码转化。

从而将键盘中的按键的按下信号转换成程序能够识别的代码,置于相应的输出结果中,控制LED点亮,从而可以实现矩阵键盘按键的转换功能。

三、实验方法1.硬件搭建:矩阵键盘(4行4列)与单片机(Atmel AT89C51)相连,选择引脚连接,并将数码管和LED与单片机相连以实现显示和点亮的功能。

2.程序设计:先建立控制体系,利用中断服务子程序识别和码值转换,利用中断服务子程序实现从按键的按下信号转换为程序能够识别的代码,然后将该代码段编写到单片机程序中,每次按下矩阵键盘按键后单片机给出相应的按键编码输出,用数码管显示,控制LED点亮。

四、实验结果经过实验,成功实现了矩阵键盘与单片机之间的连接,编写了中断服务子程序,完成了按键编码输出与LED点亮的功能。

实验完成后,数码管显示各种按键的编码,同时LED会点亮。

本次实验介绍了矩阵键盘的原理,论述了键码转换的程序设计步骤,并实验完成矩阵键盘与单片机的连接,实现用LED点亮以及数码管显示按键的编码。

通过本次实验,受益匪浅,使我对使用单片机编写算法与程序有了更深入的认识,同时丰富了课堂学习的内容,也使我更加热爱自己所学的专业。

键盘扫描程序实验报告

键盘扫描程序实验报告

一、实验目的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. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。

矩阵式键盘设计实训报告

矩阵式键盘设计实训报告

一、实验目的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*46个也就较好时,低电键按标,独立键盘多按键时就检测。

这里4键盘实现IO 口控无论是独就是检测与好检测,而,先送一列电平,若有按下,送下,然后对其盘与单片机就会浪费里以4*4现了用8控制9个按独立按键还与该键对而矩阵键盘列低电平有低电平则下一列低其编码后矩阵键盘机相连时,很多的IO 矩阵键盘个IO 口控按键,5*5还是矩阵键对应的IO 盘就需要,其余为则证明该电平,通编程扫描盘检测及,每个按键O 口,鉴于盘为例,下控制16个实现10键盘,单口是否为要人为控制高电平,该列有键按过这种方描了。

及其运用键都要占用于对IO 口下面是其与个按键,当个IO 口控片机检测为低电平。

制端口电平立即轮流按下,若无方法,我们用一个IO 口的节省,与单片机连当然也可以控制25个测的依据都独立按键平变化来检流检测一下无低电平证们便可以确O 口,当用引入矩阵连接电路以以3*3实个按键。

都是一样的键一端固定检测了。

检下各行是否证明该列没确定按键的用到阵键图:实现。

的,定比检测否有没有的坐以下是软件流程图:NYNNY N扫描四行按键程序会很长,下面我编程实现扫描出第一行按键,其他各行可用相同方法进行扫描:开始寄存器初始化IO口初始化检测是否有键按下延时10ms 检测是否真有键按下检测按键是否释放执行相应代码/*******************************************************// ////‐‐‐函数功能:扫描矩阵键盘,返回相应按键代表的值 ////‐‐‐主函数中可以利用这一返回值选择执行相关代码 ////‐‐‐这样就实现了矩阵按键对器件的操作 //// //*******************************************************/ unsigned char Matrixkeyscan(){unsigned char temp,key;P3=0xfe; //送一列低电平其余为高确定该列temp=P3; //将P3口的值读回来temp=temp&0xf0; //if(temp!=0xf0) //看是否有IO口为低电平{Delayms(10); //延时去抖temp=P3; //重新读回P3口的值temp=temp&0xf0;if(temp!=0xf0) //看是否真有键按下{temp=P3; //temp的值发生变化需重新读回switch(temp) //判断是哪一行按键被按下,确定按键位置{case 0xee:key=1;break;case 0xde:key=2;break;case 0xbe:key=3;break;case 0x7e:key=4;break;}while(temp!=0xf0)//松手检测 {temp=P3;temp=temp&0xf0;}}}//P3=0xfd; //扫描下一行//。

关于矩阵键盘行列扫描的测试实验

关于矩阵键盘行列扫描的测试实验
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f; // 位定义的引脚
if(GPIO_KEY!=0x0f) //读取按键是否按下
/*******************************************************************************
* 函数名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输入 : 无
* 输出 : 无
* 作者 : INK
* 日期地点 : NANKING
下图就是矩阵键盘 由P1口控制,P10~P13为列 P14~P17为输出低电平,低四位输出高电平,检测低四位不全为高可确定列;反过来高四位输出高电平,低四位输出高电平,高四位不全为高确定行,行列交叉即可获得按键键值。废话不多说,直接上程序,我已经详细注解过了,不懂多看看哈。
{
Delay10ms(); //延时10ms进行消抖
if(GPIO_KEY!=0x0f) //再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{ //此段程序只是为了确定列的值 方便在后面进行测试行的时候加减运算 获得具体案件的行列值 从而转换为按键值
case(0X07): KeyValue=0;break;//扫描第一列
switch(GPIO_KEY)
{ //已经进行过
case(0X70): KeyValue=KeyValue;break;//自己去看为什么是 0X70 列的时候又为什么是0X07 硬件相结合

矩阵键盘实验报告

矩阵键盘实验报告

自主学习用实验矩阵键盘识别实验
一、实验目的
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.实验中有何故障、问题出现,是否得到解决?如何解决的?问题:显示值对应出错。

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

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

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

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

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

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

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

前者造价低,后者寿命长。

目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

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

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。

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

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。

由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

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

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

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

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

因此,键信息输入是与软件结构密单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

3、按键的特点与去抖机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。

其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5 -10 ms。

从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。

即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。

为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。

一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。

(本学习板采用软件去抖方式)。

按键抖动状态图硬件电容去抖按键去抖流程图从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。

键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。

四、实验步骤上面的图的意思是~ 跟~不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。

如果给P3一个扫描初值的话:如0x0F ,则没有键如与连接的键按下,则与为0,即接地了。

则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0低四位保留,可以得到低四位的内容了。

通过去抖操作,即一个delay,可以得到低四位内容。

这里设为:h=P3&0x0F;如果再得到高四位内容,则可以组成一个数,来定位哪个键了。

程序框图:C语言源程序:#include<>sbit beep=P2^3;sbit dula=P2^6;sbit wela=P2^7;unsigned char i=100;unsigned char j,k,temp,key;void delay(unsigned char i){for(j=i;j>0;j--)}Unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};display(unsigned char num){P0=table[num];dula=1;dula=0;P0=0xc0;wela=1;wela=0;}void main(){dula=0;wela=0;while(1){P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;{case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0; beep=0;}beep=1;display(key);P1=0xfe;}}P3=0xfd;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0;}beep=1;display(key); }}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0) {temp=P3;switch(temp) {case 0xeb: key=8; break;case 0xdb: key=9; break;case 0xbb: key=10; break;case 0x7b:break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0; beep=0;}beep=1;display(key);}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key=12;break;case 0xd7:key=13;case 0xb7:key=14;break;case 0x77:key=15;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;display(key);}}}}汇编程序:dula bit ;wela bit ;KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2 WAIT:CLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1 MOV KEYBUF,#0 mov p1,#bLJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#4 mov p1,#bLJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#8 mov p1,#bLJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#12 mov p1,#bLJMP DK1call displayDK1A: MOV A,P3 ;等待释放 ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5MOV KEYBUF,#1mov p1,#bLJMP DK2NK5: CJNE A,#0DH,NK6MOV KEYBUF,#5mov p1,#bLJMP DK2LJMP DK2NK7: CJNE A,#07H,NK8MOV KEYBUF,#13mov p1,#bLJMP DK2NK8: NOPDK2:call displayDK2A: MOV A,P3 ;释放 ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#6mov p1,#bLJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 mov p1,#bLJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#14 mov p1,#bLJMP DK3NK12: NOPDK3:call displayDK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13 MOV KEYBUF,#3mov p1,#bLJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#7mov p1,#bLJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#11 mov p1,#bLJMP DK4NK15: CJNE A,#07H,NK16 mov p1,#bMOV KEYBUF,#15 LJMP DK4NK16: NOPDK4:call displayDK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETdisplay: MOV A,KEYBUF ;查表MOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,Asetb dulaclr dulamov P0,#0c0hsetb welaclr welaclracall ds1ms ;延时,以便人眼可以观察到 setb;acall ds1msretds10ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200djnz r3,$djnz r2,ds2loTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND五、实验现象:当你按下矩阵键盘中的任何一个键,蜂鸣器响一声,并在数码管上显示相应的键值。

相关文档
最新文档