实验三 LED 数码管动态显示及4 X4 键盘控制实验
一、实验目的
1.巩固多位数码管动态显示方法。
2.掌握行扫描法矩阵式按键的处理方法。
3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。
二、实验内容
使用AT89S52学习板上的4位LED 数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED 数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。
三、实验系统组成及工作原理
1.4位LED 数码管和4 X 4矩阵键盘阵列电路原理图
2. 多位数码管动态显示方式
IO(2)
说明4位共阴极LED 动态显示3456数字的工作过程
首先由I/O口(1)送出数字3的段选码4FH 即数据01001111到4个LED 共同的段选线上,
接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED 的COM 端D3为低电平“0”,因此只有该LED 的发光管因阳极接受到高电平“1”的g 、d 、c 、b 、a 段有电流流过而被点亮,
也就是显示出数字3,而其余3个LED 因其COM 端均为高电平“1”而无法点亮;显示一定时间后,
再由I/O口(1)送出数字4的段选码66H 即 01100110到段选线上,接着由I/O口(2)送出点亮左边第二个LED 的位选码××××1011到位选线上,此时只有该LED 的发光管因阳极接受到高电平“1”的g 、f 、c 、b 段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED 不亮;
如此再依次送出第三个LED 、第四个LED 的段选与位选的扫描代码,就能一一分别点亮各个LED ,使4个LED 从左至右依次显示3、4、5、6。
3.4 X 4 矩阵式按键扫描处理程序
行扫描法又称逐行零扫描查询法,即逐行输出行扫描信号“0”,使各行依次为低电平,然后分别读入列数据,检查此(低电平)行中是否有键按下。如果读得某列线为低电平,则表示此(低电平)行线与此列线的交叉处有键按下,再对该键进行译码计算出键值,然后转入该键的功能子程序入口地址;如果没有任何一根列线为低电平,则说明此(低电平) 行没有键按下。接着进行下一行的“0”行扫描与列读入,直到8行全部查完为止,若无键按下则返回。
有时为了快速判断键盘中是否有键按下,也可先将全部行线同时置为低电平,然后检测列线的电平状态,若所有列线均为高电平,则说明键盘中无键按下,立即返回;若要有一列的电平为低,则表示键盘中有键被控下,然后再如上那样进行逐行扫描。
四、实验设备和仪器
PC 机 一台
AT89S52单片机学习板、下载线 一套
五、实验步骤
1.按时实验要求编写源程序(实验前写)进行软件模拟调试。
2.软件调试好,连接硬件电路。
3.下载程序,进行硬件调试,观察数码管显示的情况,与设计的是否相同。
六、实验参考程序
1. 4位LED 数码管动态显示扫描程序
ORG 0000H
MAIN:
MOV 30H,#0 ; 定义4个字节空间,放置待显示数字“1、2、3、4” MOV 31H,#1
MOV 32H,#2
MOV 33H,#3
MOV P0,#00H
DISP:
MOV R0,#30H ; 把待显示数字首地址送给R0寄存器 MOV R1,#4 ; 把R1作为显示数码管位数计数器
MOV R2,#0FEH ; 把首位数码管的位选码暂存在R2寄存器中 MOV DPTR,#TAB ; 把段选码存储空间的首地址给DPTR LOOP1:
MOV A,@R0 ; 把待显示数字的段选码提取出来
MOVC A,@A+DPTR;
MOV P0,A ; 把段选码放在数据总线上
SETB P1.1 ; 段选码锁存器的锁存允许置位
NOP
CLR P1.1
MOV P0, R2 ; 把位选码放在数据总线上 SETB P1.2 ; 位选码锁存器的锁存允许置位 NOP CLR P1.2 RL A ; 下一位待显示数码管位选码预处理 MOV R2,A INC R0 ACALL DEL ; 调用延时子程序 DJNZ R1,LOOP1;4位没有显示完,转去显示下一位
SJMP DISP ;4位显示完,再次进行新一轮的扫描 /*定义段选码*/
TAB:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
/*延时5ms 子程序*/
DEL:
MOV R7,#10
LOOP2:
MOV R6,#250
DJNZ R6,$
DJNZ R7,LOOP2
RET
END
2. 键盘扫描及数码管动态显示程序
ORG 0000H
MAIN:
MOV 30H,#10 ; 定义4个字节空间,放置待显示数字 MOV 31H,#10
MOV 32H,#10
MOV 33H,#10
MOV P0,#00H
MOV 40H,#0FFH;定义1个字节空间,放置键值
KEY: ACALL KEYSCAN ;调用键盘全扫描子程序
JNC LK1 ; 有按键按下,转去延时去抖
ACALL DISPLAY ; 无按键按下,调用显示子程序 AJMP KBZ ; 送无键按下标志
LK1: ACALL DISPLAY ; 两次调用显示,实现延时功能 ACALL DISPLAY
ACALL KEYSCAN ; 延时去抖后,再次调用键盘全扫描子程序 JNZ LK2 ; 确实有按键按下,转入逐行扫描 AJMP KBZ ; 抖动,无按键
/*逐行扫描程序模块*/
LK2: MOV R7,#0EFH ;第一行行线置为0
MOV R6,#00H ; 行数寄存器
COL0: MOV P3,R7 ; 第一行行线置为0
MOV A,P3 ; 读入列线状态
JB ACC.0,COL1 ; 若不是第一列按键按下,转查第二列 MOV A,#01H ; 若是第一列按键按下,则记下列值为1 AJMP LKP ; 转去计算键值
COL1: JB ACC.1,COL2;若不是第二列按键按下,转查第三列 MOV A,#02H ; 若是第二列按键按下,则记下列值为2 AJMP LKP ; 转去计算键值
COL2: JB ACC.2,COL3;若不是第三列按键按下,转查第四列 MOV A,#03H ; 若是第三列按键按下,则记下列值为3 AJMP LKP ; 转去计算键值
COL3: JB ACC.3,NEXTR ;若不是第四列按键按下,转去扫描下一行 MOV A,#04H ; 若是第四列按键按下,则记下列值为4 AJMP LKP ; 转去计算键值
/*键值计算程序 键值=行值×4+列值*/
LKP: MOV R5,A;
MOV A,R6
MOV B,#04H
MUL AB
ADD A,R5
MOV 40H,A
MOV A,40H
MOV B,#10 ;
DIV AB
MOV 32H,A
MOV 33H,B
ACALL DISPLAY ;
AJMP KEY
/*下一行扫描值预处理*/
NEXTR: INC R6;
MOV A,R7 ;
JNB ACC.7,KBZ ;
RL A ;
MOV R7,A
AJMP COL0
KBZ: MOV 40H,#0FFH;若无按键按下,则用FF 表示键值 AJMP KEY
/*键盘全扫描子程序*/
KEYSCAN:
MOV P3,#0FH ;
NOP
MOV P3,#0FH;
MOV A,P3 CPL A ANL A,#0FH RET
/*LED数码管显示键值子程序*/
DISPLAY:
MOV R0,#30H;
MOV R1,#4;
MOV R2,#0FEH;
MOV DPTR,#TAB;
LOOP1:
MOV A,@R0;把待显示数字的段选码提取出来 MOVC A,@A+DPTR; MOV P0,A;把段选码放在数据总线上 SETB P1.1;锁存器的锁存允许置位 NOP CLR P1.1 MOV A,R2;把段选码放在数据总线上 MOV P0,A SETB P1.2; NOP CLR P1.2 RL A MOV R2,A INC R0 ACALL DEL DJNZ R1,LOOP1
RET
/*定义段选码*/
TAB:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 0FFH;NO
/*延时5ms 子程序*/
DEL:
MOV R4,#10
LOOP2:
MOV R3,#250
DJNZ R3,$
DJNZ R4,LOOP2
RET
END
实验三 LED 数码管动态显示及4 X4 键盘控制实验
一、实验目的
1.巩固多位数码管动态显示方法。
2.掌握行扫描法矩阵式按键的处理方法。
3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。
二、实验内容
使用AT89S52学习板上的4位LED 数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED 数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。
三、实验系统组成及工作原理
1.4位LED 数码管和4 X 4矩阵键盘阵列电路原理图
2. 多位数码管动态显示方式
IO(2)
说明4位共阴极LED 动态显示3456数字的工作过程
首先由I/O口(1)送出数字3的段选码4FH 即数据01001111到4个LED 共同的段选线上,
接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED 的COM 端D3为低电平“0”,因此只有该LED 的发光管因阳极接受到高电平“1”的g 、d 、c 、b 、a 段有电流流过而被点亮,
也就是显示出数字3,而其余3个LED 因其COM 端均为高电平“1”而无法点亮;显示一定时间后,
再由I/O口(1)送出数字4的段选码66H 即 01100110到段选线上,接着由I/O口(2)送出点亮左边第二个LED 的位选码××××1011到位选线上,此时只有该LED 的发光管因阳极接受到高电平“1”的g 、f 、c 、b 段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED 不亮;
如此再依次送出第三个LED 、第四个LED 的段选与位选的扫描代码,就能一一分别点亮各个LED ,使4个LED 从左至右依次显示3、4、5、6。
3.4 X 4 矩阵式按键扫描处理程序
行扫描法又称逐行零扫描查询法,即逐行输出行扫描信号“0”,使各行依次为低电平,然后分别读入列数据,检查此(低电平)行中是否有键按下。如果读得某列线为低电平,则表示此(低电平)行线与此列线的交叉处有键按下,再对该键进行译码计算出键值,然后转入该键的功能子程序入口地址;如果没有任何一根列线为低电平,则说明此(低电平) 行没有键按下。接着进行下一行的“0”行扫描与列读入,直到8行全部查完为止,若无键按下则返回。
有时为了快速判断键盘中是否有键按下,也可先将全部行线同时置为低电平,然后检测列线的电平状态,若所有列线均为高电平,则说明键盘中无键按下,立即返回;若要有一列的电平为低,则表示键盘中有键被控下,然后再如上那样进行逐行扫描。
四、实验设备和仪器
PC 机 一台
AT89S52单片机学习板、下载线 一套
五、实验步骤
1.按时实验要求编写源程序(实验前写)进行软件模拟调试。
2.软件调试好,连接硬件电路。
3.下载程序,进行硬件调试,观察数码管显示的情况,与设计的是否相同。
六、实验参考程序
1. 4位LED 数码管动态显示扫描程序
ORG 0000H
MAIN:
MOV 30H,#0 ; 定义4个字节空间,放置待显示数字“1、2、3、4” MOV 31H,#1
MOV 32H,#2
MOV 33H,#3
MOV P0,#00H
DISP:
MOV R0,#30H ; 把待显示数字首地址送给R0寄存器 MOV R1,#4 ; 把R1作为显示数码管位数计数器
MOV R2,#0FEH ; 把首位数码管的位选码暂存在R2寄存器中 MOV DPTR,#TAB ; 把段选码存储空间的首地址给DPTR LOOP1:
MOV A,@R0 ; 把待显示数字的段选码提取出来
MOVC A,@A+DPTR;
MOV P0,A ; 把段选码放在数据总线上
SETB P1.1 ; 段选码锁存器的锁存允许置位
NOP
CLR P1.1
MOV P0, R2 ; 把位选码放在数据总线上 SETB P1.2 ; 位选码锁存器的锁存允许置位 NOP CLR P1.2 RL A ; 下一位待显示数码管位选码预处理 MOV R2,A INC R0 ACALL DEL ; 调用延时子程序 DJNZ R1,LOOP1;4位没有显示完,转去显示下一位
SJMP DISP ;4位显示完,再次进行新一轮的扫描 /*定义段选码*/
TAB:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
/*延时5ms 子程序*/
DEL:
MOV R7,#10
LOOP2:
MOV R6,#250
DJNZ R6,$
DJNZ R7,LOOP2
RET
END
2. 键盘扫描及数码管动态显示程序
ORG 0000H
MAIN:
MOV 30H,#10 ; 定义4个字节空间,放置待显示数字 MOV 31H,#10
MOV 32H,#10
MOV 33H,#10
MOV P0,#00H
MOV 40H,#0FFH;定义1个字节空间,放置键值
KEY: ACALL KEYSCAN ;调用键盘全扫描子程序
JNC LK1 ; 有按键按下,转去延时去抖
ACALL DISPLAY ; 无按键按下,调用显示子程序 AJMP KBZ ; 送无键按下标志
LK1: ACALL DISPLAY ; 两次调用显示,实现延时功能 ACALL DISPLAY
ACALL KEYSCAN ; 延时去抖后,再次调用键盘全扫描子程序 JNZ LK2 ; 确实有按键按下,转入逐行扫描 AJMP KBZ ; 抖动,无按键
/*逐行扫描程序模块*/
LK2: MOV R7,#0EFH ;第一行行线置为0
MOV R6,#00H ; 行数寄存器
COL0: MOV P3,R7 ; 第一行行线置为0
MOV A,P3 ; 读入列线状态
JB ACC.0,COL1 ; 若不是第一列按键按下,转查第二列 MOV A,#01H ; 若是第一列按键按下,则记下列值为1 AJMP LKP ; 转去计算键值
COL1: JB ACC.1,COL2;若不是第二列按键按下,转查第三列 MOV A,#02H ; 若是第二列按键按下,则记下列值为2 AJMP LKP ; 转去计算键值
COL2: JB ACC.2,COL3;若不是第三列按键按下,转查第四列 MOV A,#03H ; 若是第三列按键按下,则记下列值为3 AJMP LKP ; 转去计算键值
COL3: JB ACC.3,NEXTR ;若不是第四列按键按下,转去扫描下一行 MOV A,#04H ; 若是第四列按键按下,则记下列值为4 AJMP LKP ; 转去计算键值
/*键值计算程序 键值=行值×4+列值*/
LKP: MOV R5,A;
MOV A,R6
MOV B,#04H
MUL AB
ADD A,R5
MOV 40H,A
MOV A,40H
MOV B,#10 ;
DIV AB
MOV 32H,A
MOV 33H,B
ACALL DISPLAY ;
AJMP KEY
/*下一行扫描值预处理*/
NEXTR: INC R6;
MOV A,R7 ;
JNB ACC.7,KBZ ;
RL A ;
MOV R7,A
AJMP COL0
KBZ: MOV 40H,#0FFH;若无按键按下,则用FF 表示键值 AJMP KEY
/*键盘全扫描子程序*/
KEYSCAN:
MOV P3,#0FH ;
NOP
MOV P3,#0FH;
MOV A,P3 CPL A ANL A,#0FH RET
/*LED数码管显示键值子程序*/
DISPLAY:
MOV R0,#30H;
MOV R1,#4;
MOV R2,#0FEH;
MOV DPTR,#TAB;
LOOP1:
MOV A,@R0;把待显示数字的段选码提取出来 MOVC A,@A+DPTR; MOV P0,A;把段选码放在数据总线上 SETB P1.1;锁存器的锁存允许置位 NOP CLR P1.1 MOV A,R2;把段选码放在数据总线上 MOV P0,A SETB P1.2; NOP CLR P1.2 RL A MOV R2,A INC R0 ACALL DEL DJNZ R1,LOOP1
RET
/*定义段选码*/
TAB:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 0FFH;NO
/*延时5ms 子程序*/
DEL:
MOV R4,#10
LOOP2:
MOV R3,#250
DJNZ R3,$
DJNZ R4,LOOP2
RET
END