⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex9-7.sdi

📁 《单片机原理实用教程——基于Proteus虚拟仿真》一书的配套光盘
💻 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 + -