📄 ex9-7.sdi
字号:
,,, KD EQU 40H ;键值单元
,,, ST EQU 41H ;状态单元
,,, ORG 0000H ;复位入口
0000,02 00 30,, LJMP MAIN
,,, ORG 0030H
0030,75 81 50,MAIN,MAIN: MOV SP, #50H
0033,75 7A 11,, MOV 7AH,#11H
0036,75 7B 10,, MOV 7BH,#10H
0039,75 7C 10,, MOV 7CH,#10H
003C,75 7D 12,, MOV 7DH,#12H
003F,75 7E 10,, MOV 7EH,#10H
0042,75 7F 10,, MOV 7FH,#10H
0045,75 41 00,, MOV ST, #00H
0048,75 40 00,, MOV KD, #00H
004B,90 7F 00,, MOV DPTR,#7F00H ;8155命令口地址
004E,74 03,, MOV A,#03H ;置8155PA、PB口为输出,PC口为输入
0050,F0,, MOVX @DPTR,A
0051,00,ML0,ML0: NOP
0052,12 01 C9,, LCALL DISP
0055,12 00 5A,, LCALL READKEY ;调读键值程序
0058,80 F7,, SJMP ML0 ;无键按下,循环等待
005A,12 01 68,READKEY,READKEY:LCALL KEY ;调按键识别程序
005D,EC,, MOV A, R4 ;得到键值在A中
005E,B4 88 01,, CJNE A,#88H,KLD ;有键按下,转到键值分析
0061,22,, RET
0062,F5 40,KLD,KLD: MOV KD, A ;将键值存于KD单元
0064,E5 41,KDD0,KDD0: MOV A, ST ;读状态子表入口地址→DPTR
0066,23,, RL A
0067,C0 E0,, PUSH ACC
0069,90 00 C6,, MOV DPTR, #TBB1
006C,93,, MOVC A, @A+DPTR
006D,F5 F0,, MOV B, A
006F,D0 E0,, POP ACC
0071,04,, INC A
0072,93,, MOVC A, @A+DPTR
0073,F5 82,, MOV DPL, A
0075,85 F0 83,, MOV DPH, B
0078,E4,CTT,CTT: CLR A
0079,93,, MOVC A, @A+DPTR ;读判定码
007A,B5 40 02,, CJNE A, KD, NEE ;功能键判定
007D,80 12,, SJMP QEE ;是功能键
007F,B4 FF 02,NEE,NEE: CJNE A, #0FFH, NCC ;未用键判定
0082,80 0D,, SJMP QEE ;是未用键
0084,B4 09 05,NCC,NCC: CJNE A, #09H, NNN ;数字键判定
0087,B5 40 00,, CJNE A, KD, NPP
008A,50 05,NPP,NPP: JNC QEE ;是数字键
008C,A3,NNN,NNN: INC DPTR ;条目不符
008D,A3,, INC DPTR
008E,A3,, INC DPTR
008F,80 E7,, SJMP CTT ;返回,继续读键值并判定
0091,E4,QEE,QEE: CLR A ;判定符合
0092,A3,, INC DPTR
0093,93,, MOVC A, @A+DPTR ;读次态码→ST
0094,F5 41,, MOV ST, A
0096,60 CC,, JZ KDD0 ;若为0态,返回KDD0重新进行
0098,E4,, CLR A
0099,A3,, INC DPTR
009A,93,, MOVC A, @A+DPTR ;读子程序号
009B,90 00 A2,, MOV DPTR, #SUBJ
009E,F8,, MOV R0,A
009F,23,, RL A
00A0,28,, ADD A,R0
00A1,73,, JMP @A+DPTR ;散转到子程序入口
00A2,02 01 14,SUBJ,SUBJ: LJMP SUB0 ;转移到不同的子程序
00A5,02 01 1B,, LJMP SUB1
00A8,02 01 22,, LJMP SUB2
00AB,02 01 29,, LJMP SUB3
00AE,02 01 30,, LJMP SUB4
00B1,02 01 37,, LJMP SUB5
00B4,02 01 3E,, LJMP SUB6
00B7,02 01 45,, LJMP SUB7
00BA,02 01 4C,, LJMP SUB8
00BD,02 01 53,, LJMP SUB9
00C0,02 01 5A,, LJMP SUB10
00C3,02 01 61,, LJMP SUB11
00C6,00 D2,TBB1,TBB1: DW TB20 ;状态子表入口地址索引表
00C8,00 EA,, DW TB21
00CA,00 F9,, DW TB22
00CC,01 02,, DW TB23
00CE,01 0B,, DW TB24
00D0,01 11,, DW TB25
00D2,0B 05 01,TB20,TB20: DB 0BH,5,1 ;0状态子表
00D5,0C 05 02,, DB 0CH,5,2
00D8,0D 05 03,, DB 0DH,5,3
00DB,0E 05 04,, DB 0EH,5,4
00DE,0F 01 00,, DB 0FH,1,0
00E1,10 02 00,, DB 10H,2,0
00E4,11 05 05,, DB 11H,5,5
00E7,FF 05 00,, DB 0FFH,5,0
00EA,09 01 07,TB21,TB21: DB 09,1,7 ;1状态子表
00ED,12 01 08,, DB 12H,1,8
00F0,0F 03 00,, DB 0FH,3,0
00F3,13 05 06,, DB 13H,5,6
00F6,FF 00 00,, DB 0FFH,0,0
00F9,09 05 09,TB22,TB22: DB 09,5,9 ;2状态子表
00FC,13 05 06,, DB 13H,5,6
00FF,FF 00 00,, DB 0FFH,0,0
0102,09 03 0A,TB23,TB23: DB 09,3,10 ;3状态子表
0105,13 04 00,, DB 13H,4,0
0108,FF 00 00,, DB 0FFH,0,0
010B,13 05 06,TB24,TB24: DB 13H,5,6 ;4状态子表
010E,FF 04 0B,, DB 0FFH,4,11
0111,FF 00 00,TB25,TB25: DB 0FFH,0,0 ;5状态子表
0114,75 7E 00,SUB0,SUB0: MOV 7EH,#0
0117,85 41 7B,, MOV 7BH,ST
011A,22,, RET ;功能子程序,略
011B,75 7E 01,SUB1,SUB1: MOV 7EH,#1
011E,85 41 7B,, MOV 7BH,ST
0121,22,, RET
0122,75 7E 02,SUB2,SUB2: MOV 7EH,#2
0125,85 41 7B,, MOV 7BH,ST
0128,22,, RET
0129,75 7E 03,SUB3,SUB3: MOV 7EH,#3
012C,85 41 7B,, MOV 7BH,ST
012F,22,, RET
0130,75 7E 04,SUB4,SUB4: MOV 7EH,#4
0133,85 41 7B,, MOV 7BH,ST
0136,22,, RET
0137,75 7E 05,SUB5,SUB5: MOV 7EH,#5
013A,85 41 7B,, MOV 7BH,ST
013D,22,, RET
013E,75 7E 06,SUB6,SUB6: MOV 7EH,#6
0141,85 41 7B,, MOV 7BH,ST
0144,22,, RET
0145,75 7E 07,SUB7,SUB7: MOV 7EH,#7
0148,85 41 7B,, MOV 7BH,ST
014B,22,, RET
014C,75 7E 08,SUB8,SUB8: MOV 7EH,#8
014F,85 41 7B,, MOV 7BH,ST
0152,22,, RET
0153,75 7E 09,SUB9,SUB9: MOV 7EH,#9
0156,85 41 7B,, MOV 7BH,ST
0159,22,, RET
015A,75 7E 0A,SUB10,SUB10: MOV 7EH,#10
015D,85 41 7B,, MOV 7BH,ST
0160,22,, RET
0161,75 7E 0B,SUB11,SUB11: MOV 7EH,#11
0164,85 41 7B,, MOV 7BH,ST
0167,22,, RET
,,,
,,,;按键识别子程序
0168,7C 00,KEY,KEY: MOV R4,#00H ;0→键号寄存器R4
016A,7A 01,, MOV R2,#01H ;扫描模式01H→R2
016C,90 7F 02,KEY1,KEY1: MOV DPTR,#7F02H
016F,EA,, MOV A,R2
0170,F0,, MOVX @DPTR,A ;扫描模式→8155PB口
0171,A3,, INC DPTR
0172,E0,, MOVX A,@DPTR ;读8155 PC口
0173,20 E0 0B,, JB ACC.0,KEY2 ;0列无键闭合,转判1列
0176,12 02 06,, LCALL DELAY1 ;延时,反弹跳
0179,E0,, MOVX A,@DPTR
017A,20 E0 04,, JB ACC.0,KEY2 ;0列无键闭合,转判1列
017D,74 00,, MOV A,#00H ;0列有键闭合,0→A
017F,21 B7,, AJMP KEY55
0181,20 E1 0B,KEY2,KEY2: JB ACC.1,KEY3 ;1列无键闭合,转判2列
0184,12 02 06,, LCALL DELAY1 ;延时,反弹跳
0187,E0,, MOVX A,@DPTR
0188,20 E1 04,, JB ACC.1,KEY3 ;0列无键闭合,转判1列
018B,74 01,, MOV A,#01H ;1列有键闭合,列线号01H→A
018D,21 B7,, AJMP KEY55
018F,20 E2 0B,KEY3,KEY3: JB ACC.2,KEY4 ;2列无键闭合,转判3列
0192,12 02 06,, LCALL DELAY1 ;延时,反弹跳
0195,E0,, MOVX A,@DPTR
0196,20 E2 04,, JB ACC.2,KEY4 ;0列无键闭合,转判1列
0199,74 02,, MOV A,#02H ;2列有键闭合,02H→A
019B,21 B7,, AJMP KEY55
019D,20 E3 0B,KEY4,KEY4: JB ACC.3,KEY5 ;3列无键闭合,转判下一行
01A0,12 02 06,, LCALL DELAY1 ;延时,反弹跳
01A3,E0,, MOVX A,@DPTR
01A4,20 E3 04,, JB ACC.3,KEY5 ;0列无键闭合,转判1列
01A7,74 03,, MOV A,#03H ;3列有键闭合,03H→A
01A9,21 B7,, AJMP KEY55
01AB,20 E4 0C,KEY5,KEY5: JB ACC.4,NEXT ;4列无键闭合,转判下一行
01AE,12 02 06,, LCALL DELAY1 ;延时,反弹跳
01B1,E0,, MOVX A,@DPTR
01B2,20 E4 05,, JB ACC.4,NEXT ;0列无键闭合,转判1列
01B5,74 04,, MOV A,#04H ;4列有键闭合,04H→A
01B7,2C,KEY55,KEY55: ADD A,R4 ;列线号+(R4)作为键值→A
01B8,FC,, MOV R4,A ;键值→R4
01B9,22,, RET ;返回
01BA,EC,NEXT,NEXT: MOV A,R4;
01BB,24 05,, ADD A,#05 ;键号寄存器加4
01BD,FC,, MOV R4,A
01BE,EA,, MOV A,R2
01BF,20 E3 04,, JB ACC.3,NEXT1 ;判别是否已扫描到最后一行
01C2,23,, RL A ;扫描模式左移一位
01C3,FA,, MOV R2,A
01C4,21 6C,, AJMP KEY1 ;重新开始扫描下一行
01C6,7C 88,NEXT1,NEXT1: MOV R4,#88H ;扫描到最后一行仍无按键置无键闭合标志
01C8,22,, RET
,,,
,,,;数码管显示子程序
01C9,78 7A,DISP,DISP: MOV R0,#7AH ;置显示缓冲器指针初值
01CB,7B 01,, MOV R3,#01H ;置扫描模式初值
01CD,90 7F 02,DISPB1,DISPB1: MOV DPTR,#7F02H ;8155 PB口地址
01D0,74 00,, MOV A,#0h ;熄灭所有LED
01D2,F0,, MOVX @DPTR,A
01D3,90 7F 01,, MOV DPTR,#7F01H ;8155 PA口地址
01D6,E6,, MOV A, @R0 ;取显示数据
01D7,24 14,, ADD A,#014H ;加偏移量
01D9,83,, MOVC A, @A+PC ;查表取段码
01DA,F0,, MOVX @DPTR,A ;段码→8155 PA口
01DB,EB,, MOV A,R3
01DC,90 7F 02,, MOV DPTR,#7F02H ;8155 PB口地址
01DF,F0,, MOVX @DPTR,A ;扫描模式→8155 PB口
01E0,51 01,, ACALL DELAY ;延时
01E2,08,, INC R0
01E3,EB,, MOV A,R3
01E4,20 E6 04,, JB ACC.6,DISPB2 ;判6位LED显示完否
01E7,23,, RL A ;扫描模式左移1位
01E8,FB,, MOV R3,A
01E9,21 CD,, AJMP DISPB1
01EB,7B 01,DISPB2,DISPB2: MOV R3,#01H
01ED,22,, RET
01EE,3F 06 5B 4F,SEGPT2,SEGPT2: Db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h ;段码表
01F6,7F 6F 77 7C,, db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
01FE,00 D0 9C,, db 00h,0D0h,09Ch
,,,
,,, ;延时子程序
0201,7C FF,DELAY,DELAY: MOV R4,#0FFH
0203,DC FE,LOOP,LOOP: DJNZ R4,LOOP
0205,22,, RET
,,,
0206,7D B0,DELAY1,DELAY1: MOV R5,#0B0H
0208,7E FF,LOOP2,LOOP2: MOV R6,#0FFH
020A,DE FE,LOOP1,LOOP1: DJNZ R6,LOOP1
020C,DD FA,, DJNZ R5,LOOP2
020E,22,, RET
000E,,,end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -