实验七_单片机键盘LED显示实验
第7章 键盘与LCD显示

程序代码
图7-5 原理图
7.1.2 键盘消抖
延时消抖的延时时间一般在10毫秒左右。在上面例子 的主程序中,通过while(1)循环一直在判断按键的状 态,除此之外并没有做其它的工作,这仅仅是为了理 解和学习对按键的操作。在实际的项目中,主程序中 可能包含有各种各样的工作,比如对温湿度及其它物 理量的测量、控制和数据处理等,如果在延时10ms消 抖的过程中,某一事件发生了,那么该事件可能就检 测不到,因此要尽量缩短延时时间,并能可靠消抖。 常用的方法有以下两种。
指令功能
指令编码
功能设置 RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0
0
0
0
1
DLNF××功能: 位名
DL 0 数据总线为 4 位
设置 1 数据总线为 8 位
N 0 显示 1 行
1 显示 2 行
F 0 5×7 点阵/每字符
1 5×10 点阵/每字符
随书开发板采用的是8位数据总线,如果采用2行显示,只能采 用5×7 点阵。因此DL=1,N=1,F=0,则该指令为38H。
7.1.2 键盘消抖
抖动
稳定
抖动
图7-4 键抖动
软件消抖:检测到有按键闭合时,延时一小段时间之后再次检 测,如果仍然检测到按键闭合,则认为按键真正闭合。
7.1.2 键盘消抖
【例7-2】在数码管最低位显示按键KEY2按下次数。
图7-5 原理图
7.1.2 键盘消抖
【例7-2】在数码管最低位显示按键KEY2按下次数。
• main.c文件 • 从原理图也可以看出,每个按键按下时,对应I/O口线输入是
低电平,而P0口所接的LED也是低电平驱动,逻辑状态一致, 可以直接输出,若LED是高电平驱动的话,就需要把按键的状 态取反后再输出。
单片机实验报告7、8 (1)

嵌入式系统基础实验报告实验七矩阵键盘编程实验2012年5月8日实验七矩阵键盘编程实验一、实验目的利用单片机常见的人-机交互设备接口控制输入输出。
二、实验要求了解行列翻转法进行矩阵键盘解码的工作原理;掌握行列翻转法矩阵键盘解码的编程方法;编写主程序,实现任意按下某键,其对应的键值能够在数码管上显示出来。
三、实验原理矩阵式键盘由行线和列线组成,按键位于行列式的交叉点上,一个4*4的行列结构可以构成一个含有16个按键的键盘,显然,在按键数量较多时,矩阵键盘较之独立键盘要节省很多I、O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V 上。
四、实验内容1、打开KEIL界面,新建一个工程文件,命名为“LED灯.asm”,并保存在D盘中。
2、选择File\new,然后选择File\save as,在弹出的对话框中写入文件名,将其保存。
3、单击Target 1前面的“+”号,展开里面的内容Source Group 1,用右键单击Source Group 1,弹出的菜单中选择Add Files to Group“Source Group 1”,将汇编文件添加到项目文件下。
4、输入程序如下:KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2NK1: CJNE A,#0DH,NK2MOV KEYBUF,#1LJMP DK1NK2: CJNE A,#0BH,NK3MOV KEYBUF,#2LJMP DK1NK3: CJNE A,#07H,NK4MOV KEYBUF,#3LJMP DK1NK4: NOPDK1: MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ANK5: CJNE A,#0DH,NK6MOV KEYBUF,#5LJMP DK2NK6: CJNE A,#0BH,NK7MOV KEYBUF,#6LJMP DK25、编译无误后,运行并生成十六进制文件,将实验板插入计算机中,调入该程序。
单片机 键盘接口实验

实验六键盘接口实验一、实验目的1、掌握Keil C51软件与Protues软件联合仿真调试的方法;2、掌握单片机的键盘接口电路;3、掌握单片机的键盘扫描原理;4、掌握键盘的去抖原理及处理方法。
二、实验仪器与设备1、微机一台2、Keil C51集成开发环境3、Protues仿真软件三、实验内容1、用Protues设计一矩阵键盘接口电路。
要求利用P1口接一4×4矩阵键盘。
串行口通过一74LS164接一共阴极数码管。
用线反转法编写矩阵键盘识别程序,用中断方式,并将按键的键值0-F通过串行口输出,显示在数码管上。
2、将P1口矩阵键盘改成8个独立按键,重新编写识别和显示程序。
四、实验说明矩阵键盘识别一般包括以下内容:⑴判别有无键按下。
⑵键盘扫描取得闭合键的行、列号。
⑶用计算法或查表发的到键值;⑷判断闭合键是否释放,如没释放则继续等待。
⑸将闭合键的键值保存,同时转去执行该闭合键的功能。
五、实验步骤1、用Protues设计键盘接口电路;2、在Keil C51中编写键盘识别程序,编译通过后,与Protues联合调试;3、按动任意键,观察键值是否能正确显示。
六、实验电路仿真图矩阵键盘电路图见附录1。
独立按键电路图见附录2。
七、实验程序实验程序见附录3、4。
八、实验总结1、矩阵键盘常用的检测方法有线反转法、逐行扫描法。
线反转法较简单且高效。
在矩阵键盘的列线上接一与门,利用中断方式查询按键,可提高CPU的运行效率。
2、注意用线反转法扫描按键时,得到的键值不要再赋给temp,最好再设一新变量接收键值,否则再按下按键显示数字的过程中,再按按键会出现乱码。
3、学会常用与门、与非门的使用方法。
附录1:矩阵键盘实验电路图附录2:独立按键实验电路图附录3:矩阵键盘实验程序#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x92,0x82,0x82,0x80,0xff};char temp,num,i,m;int t;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; PT0=1; SCON=0;EX0=1; IT0=1; EA=1;P1=0xf0;while(1){SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400); //500msm++;if(m==9) m=0;}}void int_1() interrupt 0{P1=0xf0;if(P1!=0xf0){Delay_ms(10);if(P1!=0xf0){temp=P1;P1=0x0f;temp=temp|P1;for(i=0;i<16;i++){if(temp==KEY_TABLE[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0; TR0=1;while(flag==0); flag=0;} } P1=0xf0;}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;if(t==300){t=0; flag=1; TR0=0;}}附录4:独立按键实验#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE2[]={ 0xfe,0xfd,0xfb,0x f7, 0xef,0xdf,0xbf,0x7f,} ;char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x 92, 0x82,0x82,0x80,0xff};char temp,i,m;int t;bit ff;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; SCON=0; EX0=1;IT0=1; PT0=1; EA=1;P1=0xff;while(1){ff=IE0;SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400);m++;if(m==9) m=0;}}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;ff=IE0;if(t==300){t=0;flag=1;}}void int_0() interrupt 0{EX0=0;Delay_ms(10);temp=P1;if(temp!=0xff){for(i=0;i<8;i++){if(temp==KEY_TABLE2[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0;TR0=1; while(flag==0);flag=0; TR0=0;P1=0xff; EX0=1;}}。
第7章 51单片机的键盘与数码显示电路

电子工业出版社所有
《单片机技术基础教程与实践》
[例题7-3] 4x4扫描键盘 如下的键盘扫描程序,对图7-3所示的键盘进行扫描。P3高4位(P3_4~P3_5)为列扫描 (KL0~KL3),顺序输出低电平;P3低4位为行扫描(Kh0~Kh3),顺序读入数据,检 测哪一行为0; 源程序如下: #include <AT89X51.H> unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 ,0x88,0x83,0xc6,0xA1,0x86,0x8e}; //共阳数码管的十六进制-7段译码表 unsigned char temp; unsigned char key; unsigned char i,j; //暂存变量 //键值变量 //循环变量
《单片机技术基础教程与实践》
//使P3_5为0,然后检测键盘,如果低4位不等于F,表示键盘按下
作者:夏路易
电子工业出版社所有
switch(temp) {case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=11; break; } temp=P3; P1_0=~P1_0; P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {temp=P3; temp=temp & 0x0f;
作者:夏路易 电子工业出版社所有
unsigned char code table3[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码,高电平有效 unsigned char i; unsigned char a,b; void main(void) {while(1) { for(i=0;i<8;i++) { P0=table1[i]; P2=table3[i]; for(a=4;a>0;a--) for(b=248;b>0;b--); }}}
[知识]按键控制数码管和流水灯设计报告实验报告
![[知识]按键控制数码管和流水灯设计报告实验报告](https://img.taocdn.com/s3/m/4d08521a0640be1e650e52ea551810a6f524c870.png)
摘要000单片机自20世纪70年代以来,以其极高的性价比,以及方便小巧受到人们极大的重视和关注。
本设计选用msp430f249芯片作为控制芯片,来实现矩阵键盘对LED数码管显示的控制。
通过单片机的内部控制实现对硬件电路的设计,从而实现对4*4矩阵键盘的检测识别。
用单片机的P3口连接4×4矩阵键盘,并以单片机的P3.0-P3.3口作键盘输入的列线,以单片机的P3.4-P3.7口作为键盘输入的行线,然后用P0.0-P0.7作输出线,通过上拉电阻在显示器上显示不同的字符“0-F”。
在硬件电路的基础上加上软件程序的控制来实现本设计。
其工作过程为:先判断是否有键按下,如果没有键按下,则继续检测整个程序,如果有键按下,则识别是哪一个键按下,最后通过LED数码管显示该按键所对应的序号。
000关键字:单片机、流水灯、数码管、控制系统SCM since the nineteen seventies, with its high price, and a convenient compact attention and great concern. Thisdesign uses msp430f249 chip as the control chip, to realize the control of the LED digital tube display matrix keyboard. Through the internal control single chip to realize the hardware design of the circuit, so as to re alize the detection and recognition of 4*4 matrix keyboard. 4 * 4 matrix keyboard connected with the MCU P3 port, and the MCU P3.0 P3.3 port for a keyboard input, MCU P3.4P3.7 port as the lines of keyboard input, and then use theP0.0 P0.7 as the output line, by a pull-up resistor display different characters "0F on display". Control with software programs based on the hardware circuit to realize the design. The working process is: first to determine whether a key is pressed, if no key is pressed, it will continue to test the whole procedure, if a key is pressed, the000 Keywords: SCM, water lights, digital tubes, control system000键盘控制流水灯和数码管实验报告00目录000一设计的目的 (200)二任务描述及方案设计 (300)1. 任务描述 (300)2. 方案设计 (300)三硬件设计方案 (30)001. Msp430f149单片机的功能说明 (30)2. 显示器功能 (40)3. 复位电路 (40)4. 按键的部分 (40)5. 74HC573的特点 (4)0006. 流水灯和数码管电路原理图 (40)007. 元器件清单 (40)四程序设计方案 (50)001. 用IAR Embedded W orkbench软件编程序 (5)002. 仿真电路图 (60)五实物实验 (70)001. 实物图 (7)002. 测试结果与分析 (700)六结论 (11)000八参考文献 (16)000一、设计目的0001、进一步巩固和加深学生所学一门或几门相关专业课理论知识,培养学生设计、计算、绘画、计算机应用、文献查阅、报告撰写等基本技能;0002、培养学生实践动手能力及独立分析和解决工程实践问题能力;003、培养学生的团队协作精神、创新意思、严肃认真的治学态度和严谨求实的工作作风。
单片机原理与应用技术:4第7章键盘和LED数码管显示

•
INC @R0 ; 使7FH单元内容由38H变为39H
•
INC DPTR ; 使DPL为FFH, DPH不变
y
6EH
91H
8
7FH
80H
8.
FFH
00H
9
6FH
90H
“灭”
00H
FFH
A
77H
88H
a
B
7CH
83H
fg
b
0-9共阳段码表 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H 0-9共阴段码表 TAB1:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
•偏移量 = 表首地址-(MOVC指令所在地址+1) (MOVC指 令占一个字节)
•
例 : 在外部ROM/EPROM中, 从
2000H单元开始依次存放0~9的平方值: 0、
1、 4、 9、 …、 81, 要求依据累加器A中
的值(0~9)来查找所对应的平方值, 分
析下述程序的结果。
• MOV DPTR, #2000H • MOV A, #09H • MOVC A, @A+DPTR
位。
• 减1指令有如下4条指令, 助记符为DEC。
• DEC A ; (A) ← (A)-1
, 14
• DEC direct ; (direct) ← (direct)-1 , 15 direct
• DEC @Ri ; ((Ri)) ← ((Ri))-1 , 16~17
• DEC Rn ; (Rn) ← (Rn)-1
•
解: 设MOVC指令所在地址(PC)=1FF0H, 则
第7次单片机原理和应用-键盘和显示-文档资料
;控制口地址 ;写控制字 ;设工作方式 ;PA数据口地址 ;取RAM的数据 ;由PA口输出
键盘接口技术
“ 1 ” 前沿抖动
一、键盘处理程序任务: 1.键输入: 检查键盘是否有键被按下,消除按键抖动。 确定被按键的键号,获取键号。 硬件电路消除抖动或软件消除抖动。 后沿抖动 “0”
抖动时间 <10ms
8255A方式选择注意: 有三种基本工作方式: 方式0——基本的输入输出方式 方式1——选通的输入输出方式 方式2——双向传输方式 只有端口A能工作在方式2; 同一组的两端口可分别工作在输入和输出方式。
例: 8255PA口方式0输出单片机片内RAM数据,
PB口方式1输入…。 PIOS:MOV DPTR,#7F03H MOV A,#86H MOVX @DPTR,A MOV DPTR,#7F00H MOV A,@R0 MOVX @DPTR,A …
80C51
Q0
373
Q1
A0 A1 CS 8255
10 9 8 7 6 5 4 3 2 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0
1 0 0 1 1
0 0 1 0 1
7F00H 7F01H 7F02H 7F03H
按键处理程序:
有按键输入?
Y
N
延时消抖
确有按键? N
Y
键扫描求键号
延时等待
按键释放?
Y N
键译码求键值 是数字键?
Y
N
修改显示缓冲区
跳转各功能程序
接口应用:
1、使用8155作键盘接口:
P2.7 P2.0 P0
RD WR 80C51
单片机工程实践之蜂鸣器、键盘、LED等自检以及电子秒表设计
学校代码: 10128(第十一组)题目:电子秒表 (任务一)组长:XXX(通信10-1班)学号:组员:XXX(通信10-1班)学号:XXX(通信10-1班)学号:指导教师:设计时间:2013年2月27日~2013年3月8日一、设计目的:(题目四号宋体字)二、设计任务:要求明确设计任务内容及任务分工等;(内容小四号宋体字)三、框图(包括自检及任务的框图):1、硬件编程框图及相关说明2、主程序框图、子程序框图及相关说明四、程序清单:要求有明确的程序注解、程序清单可分两栏打印五、设计体会要求每个人根据自己的不同情况分别写出本人的设计体会,不得少于300字。
顺序装订七、参考资料1、《单片机系统综合设计与实践》教材主编:裴岩刘利民内蒙古大学出版社。
2、……目录一、设计目的 (1)二、设计任务 (1)2.1基本任务 (1)2.2随机选择任务 (1)2.3任务分工 (1)三、框图3.1硬件编程框图及相关说明 (2)3.11蜂鸣器自检 (2)3.12键盘自检 (2)3.13 LED 显示器自检 (2)3.14自选任务电子秒表 (5)3.2各任务流程框图3.21蜂鸣器自检 (6)3.22键盘自检 (7)3.23 LED 显示器自检 (7)3.24自选任务电子秒表 (8)四、程序清单4.1蜂鸣器自检 (14)4.2键盘自检 (15)4.3 LED 显示器自检 (16)4.4自选任务电子秒表 (17)五、设计体会 (25)六、参考资料 (27)一、设计目的通过一个以8 位单片机为核心的模拟量数字表的硬件调试过程,掌握具有A/D、七段LED 显示、RS-485 通信、Watchdog 等接口电路的单片机应用系统的设计思想和方法。
学习应用系统软件的模块化设计方法,通过源程序的编辑、汇编或编译、链接、仿真调试,完成给定的任务。
通过上述过程提高学生工程实践能力和素质。
二、设计任务2.1★基本任务:完成蜂鸣器、键盘、七段LED 显示器的自检程序设计。
任务7LED数码管显示器接口实验报告
“任务七LED数码管显示器接口”实验报告专业班级:姓名:学号:实验日期:一、实验目的1. 了解LED数码管显示器的结构与原理;2. 掌握LED数码管显示器的静态显示与动态显示原理;3. 掌握LED数码管显示器动态显示程序的编写。
二、实验内容1. 编程实现最左边的LED数码管显示数字1;2. 编程实现8位LED数码管显示12345678;3. 编程实现左边2位LED数码管显示变量num的十进制数值。
硬件连接:外设单片机引脚LED共阴极数码管的8根段选线P0LED共阴极数码管的8根位选线P2三、实验结果1. 画出单片机与8位LED共阴极数码管的连接原理图。
(请附上自己画的Proteus图的截图)。
2. 最左边的LED数码管显示数字1的程序(请附上C语言源程序的截图,并说明实验结果)。
3. 8位LED数码管显示12345678的程序(请附上C语言源程序的截图,并说明实验结果)。
4. 左边2位LED数码管显示变量num十进制数值的程序(请附上C语言源程序的截图,并说明实验结果)。
四、实验思考题1. 调整实验内容2程序中延时函数的时间为1s,观察LED数码管的显示效果,理解动态扫描显示原理。
Led上显示的数类似于led灯流水过程,8个数在那流水。
2. 如何在LED数码管的段码中显示小数点,请分别对共阴极数码管和共阳极数码管加以阐述。
假设实验内容3的十进制个位需要显示小数点,程序中应该如何修改?小数点的共阴极段码为80H;共阳极段码为7FH,定义的显示代码表不同,在P0=dis_tab[dis_data]后加的代码也不同,共阴的加0x80,共阳的加0x7F。
在第二个P0=dis_tab[dis_data]后加个+0x80或|0x80即可。
1五、实验总结请写一下实验心得体会,以及调试过程中遇到的问题,分析原因,如何解决?理解了共阴与共阳数码管所用的代码的不同。
写语言时要用最方便的方式写,例如定义num时用全局变量定义就方便一些。
单片机 键盘与LED显示器
静态LED显示
动态LED显示
• 动态显示可显示位数较多。图7-4是用8155扩展 的6位LED动态显示接口电路。LED显示器为共阴 极,字段线并联,共用8155的PB口(输出字段码), 每位LED的公共端由8155的PA口控制,即由PA 口输出位码。显然图中各显示位不可能同时显示 不同的数字或符号,只有采用动态的方法轮流使 每位显示器显示,并保留一段时, 通常保留时间 为 1ms。由于LED具有余辉性以及人眼视觉的惰 性,虽然每位显示器的显示是分时断续的,但只 要适当选取扫描频率,人眼的视觉就是连续的。
0
显示段
DP
G
F
E
D
C
B
A
字符 0 1 2 3 4 5 6 7 8 9
字段码
(共阳) 共阳) (共阴) 共阴)
字符 A B C D E F P Y 暗
字段码
(共阳) 共阳) 共阳 (共阴) 共阴)
C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H
开始 扫描键盘
编 程 扫 描 键 盘 流 程 图
有键合上吗?
Y
N
延时去抖动 扫描键盘 有键合上吗?
Y
N
键盘扫描逐行判断闭合键键号
键值送入A 延时等待键释放 闭合键释放了吗?
Y
N
取出键值A并执行 返回
LED
它由若干个发光二极管组成。当发光二极管导通时,相应 的一个点或一个笔画发光。控制相应的二极管导通,就能 显示出各种字符,尽管显示的字符形状有些失真,能显示 的字符数量也有限,但控制简单,使用方便。常用的七段 (若将小数点DP计算在内则为八段)LED显示器结构如 下图所示) 下图
代码位
D7
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七 单片机键盘LED显示实验
一、实验目的
1、掌握键盘和LED显示器的接口方法和编程方法。
2、掌握键盘扫描和LED八段码显示器的工作原理。
3、学习并口扩展的程序编写方法。
二、实验说明
利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实
验,把按键输入的键码在六位数码管上显示出来。
实验程序可分成三个模块。
①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
②显示模块:将显示单元的内容在显示器上动态显示。
③主程序:调用键输入模块和显示模块。
三、实验仪器
计算机
伟福实验箱( lab2000P )
四、实验内容
1、本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出
低电平,然后从行码地址(0X001H)读回。如果有键按下,则相应行的值应为低,如
果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的
行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖
动。地址中的X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验
时,需将KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例
如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。
列扫描码还可以分时用作LED的位选通信号。
2、本实验仪提供了6 位8段码LED显示电路,只要按地址输出相应数据,
就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位
位码是由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相
应显示位。
3、本实验仪中 8位段码输出地址为0X004H,位码输出地址为 0X002H。
此处X是由KEY/LED CS 决定,参见地址译码。做键盘和LED实验时,需将
KEY/LED CS 接到相应的地址译码上。以便用相应的地址来访问。例如,将
KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。
五、思考题
1、按键接收到的数据加1显示出来;
2、实现第2功能键,即按下A后,再按下0-9键为加1显示;
3、保存前一个接收到的数据,数据向前推动显示。
六、源程序修改原理及其仿真结果
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口
IN equ 08001h ; 键盘读入口
LEDBuf equ 60h ; 显示缓冲
ljmp Start
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
db 3fh, 06h ;表中增加两个数据,在查
表时最后两个数据+2后可
以正常显示
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr, #OUTSEG
movx @dptr, a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
ret
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 输出线置为0
mov dptr, #IN
movx a, @dptr ; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 键码定义
db 16h, 15h, 14h, 0ffh
db 13h, 12h, 11h, 10h
db 0dh, 0ch, 0bh, 0ah
db 0eh, 03h, 06h, 09h
db 0fh, 02h, 05h, 08h
db 00h, 01h, 04h, 07h
GetKey:
mov LEDBuf,LEDBuf+1
mov LEDBuf+1,LEDBuf+2
mov LEDBuf+2,LEDBuf+3
mov LEDBuf+3,LEDBuf+4
mov LEDBuf+4,LEDBuf+5
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b
mov r2, #6
KLoop:
mov a, r1 ; 找出键所在列
cpl a
movx @dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, @r0
cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入
djnz r2, KLoop
mov r2, #0ffh ; 没有键按下, 返回 0ffh
sjmp Exit
Goon1:
mov r1, a ; 键值 = 列 X 4 + 行
mov a, r2
dec a
rl a
rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中为读入的行值
mov r1, #4
LoopC:
rrc a ; 移位找出所在行
jc Exit
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit:
mov a, r2 ; 取出键码
mov dptr, #KeyTable
movc a, @a+dptr
mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等键释放
clr a
movx @dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
Start:
mov sp, #40h
mov LEDBuf+0, #0ffh ; 显示 8.8.8.8.
mov LEDBuf+1, #0ffh
mov LEDBuf+2, #0ffh
mov LEDBuf+3, #0ffh
mov LEDBuf+4, #0
mov LEDBuf+5, #0
MLoop:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示
call GetKey ; 读入键码
mov r3,a ;将A中的值存入R3保存起来
cjne a,#0ah,NEXT1 ;判断键盘输入的是否是A,不是
则跳转NEXT1进行正常显示
jmp NEXT2 ;若是则跳转NEXT2进行加2显
示
NEXT1: mov a,r3 ;取出A中原来的值
anl a, #0fh ; 显示键码
mov dptr, #LEDMap
movc a, @a+dptr
mov LEDBuf+5, a
ljmp MLoop
MLOOP2:
call DisplayLED ; 显示
call TestKey ; 有键入?
jz MLoop2 ; 无键入, 继续显示
call GetKey ; 读入键码
mov r3,a ;与MLOOP1中的判断对称,实
现按下按键A两种显示方式跳转
(思考题二)
cjne a,#0ah,NEXT2
jmp NEXT1
NEXT2: mov a,r3
anl a, #0fh ; 显示键码
mov dptr, #LEDMap
add a,#2 ;在查表前+2实现显示数据+2(思
考题一)
movc a, @a+dptr
mov LEDBuf+5, a
ljmp MLoop2
end
仿真结果说明:
按下按键A之前按下按键LED推动显示原是数值,如按下333222,则LED
显示出333222;按下A后显示出的数值依然推动显示在LED上,但是数值都相
应加2,如按下A33322,则LED上会显示出C55544,以此类推,按下A两种
输出方式会相互转换并在LED上推动显示出来。本程序基本实现了三个思考题
要求的修改目标。