📄 解读.lst
字号:
00FD 01FB MOVW R30,R22
00FE 8020 LDD R2,Z+0
00FF 2022 TST R2
0100 F409 BNE 0x0102
0101 C030 RJMP 0x0132
(0116) for(i=0;;i++)
0102 2744 CLR R20
(0117) {
(0118) if(*(s+i)=='\0')break;
0103 2FE4 MOV R30,R20
0104 27FF CLR R31
0105 0FE6 ADD R30,R22
0106 1FF7 ADC R31,R23
0107 8020 LDD R2,Z+0
0108 2022 TST R2
0109 F409 BNE 0x010B
010A C027 RJMP 0x0132
(0119) if(!i%2)
010B 2344 TST R20
010C F421 BNE 0x0111
010D E081 LDI R24,1
010E E090 LDI R25,0
010F 017C MOVW R14,R24
0110 C002 RJMP 0x0113
0111 24EE CLR R14
0112 24FF CLR R15
0113 E022 LDI R18,2
0114 E030 LDI R19,0
0115 0187 MOVW R16,R14
0116 940E03EE CALL mod16s
0118 3000 CPI R16,0
0119 0701 CPC R16,R17
011A F019 BEQ 0x011E
(0120) Set_display_Adress(y,x);
011B 2D2A MOV R18,R10
011C 2D0C MOV R16,R12
011D DFB3 RCALL _Set_display_Adress
(0121) WriteData(*(s+i));
011E 2FE4 MOV R30,R20
011F 27FF CLR R31
0120 0FE6 ADD R30,R22
0121 1FF7 ADC R31,R23
0122 8100 LDD R16,Z+0
0123 DF7E RCALL _WriteData
(0122) if(i%2)x++;
0124 E012 LDI R17,2
0125 2F04 MOV R16,R20
0126 940E0428 CALL mod8u
0128 2300 TST R16
0129 F009 BEQ 0x012B
012A 94A3 INC R10
(0123) if(x>7){y++,x=0;}
012B E087 LDI R24,7
012C 158A CP R24,R10
012D F410 BCC 0x0130
012E 94C3 INC R12
012F 24AA CLR R10
0130 9543 INC R20
0131 CFD1 RJMP 0x0103
0132 940E0446 CALL pop_gset5
0134 9508 RET
_display_Char:
ch --> Y+4
x --> R22
y --> R20
0135 940E044F CALL push_gset2
0137 2F62 MOV R22,R18
0138 2F40 MOV R20,R16
(0124) }
(0125) }
(0126) //显示单个字符
(0127) void display_Char(uchar y,uchar x,char ch)
(0128) {
(0129) Set_display_Adress(y,x);
0139 2F26 MOV R18,R22
013A 2F04 MOV R16,R20
013B DF95 RCALL _Set_display_Adress
(0130) WriteData(ch);
013C 810C LDD R16,Y+4
013D DF64 RCALL _WriteData
013E 940E0440 CALL pop_gset2
0140 9508 RET
_display_Num:
tmp --> Y+0
i --> R20
N --> R22
num --> R10
x --> R12
y --> R14
0141 940E0449 CALL push_gset5
0143 2EC2 MOV R12,R18
0144 2EE0 MOV R14,R16
0145 9725 SBIW R28,5
0146 84AF LDD R10,Y+15
0147 88B8 LDD R11,Y+16
0148 8969 LDD R22,Y+17
(0131)
(0132) }
(0133) //可以显示 N 位的的整数num,(从个位起)最多显示6位
(0134) void display_Num(uchar y,uchar x,uint num,char N)//
(0135) {
(0136) char tmp[5],i;//加大数组可以达到加多显示数位的效果
(0137) //N%=6;
(0138) for(i=0;i<N;i++)
0149 2744 CLR R20
014A C012 RJMP 0x015D
(0139) {
(0140) tmp[i]=(num%10);
014B E02A LDI R18,0xA
014C E030 LDI R19,0
014D 0185 MOVW R16,R10
014E 940E040C CALL mod16u
0150 01CE MOVW R24,R28
0151 2FE4 MOV R30,R20
0152 27FF CLR R31
0153 0FE8 ADD R30,R24
0154 1FF9 ADC R31,R25
0155 8300 STD Z+0,R16
(0141) num/=10;
0156 E02A LDI R18,0xA
0157 E030 LDI R19,0
0158 0185 MOVW R16,R10
0159 940E040E CALL div16u
015B 0158 MOVW R10,R16
015C 9543 INC R20
015D 1746 CP R20,R22
015E F360 BCS 0x014B
(0142) };
(0143) i--;
015F 954A DEC R20
0160 C030 RJMP 0x0191
(0144) while(1)
(0145) {
(0146) Set_display_Adress(y,x);
0161 2D2C MOV R18,R12
0162 2D0E MOV R16,R14
0163 DF6D RCALL _Set_display_Adress
(0147) WriteData(tmp[i--]+0x30);
0164 2E24 MOV R2,R20
0165 2433 CLR R3
0166 5041 SUBI R20,1
0167 01CE MOVW R24,R28
0168 2DE2 MOV R30,R2
0169 27FF CLR R31
016A 0FE8 ADD R30,R24
016B 1FF9 ADC R31,R25
016C 8100 LDD R16,Z+0
016D 5D00 SUBI R16,0xD0
016E DF33 RCALL _WriteData
(0148) if(!i)
016F 2344 TST R20
0170 F449 BNE 0x017A
(0149) {WriteData(tmp[i]+0x30);break;}
0171 01CE MOVW R24,R28
0172 2FE4 MOV R30,R20
0173 27FF CLR R31
0174 0FE8 ADD R30,R24
0175 1FF9 ADC R31,R25
0176 8100 LDD R16,Z+0
0177 5D00 SUBI R16,0xD0
0178 DF29 RCALL _WriteData
0179 C018 RJMP 0x0192
(0150) WriteData(tmp[i--]+0x30);
017A 2E24 MOV R2,R20
017B 2433 CLR R3
017C 5041 SUBI R20,1
017D 01CE MOVW R24,R28
017E 2DE2 MOV R30,R2
017F 27FF CLR R31
0180 0FE8 ADD R30,R24
0181 1FF9 ADC R31,R25
0182 8100 LDD R16,Z+0
0183 5D00 SUBI R16,0xD0
0184 DF1D RCALL _WriteData
(0151) if(!i)
0185 2344 TST R20
0186 F449 BNE 0x0190
(0152) {WriteData(tmp[i]+0x30);break;}
0187 01CE MOVW R24,R28
0188 2FE4 MOV R30,R20
0189 27FF CLR R31
018A 0FE8 ADD R30,R24
018B 1FF9 ADC R31,R25
018C 8100 LDD R16,Z+0
018D 5D00 SUBI R16,0xD0
018E DF13 RCALL _WriteData
018F C002 RJMP 0x0192
(0153) x++;
0190 94C3 INC R12
0191 CFCF RJMP 0x0161
(0154) }
(0155) x--;
0192 94CA DEC R12
0193 9625 ADIW R28,5
0194 940E0446 CALL pop_gset5
0196 9508 RET
_Display_Picture:
i --> R20
x --> R22
y --> R14
j --> R10
l --> Y+0
k --> R12
tab --> Y+12
0197 931A ST R17,-Y
0198 930A ST R16,-Y
0199 940E0449 CALL push_gset5
019B 9722 SBIW R28,2
(0156) }
(0157) //全屏显示图形子程序 128*64
(0158) void Display_Picture(const uchar *tab )
(0159) {
(0160) unsigned i,j,k,l=0,x=0x80,y;
019C 2400 CLR R0
019D 2411 CLR R1
019E 8219 STD Y+1,R1
019F 8208 STD Y+0,R0
01A0 E860 LDI R22,0x80
01A1 E070 LDI R23,0
(0161) for(i=0;i<2;i++) //x=0x80 为第一行
01A2 2744 CLR R20
01A3 2755 CLR R21
01A4 C037 RJMP 0x01DC
(0162) {
(0163) for(j=0,y=0x80; j<32;j++,y++)//y为水平方向以字节为单位
01A5 24AA CLR R10
01A6 24BB CLR R11
01A7 E880 LDI R24,0x80
01A8 E090 LDI R25,0
01A9 017C MOVW R14,R24
01AA C027 RJMP 0x01D2
(0164) {
(0165) WriteCommand(0x36); //8位扩充指令集,允许绘图
01AB E306 LDI R16,0x36
01AC DF06 RCALL _WriteCommand
(0166) WriteCommand(y);//地址设置
01AD 2D0E MOV R16,R14
01AE DF04 RCALL _WriteCommand
(0167) WriteCommand(x);
01AF 2F06 MOV R16,R22
01B0 DF02 RCALL _WriteCommand
(0168) WriteCommand(0x30);
01B1 E300 LDI R16,0x30
01B2 DF00 RCALL _WriteCommand
(0169) k=16;
01B3 E180 LDI R24,0x10
01B4 E090 LDI R25,0
01B5 016C MOVW R12,R24
01B6 C00D RJMP 0x01C4
(0170) while(k--)
(0171) WriteData(tab[l++]); //时间复杂度(16*32)*2=32*32=32个H代码控制一个汉字,共有32个汉字,则是全屏
01B7 8028 LDD R2,Y+0
01B8 8039 LDD R3,Y+1
01B9 01C1 MOVW R24,R2
01BA 9601 ADIW R24,1
01BB 8399 STD Y+1,R25
01BC 8388 STD Y+0,R24
01BD 01F1 MOVW R30,R2
01BE 840C LDD R0,Y+12
01BF 841D LDD R1,Y+13
01C0 0DE0 ADD R30,R0
01C1 1DF1 ADC R31,R1
01C2 9104 LPM R16,0(Z)
01C3 DEDE RCALL _WriteData
01C4 0116 MOVW R2,R12
01C5 01C1 MOVW R24,R2
01C6 9701 SBIW R24,1
01C7 016C MOVW R12,R24
01C8 2022 TST R2
01C9 F769 BNE 0x01B7
01CA 2033 TST R3
01CB F759 BNE 0x01B7
01CC 01C5 MOVW R24,R10
01CD 9601 ADIW R24,1
01CE 015C MOVW R10,R24
01CF 01C7 MOVW R24,R14
01D0 9601 ADIW R24,1
01D1 017C MOVW R14,R24
01D2 01C5 MOVW R24,R10
01D3 3280 CPI R24,0x20
01D4 E0E0 LDI R30,0
01D5 079E CPC R25,R30
01D6 F408 BCC 0x01D8
01D7 CFD3 RJMP 0x01AB
(0172) } //按顺序读入:0->(32*32-1)
(0173) x=0x88;//第三行
01D8 E868 LDI R22,0x88
01D9 E070 LDI R23,0
01DA 5F4F SUBI R20,0xFF
01DB 4F5F SBCI R21,0xFF
01DC 3042 CPI R20,2
01DD E0E0 LDI R30,0
01DE 075E CPC R21,R30
01DF F408 BCC 0x01E1
01E0 CFC4 RJMP 0x01A5
01E1 9622 ADIW R28,2
01E2 940E0446 CALL pop_gset5
01E4 9622 ADIW R28,2
01E5 9508 RET
_Display_Picture32:
i --> Y+1
x --> R22
y --> R10
j --> R20
l --> Y+0
k --> R14
tab --> R12
01E6 940E0449 CALL push_gset5
01E8 0168 MOVW R12,R16
01E9 9722 SBIW R28,2
(0174) }
(0175) }
(0176) //显示图形子程序 32*32
(0177) void Display_Picture32( unsigned char *tab )//
(0178) {
(0179) unsigned i,j,k,l=0,x=0x80,y;
01EA 2400 CLR R0
01EB 2411 CLR R1
01EC 8219 STD Y+1,R1
01ED 8208 STD Y+0,R0
01EE E860 LDI R22,0x80
01EF E070 LDI R23,0
(0180)
(0181) for(j=0,y=0x80; j<32;j++,y++)//水平扫描32行 第一个32行(汉字的两行)为一个连续地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -