(周振安)3)数字键和命令键的判断。设键号为0~9的10个键为数字键,其余6个键为命令键,则键号大于09H的按键为命令键,键号小于0AH的按键为数字键。是数字键送显示,是命令键则转到该命令键的服务程序入口处。
4)命令键服务程序的入口方法。程序中将所有命令键服务程序的入口地址连续排在一起形成“入口地址表”,根据相应的键号由查表指令找到相应的入口地址,从而完成相应命令键的服务。
显示子程序的编写要点
为6个数码管各设一个显示缓冲单元,例如79H~74H 6个单元,分别对应6位显示器,要显示的内容首先送到显示缓冲单元。显示缓冲单元的地址放在地址指针73H单元。需要显示时,首先从73H单元取出显示缓冲单元地址,向显示缓冲区单元写入待显示的数据。显示子程序的任务是依次将显示缓冲区的内容取出并查表变换后送到8155的PB口,然后由PA口选通相应位,并延时2ms(增加亮度)。当6位全部送毕则完成一个显示周期。主程序中每隔一定的时间调用一次显示子程序,利用人眼的视觉惰性,就可以实现连续显示。这种显示方式称为动态显示,动态显示的优点是节省硬件,但占用CPU较多时间。
软件框图请参见图4,程序清单附后。程序中“DB”是一条伪指令,在手工汇编输入机器码时,可直接将其后所跟的16进制码顺序键入即可。

实验内容
1)首先走通程序。一般若硬件接线正确,指令输入无误,实验会一次成功,此时运行程序显示“good”。如果不能正常显示,应首先检查指令码,若指令码确实无误再检查硬件,此时先不要断电(会破坏RAM内容),用电压表检查各芯片上的电压是否正常。若还不能解决问题就得断电耐心地检查连线了(一般来说芯片不易损坏)。
2)由键盘依次键入0~9数字,显示器应能正常显示。
3)为6个命令键安排特定功能。程序中已为A、B、C3个命令键定义了功能,例如按下A键使显示器显示“YES”,按B键便显示器显示“HELP”,按下C键使显示器全暗等。
读者可以自行为D、E、F三个命令键定义功能,例如通过命令键控制TD-Ⅱ型学习机上P1口指示灯按一定规律发光等。
4)如果还有新的字符码需要显示,而原有字符表中又没有定义,则读者可以自行修改字符表。例如要显示“8”字的上、下半部分(见图2)字符,可将字符表中12H、13H两个单元内容改为10H、23H。需要显示时,将12H、13H写入到显示缓冲区74H~79H中任意两个单元即可。这里12H、13H均为字符表中代码的序号或称为字符表地址。
键盘、显示器监控程序:(在TD-Ⅱ型机上运行)
1: ORG 0000H
2: LJMP MAIN
主程序
3: ORG 0030H
12: MOV A,#00H ;判断有键按下否
13: MOV DPTR,#0DF01H
14: MOVX @DPTR
15: MOV DPTR,#0DF03H
16: MOVX A,@DPTR
17: ORL A,#0F0H
18: CPL A
29: KEY1: RRC A
30: JNC KEY3
31: INC R2
32: CJNE R2 #04H,KEY1
33: MOV A, R7
34: RL A
35: INC R5
36: CJNE R5,#04H,KEY2
37: SJMP EXIT
38: KEY3: MOV A, R2
39: MOV B,#04H
40: MUL AB
41: ADD A,R5
42: MOV B,A
43: KEY4: MOV DPTR,#0DF03H;等待键释放
44: MOVX A,@DPTR
45: ORL A #0F0H
46: CPL A
47: JNZ KEY4
48: LCALL D10MS
49: MOV A ;判是否命令键。
50: SUBB A #0AH;(A)←(A)—0AH
51: JNC KEY5 ;是命令键,则转键处理。
52: MOV R0,73H
53: MOV A,B ;是数字键,则送显示。
54: MOV @R
55: INC R0
56: MOV 73H,R0
57: CJNE R0,#7AH,EXIT
58: MOV 73H,#74H
59: SJMP EXIT
60: KEY5: MOV B,A ;根据命令键得到跳转地址。
61: RL A
62: ADD A,B
63: MOV DPTR,#KTAB
64: JMP @A+DPTR
65: EXIT: LCALL LEDI
66: LJMP KEY
显示子程序
67: LEDI: MOV R0, #74H
68: MOV B,#01H
69: LED1: MOV A,@R0 ;取显示值
70: ADD A, #02H
71: MOVC A,@A+PC ;查表变换。
72: SJMP LED2
字符0、1、2、3、4、5、6、7、8、9d、y、E、H、P、L、
灭、灭、灭的显示代码表
73: DB 3FH,06H,5BH,4FH
;字符表地址00H~03H
74: DB 66H,6DH,7DH,07H;
;04H~07H
75: DB 7FH 6FH,5EH, 6EH
;08H~06H
76: DB 79H, 76H, 73H, 38H
;0CH~0FH
77: DB 00H,00H,00H,00H
;10H~13H
78: LED2: MOV DPTR,#0DF02H
;显示数据送到8155B口。
79: MOVX @DPTR
80: MOV A,B

87: J B A5 LED0 ;位完全显示完否
88: RL A ;未完,继续下一位。
89: MOV B,A
90: INC R0
91: SJMP LEDI
92: LED0: NOP
93: RET
10ms延时子程序入口
94: D10MS: MOV R3,#0AH ;延时子程序
1ms延时子程序入口
(在R3=01H时,产生1ms延时)
95: D1MS: MOV R4,#64H
96: DLL: NOP
97: NOP
98: NOP
99: DJNZ R4,DLL
100:DJNZ R3,D1MS
101:RET
102:ORG 0100H




