📄 16x16_164.lst
字号:
A51 MACRO ASSEMBLER 16X16_164 02/17/2009 12:40:10 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN 16X16_164.OBJ
ASSEMBLER INVOKED BY: E:\Keil\C51\BIN\A51.EXE 16X16_164.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
0030 1 ZISHU EQU 30H ;字数
0031 2 SHOWTIME EQU 31H ;一个字重复扫描的次数
0032 3 SAOMIAO EQU 32H ;扫描指针
0033 4 QUMA EQU 33H ;取码指针
0034 5 DIS_BUF_C EQU 34H ;缓冲区字数,这里是2
0035 6 OFFSET EQU 35H ;取码指针偏移量
7 ;********************************************
0040 8 DIS_BUFL EQU 40H ;显示缓冲低字节区(40H~60H攻32字节)
0060 9 DIS_BUFH EQU 60H ;显示缓冲高字节区(60H~80H攻32字节)
0080 10 LOD_BUFL EQU 80H ;加载缓冲低字节区(80H~90H)
0090 11 LOD_BUFH EQU 90H ;加载缓冲高字节区(90H~A0H)
0000 12 ORG 0000H
0000 020100 13 LJMP START
0100 14 ORG 0100H
0100 15 START:
0100 759800 16 MOV SCON,#00H ;串行口初始化为方式0
0103 75300E 17 MOV ZISHU,#14
0106 12017F 18 LCALL CLRBUF ;把显示缓冲区清零
0109 900208 19 MOV DPTR,#TABLE
010C AA30 20 MOV R2,ZISHU
010E 7880 21 NEXT: MOV R0,#LOD_BUFL
0110 7990 22 MOV R1,#LOD_BUFH
0112 120188 23 LCALL LOADING ;把字型码加载到加载缓冲区
0115 7B10 24 MOV R3,#16 ;这个字是否每一行都移动了?
0117 12019C 25 LOOP3: LCALL SHIFT ;把显示缓冲区内的字型移位
011A 75310A 26 MOV SHOWTIME,#10
011D 7C10 27 LOOP2: MOV R4,#16 ;一个字需要扫描的16次行
011F 753280 28 MOV SAOMIAO,#80H ;扫描指针清零,p1.7=1,译码器无效
0122 753300 29 MOV QUMA,#0H ;取码指针清零
0125 E532 30 LOOP1: MOV A,SAOMIAO
0127 F590 31 MOV P1,A ;扫描指针输入
0129 0532 32 INC SAOMIAO ;扫描指针+1
012B 753402 33 MOV DIS_BUF_C,#2H ;缓冲区有2个字
012E 120146 34 LCALL DIS_LINE
0131 C297 35 CLR P1.7
0133 0533 36 INC QUMA ;取码指针+1
0135 1201F6 37 LCALL DELAY1
0138 D297 38 SETB P1.7
013A DCE9 39 DJNZ R4,LOOP1 ;一个字需要扫描的16次行
013C D531DE 40 DJNZ SHOWTIME,LOOP2 ;一个字的显示时间是否完成?
013F DBD6 41 DJNZ R3,LOOP3 ;是否一个字的每一行的移动了
0141 DACB 42 DJNZ R2,NEXT
43
0143 020143 44 LJMP $
45 ;****************************************************************************
0146 46 DIS_LINE: ;输入一行子程序,入口参数DIS_BUF_C,与缓冲区字数相等
0146 C0D0 47 PUSH PSW
0148 C0E0 48 PUSH ACC
014A 753500 49 MOV OFFSET,#0H ;取码指针偏移量,多一个字就多+16
014D 7840 50 NE1: MOV R0,#DIS_BUFL
014F E8 51 MOV A,R0
0150 2533 52 ADD A,QUMA
0152 2535 53 ADD A,OFFSET
0154 F8 54 MOV R0,A
0155 E6 55 MOV A,@R0
0156 C299 56 CLR TI
0158 F599 57 MOV SBUF,A
015A 3099FD 58 JNB TI,$
A51 MACRO ASSEMBLER 16X16_164 02/17/2009 12:40:10 PAGE 2
015D C299 59 CLR TI ;清发送完标志
015F 7860 60 MOV R0,#DIS_BUFH
0161 E8 61 MOV A,R0
0162 2533 62 ADD A,QUMA
0164 2535 63 ADD A,OFFSET
0166 F8 64 MOV R0,A
0167 E6 65 MOV A,@R0
0168 C299 66 CLR TI
016A F599 67 MOV SBUF,A
016C 3099FD 68 JNB TI,$
016F C299 69 CLR TI ;清发送完标志
70
0171 E535 71 MOV A,OFFSET
0173 2410 72 ADD A,#16 ;取下一个字需要加16的偏移量
0175 F535 73 MOV OFFSET,A
0177 D534D3 74 DJNZ DIS_BUF_C,NE1
017A D0E0 75 POP ACC
017C D0D0 76 POP PSW
017E 22 77 RET
78
79 ;**********************************************************************************
80 ;把显示缓冲区清零
017F 81 CLRBUF:
017F 7840 82 MOV R0,#DIS_BUFL
0181 7600 83 L1: MOV @R0,#0
0183 08 84 INC R0
0184 B880FA 85 CJNE R0,#80H,L1
0187 22 86 RET
87 ;**********************************************************************************
88 ;把字型码加载到加载缓冲区
0188 89 LOADING:
0188 C002 90 PUSH 02h ;push r2
018A 7A10 91 MOV R2,#16
018C 92 L2:
018C 7400 93 MOV A,#0
018E 93 94 MOVC A,@A+DPTR
018F F6 95 MOV @R0,A ;把偶数个数字码存放在R0开始的缓冲区,共可以存放16个字码
0190 08 96 INC R0
0191 A3 97 INC DPTR
0192 E4 98 CLR A
0193 93 99 MOVC A,@A+DPTR
0194 F7 100 MOV @R1,A ;把奇数个数字码存放在R1开始的缓冲区,共可以存放16个字码
0195 09 101 INC R1
0196 A3 102 INC DPTR
0197 DAF3 103 DJNZ R2,L2
0199 D002 104 POP 02h ;pop r2
019B 22 105 RET
106 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
019C 107 SHIFT:
019C C0D0 108 PUSH PSW
019E C0E0 109 PUSH ACC
01A0 D2D4 110 SETB RS1 ;选择另外一组工作寄存器
01A2 7B00 111 MOV R3,#00H ;偏移量
01A4 7C10 112 MOV R4,#16
01A6 113 LOOPS:
01A6 C3 114 CLR C ;清进位标志C
01A7 7490 115 MOV A,#LOD_BUFH
01A9 2B 116 ADD A,R3
01AA F8 117 MOV R0,A
01AB E6 118 MOV A,@R0
01AC 33 119 RLC A ;带进位左移,高字节的最高位移进Cy
01AD F6 120 MOV @R0,A ;移位后放回缓冲区
01AE 7480 121 MOV A,#LOD_BUFL
01B0 C0D0 122 PUSH PSW ;保护Cy,避免ADD进位影响
01B2 2B 123 ADD A,R3
01B3 F8 124 MOV R0,A
A51 MACRO ASSEMBLER 16X16_164 02/17/2009 12:40:10 PAGE 3
01B4 E6 125 MOV A,@R0
01B5 D0D0 126 POP PSW
01B7 33 127 RLC A ;高字节最高位移进低字节最低位 低字节高位进入Cy
01B8 F6 128 MOV @R0,A
129
01B9 7460 130 MOV A,#DIS_BUFH
01BB C0D0 131 PUSH PSW
01BD 2B 132 ADD A,R3
01BE 2410 133 ADD A,#16 ;取下一个字的高字节需要+16的偏移量
01C0 F8 134 MOV R0,A
01C1 E6 135 MOV A,@R0
01C2 D0D0 136 POP PSW
01C4 33 137 RLC A
01C5 F6 138 MOV @R0,A
139
01C6 7440 140 MOV A,#DIS_BUFL
01C8 C0D0 141 PUSH PSW
01CA 2B 142 ADD A,R3
01CB 2410 143 ADD A,#16
01CD F8 144 MOV R0,A
01CE E6 145 MOV A,@R0
01CF D0D0 146 POP PSW
01D1 33 147 RLC A
01D2 F6 148 MOV @R0,A
149
01D3 7460 150 MOV A,#DIS_BUFH ;显示缓冲区地址送A
01D5 C0D0 151 PUSH PSW
01D7 2B 152 ADD A,R3
01D8 F8 153 MOV R0,A
01D9 E6 154 MOV A,@R0
01DA D0D0 155 POP PSW
01DC 33 156 RLC A ;上缓冲区低字节的高位进入 这个缓冲区高字节低位,
01DD F6 157 MOV @R0,A
158
01DE 7440 159 MOV A,#DIS_BUFL
01E0 C0D0 160 PUSH PSW
01E2 2B 161 ADD A,R3
01E3 F8 162 MOV R0,A
01E4 E6 163 MOV A,@R0
01E5 D0D0 164 POP PSW
01E7 33 165 RLC A
01E8 F6 166 MOV @R0,A
167
168
169
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -