微机实验:显示和键盘
实验目的
2、掌握显示和键盘子程序的程序设计和调试方法。
(一)动态显示
图4-1 LED动态显示接口
图4-1示实验板中显示部分线路。6位共阴极LED动态显示;8155 PB口提供字形码,决定了显示的字形;PA口提供位选码(扫描字),决定了哪一位发亮。动态显示就是一位一位地轮流点亮LED,当某位LED点亮时输入相应于该位的被显示字形。虽然实际上是各位轮显示,但速度很快,所以感觉上是6位LED同时显示。
在设计显示程序时,通常在片内RAM开辟一组显示缓冲区,专用于存放待显示的数据。本实验中,显示缓冲区选用2A~2FH六个单元,依次存放数据的高位到低位。
显示子程序的程序框图如图4-2示,程序如下:
ORG 0300H |
|||
DISP: |
MOV R0, #2AH |
;R0指向显示缓冲首址 | |
MOV R1, #0FEH |
;R1指向位选初值,点亮最高位 | ||
MOV DPTR, #0B001A |
;DPTR指向PA口 | ||
DLP: |
INC DPTR |
;指向PB口 | |
MOV A, @R0 |
;取显示数据 | ||
ADD A, #10H |
;加偏移量 | ||
MOVC A, @A+PC |
;取字型码 | ||
MOVX @DPTR, A |
;B口输出字型 | ||
MOV DPTR, #0B001A |
;指向PA口 | ||
MOV A, R1 |
|||
MOVX @DPTR, A |
;A口输出字位 | ||
ACALL DIMS |
;延时 | ||
|
RL A |
;字位左移一位 | |
MOV R1, A |
|||
INC R0 |
;指向下一位显示缓冲 | ||
CJNE R0, #30H, DLP |
;6位是否结束? | ||
RET |
|||
DB: |
3FH,06H,5BH,4FH |
字形码0,1,2,3 | |
66H,6DH,7DH,07H |
4,5,6,7,8 | ||
7FH,6FH,77H,7CH |
8,9,A,B, | ||
39H,5EH,79H,71H |
C,D,E,F | ||
73H,40H,58H,00H |
P,-,L,“灭” | ||
BFH,86H,DBH,CFH |
|||
E6H,EDH,FDH,87H |
|||
FFH,EFH,77H |
|||
ORG 0350H |
|||
DIMS: |
MOV R7,#02H |
;延时2ms | |
DL: |
MOV R6,#0FFH |
||
DL1: |
DJNZ R6,DL1 |
||
DJNZ R7,DL |
|||
RET |
子程序调试:
1、仿真器的仿真头插入实验板CPU(注意方向不能插错)。仿真器和实验板接5V电流(电流极性绝对不能接反)。
2、输入程序。
3、利用仿真器在显示缓冲2A~2FH内设置某一个显示内容(例如,01H、02H、03H、10H、11H、14H)。
4、设置8155命令字,口地址0B000H,命令字03H,A、B、口输出,C口输入。
5、单步执行显示子程序,可清楚地看到显示的执行过程。
6、在RET指令处设置断点后,继续执行子程序。
(二)键盘接口
图 4-3 行列式键盘
图4-3示实验板中键盘接口电路。采用行列式结构,共2行6列,对应于12个键盘,每个分配一个键号,依次为0~B。由图显见,任一个键的键号=该行的首键号+列号。
例如;键号A=行首键号6+列号4。所以,只要确定被按下键的行、列位置,就能确定该键的键号。
键盘扫描程序的框图如图4-4示。它具有以下功能:
1、判别有无键按下:从PA口输出扫描字00H,读PC口。若无键按下,则PCO、PC1均为1;若有键按下,则PC0或PC1为1。
2、消除键抖动;在某键按下后延时5~10ms,再判别键状态。如果键已放开,认为属于抖动,是误动作;如果键仍闭合,则表示有一个稳定的键输入。
3、判别键号:由PA0~PA5对列线发出扫描字,先后次序是FEH、FDH、FBH、F7H、EFH、DFH(0位右移)。每次列扫描时,检查行线输入,先查PC0,再查PC1。若行线输入0,表示该行上有键按下。根据此时的行、列号,就能计算出按下键的键号。
1、 按键一次,仅响应一次。为此,必须等待到键释放以后,再取键号,存于A中。
参考程序:
ORG 03A0H |
|||
KEY: |
LCALL KS1 |
;判断有无键闭合 | |
JNZ KEYA |
|||
SJMP KND |
;无键闭合,则退出 | ||
KEYA: |
LCALL T12MS |
;延时12ms | |
LCALL KS1 |
|||
JNZ LK1 |
;键仍闭合,转 | ||
SJMP KND |
;键已放开,是抖动 | ||
LK1: |
MOV R4, #00H |
;列号寄存器R4置0 | |
MOV R2, #FEH |
;0列扫描字 | ||
LK2: |
MOV DPTR, #0B001H |
;指向PA口 | |
MOV A, R2 |
|||
MOVX @DPTR, A |
;PA口输出扫描字 | ||
INC DPTR |
|||
INC DPTR |
;指向PC口 | ||
MOVX A, @DPTR |
;读PC | ||
JB ACC.0, LONE |
;PC0=1,0行无键按下,转判下一行 | ||
MOV A, #00H |
;0行有键按下,行首键号00H送A | ||
SJMP LKP |
|||
LONE: |
JB ACC.1, NEXT |
;PC1=1,1行无键按下,转判下一列 | |
MOV A, #06H |
;1行有键按下,行首键号06H | ||
LKP: |
ADD A ,R4 |
;计算键号 | |
PUSH ACC |
;键号暂存 | ||
LK3: |
LCALL KS1 |
;等待键释放 | |
JNZ LK3 |
|||
POP ACC |
;键已释放,键号送A | ||
KND: |
RET |
||
NEXT: |
INC R4 |
;列号+1 | |
|
MOV A, R2 |
;扫描到最后一列? | |
JNB ACC.5, KND |
;是,转KND | ||
RL A |
;扫描字0位左移一位 | ||
MOV R2, A |
|||
SJMP LK2 |
;扫描下一列 | ||
KS1: |
MOV DPTR, #0B001H |
;判断有无键闭合 | |
MOV A, #00H |
|||
MOVX @DPTR, A |
;PA口输出扫描字00H | ||
INC DPTR |
|||
INC DPTR |
|||
MOVX A, @DPTR |
;读PC口 | ||
CPL A |
|||
|
ANL A, #03H |
;A=0,无键闭合 | |
RET |
|||
T12MS: |
MOV R7, #18H |
;延时12ms | |
TM: |
MOV R6, #FFH |
||
TM6: |
DJNZ R6, TM6 |
||
DJNZ R7, TM |
|||
RET |
子程序调试:
1、输入键盘子程序。
2、设置8255命令字(03H)。
3、在标号KND处设置断点,在按下某一键的同时,连续执行子程序。然后检查A中键号是否正确。
(三)显示和键盘演示实验
在8031应用系统的总体设计中,为了保证显示和键扫描程序的正常工作,必须对8155进行初始化设置。下面的演示程序可作为一个简单的实例。该程序的功能是:上电后数码管全部显示“0”。按下任一键后,数码管显示其键号,而且,显示位置跟踪按键的先后顺序。该程序固化到实验板的EPROM中后,实验板能够脱离仿真器而独立运行。
ORG 0000H |
|||
LJMP MAIN |
|||
ORG 0A00H |
|||
MAIN: |
MOV SP, #60H |
;设置堆栈 | |
MOV DPTR, #B000H |
;8155初始化 | ||
MOV A, #03H |
;A、B口输出,C口输入 | ||
MOVX @DPTR, A |
|||
MOV 2AH, #00H |
;显示缓冲区置初始00 | ||
MOV 2BH, #00H |
|||
MOV 2CH, #00H |
|||
MOV 2DH, #00H |
|||
MOV 2EH, #00H |
|||
MOV 2FH, #00H |
|||
MP0: |
MOV 40H, #2AH |
;40H显示缓冲指针 | |
MP1: |
LCALL DISP |
;调用显示 | |
0A21 |
LCALL KS1 |
;判有键闭合? | |
0A24 |
JZ MP1 |
;无键闭合,转MP1 | |
0A26 |
LCALL KEYA |
;有键闭合,求键号,存A | |
MOV R1, 40H |
;键号送显示缓冲区 | ||
MOV @R1, A |
|||
|
INC 40H |
;修改显示指针 | |
MOV A, 40H |
|||
CJNE A, #30H, MP1 |
;按键不到6次,转MP1 | ||
SJMP MP0 |
;按键次(6位显示满)后从最 左位开始重新显示 | ||
END |
实验步骤:
1、输入程序(包括主程序MAIN和子程序DISP、KEY等)。
2、全速运行程序。按下任一键,监视显示,检查是否符合设计。
3、如发现不正常,可利用单步法或断点法,进行测试。
思考题:
1、动态显示器的亮度和哪些因素有关?
2、动态显示器有什么优缺点?
3、动态显示线路图4-1中,如将PA0接至数码管最低位,PA5接至数码管最高位,程序将如何修改?
4、动态显示线路中,如将数码管改为共阳极,其余不变,程序将如何修改?
5、8031应用系统设计中,地址0000H这一句为什么一定要用?
6、主程序MAIN最后一句SJMP MP0,如改为SJMP $,将产生什么后果?
7、将主程序MAIN中地址为0A21H~0A26H的三句删掉,改为LCALL KEY,将产生什么后果?
评论
查看更多