📄 gsm_m22.lst
字号:
(0117) if(*s=='\0')return;
0183 01FB MOVW R30,R22
0184 8020 LDD R2,Z+0
0185 2022 TST R2
0186 F409 BNE 0x0188
0187 C030 RJMP 0x01B8
(0118) for(i=0;;i++)
0188 2744 CLR R20
(0119) {
(0120) if(*(s+i)=='\0')break;
0189 2FE4 MOV R30,R20
018A 27FF CLR R31
018B 0FE6 ADD R30,R22
018C 1FF7 ADC R31,R23
018D 8020 LDD R2,Z+0
018E 2022 TST R2
018F F409 BNE 0x0191
0190 C027 RJMP 0x01B8
(0121) if(!i%2)
0191 2344 TST R20
0192 F421 BNE 0x0197
0193 E081 LDI R24,1
0194 E090 LDI R25,0
0195 017C MOVW R14,R24
0196 C002 RJMP 0x0199
0197 24EE CLR R14
0198 24FF CLR R15
0199 E022 LDI R18,2
019A E030 LDI R19,0
019B 0187 MOVW R16,R14
019C 940E04D4 CALL mod16s
019E 3000 CPI R16,0
019F 0701 CPC R16,R17
01A0 F019 BEQ 0x01A4
(0122) Set_display_Adress(y,x);
01A1 2D2A MOV R18,R10
01A2 2D0C MOV R16,R12
01A3 DFB3 RCALL _Set_display_Adress
(0123) WriteData(*(s+i));
01A4 2FE4 MOV R30,R20
01A5 27FF CLR R31
01A6 0FE6 ADD R30,R22
01A7 1FF7 ADC R31,R23
01A8 8100 LDD R16,Z+0
01A9 DF7E RCALL _WriteData
(0124) if(i%2)x++;
01AA E012 LDI R17,2
01AB 2F04 MOV R16,R20
01AC 940E050E CALL mod8u
01AE 2300 TST R16
01AF F009 BEQ 0x01B1
01B0 94A3 INC R10
(0125) if(x>7){y++,x=0;}
01B1 E087 LDI R24,7
01B2 158A CP R24,R10
01B3 F410 BCC 0x01B6
01B4 94C3 INC R12
01B5 24AA CLR R10
01B6 9543 INC R20
01B7 CFD1 RJMP 0x0189
01B8 940E052F CALL pop_gset5
01BA 9508 RET
_display_Char:
ch --> Y+4
x --> R22
y --> R20
01BB 940E0538 CALL push_gset2
01BD 2F62 MOV R22,R18
01BE 2F40 MOV R20,R16
(0126) }
(0127) }
(0128) //显示单个字符
(0129) void display_Char(uchar y,uchar x,char ch)
(0130) {
(0131) Set_display_Adress(y,x);
01BF 2F26 MOV R18,R22
01C0 2F04 MOV R16,R20
01C1 DF95 RCALL _Set_display_Adress
(0132) WriteData(ch);
01C2 810C LDD R16,Y+4
01C3 DF64 RCALL _WriteData
01C4 940E0526 CALL pop_gset2
01C6 9508 RET
_display_Num:
tmp --> Y+0
i --> R20
N --> R22
num --> R10
x --> R12
y --> R14
01C7 940E0532 CALL push_gset5
01C9 2EC2 MOV R12,R18
01CA 2EE0 MOV R14,R16
01CB 9725 SBIW R28,5
01CC 84AF LDD R10,Y+15
01CD 88B8 LDD R11,Y+16
01CE 8969 LDD R22,Y+17
(0133)
(0134) }
(0135) //可以显示 N 位的的整数num,(从个位起)最多显示6位
(0136) void display_Num(uchar y,uchar x,uint num,char N)//
(0137) {
(0138) char tmp[5],i;//加大数组可以达到加多显示数位的效果
(0139) //N%=6;
(0140) for(i=0;i<N;i++)
01CF 2744 CLR R20
01D0 C012 RJMP 0x01E3
(0141) {
(0142) tmp[i]=(num%10);
01D1 E02A LDI R18,0xA
01D2 E030 LDI R19,0
01D3 0185 MOVW R16,R10
01D4 940E04F2 CALL mod16u
01D6 01CE MOVW R24,R28
01D7 2FE4 MOV R30,R20
01D8 27FF CLR R31
01D9 0FE8 ADD R30,R24
01DA 1FF9 ADC R31,R25
01DB 8300 STD Z+0,R16
(0143) num/=10;
01DC E02A LDI R18,0xA
01DD E030 LDI R19,0
01DE 0185 MOVW R16,R10
01DF 940E04F4 CALL div16u
01E1 0158 MOVW R10,R16
01E2 9543 INC R20
01E3 1746 CP R20,R22
01E4 F360 BCS 0x01D1
(0144) };
(0145) i--;
01E5 954A DEC R20
01E6 C030 RJMP 0x0217
(0146) while(1)
(0147) {
(0148) Set_display_Adress(y,x);
01E7 2D2C MOV R18,R12
01E8 2D0E MOV R16,R14
01E9 DF6D RCALL _Set_display_Adress
(0149) WriteData(tmp[i--]+0x30);
01EA 2E24 MOV R2,R20
01EB 2433 CLR R3
01EC 5041 SUBI R20,1
01ED 01CE MOVW R24,R28
01EE 2DE2 MOV R30,R2
01EF 27FF CLR R31
01F0 0FE8 ADD R30,R24
01F1 1FF9 ADC R31,R25
01F2 8100 LDD R16,Z+0
01F3 5D00 SUBI R16,0xD0
01F4 DF33 RCALL _WriteData
(0150) if(!i)
01F5 2344 TST R20
01F6 F449 BNE 0x0200
(0151) {WriteData(tmp[i]+0x30);break;}
01F7 01CE MOVW R24,R28
01F8 2FE4 MOV R30,R20
01F9 27FF CLR R31
01FA 0FE8 ADD R30,R24
01FB 1FF9 ADC R31,R25
01FC 8100 LDD R16,Z+0
01FD 5D00 SUBI R16,0xD0
01FE DF29 RCALL _WriteData
01FF C018 RJMP 0x0218
(0152) WriteData(tmp[i--]+0x30);
0200 2E24 MOV R2,R20
0201 2433 CLR R3
0202 5041 SUBI R20,1
0203 01CE MOVW R24,R28
0204 2DE2 MOV R30,R2
0205 27FF CLR R31
0206 0FE8 ADD R30,R24
0207 1FF9 ADC R31,R25
0208 8100 LDD R16,Z+0
0209 5D00 SUBI R16,0xD0
020A DF1D RCALL _WriteData
(0153) if(!i)
020B 2344 TST R20
020C F449 BNE 0x0216
(0154) {WriteData(tmp[i]+0x30);break;}
020D 01CE MOVW R24,R28
020E 2FE4 MOV R30,R20
020F 27FF CLR R31
0210 0FE8 ADD R30,R24
0211 1FF9 ADC R31,R25
0212 8100 LDD R16,Z+0
0213 5D00 SUBI R16,0xD0
0214 DF13 RCALL _WriteData
0215 C002 RJMP 0x0218
(0155) x++;
0216 94C3 INC R12
0217 CFCF RJMP 0x01E7
(0156) }
(0157) x--;
0218 94CA DEC R12
0219 9625 ADIW R28,5
021A 940E052F CALL pop_gset5
021C 9508 RET
_Display_Picture:
i --> R20
x --> R22
y --> R14
j --> R10
l --> Y+0
k --> R12
tab --> Y+12
021D 931A ST R17,-Y
021E 930A ST R16,-Y
021F 940E0532 CALL push_gset5
0221 9722 SBIW R28,2
(0158) }
(0159) //全屏显示图形子程序 128*64
(0160) void Display_Picture(const uchar *tab )
(0161) {
(0162) unsigned i,j,k,l=0,x=0x80,y;
0222 2400 CLR R0
0223 2411 CLR R1
0224 8219 STD Y+1,R1
0225 8208 STD Y+0,R0
0226 E860 LDI R22,0x80
0227 E070 LDI R23,0
(0163) for(i=0;i<2;i++) //x=0x80 为第一行
0228 2744 CLR R20
0229 2755 CLR R21
022A C037 RJMP 0x0262
(0164) {
(0165) for(j=0,y=0x80; j<32;j++,y++)//y为水平方向以字节为单位
022B 24AA CLR R10
022C 24BB CLR R11
022D E880 LDI R24,0x80
022E E090 LDI R25,0
022F 017C MOVW R14,R24
0230 C027 RJMP 0x0258
(0166) {
(0167) WriteCommand(0x36); //8位扩充指令集,允许绘图
0231 E306 LDI R16,0x36
0232 DF06 RCALL _WriteCommand
(0168) WriteCommand(y);//地址设置
0233 2D0E MOV R16,R14
0234 DF04 RCALL _WriteCommand
(0169) WriteCommand(x);
0235 2F06 MOV R16,R22
0236 DF02 RCALL _WriteCommand
(0170) WriteCommand(0x30);
0237 E300 LDI R16,0x30
0238 DF00 RCALL _WriteCommand
(0171) k=16;
0239 E180 LDI R24,0x10
023A E090 LDI R25,0
023B 016C MOVW R12,R24
023C C00D RJMP 0x024A
(0172) while(k--)
(0173) WriteData(tab[l++]); //时间复杂度(16*32)*2=32*32=32个H代码控制一个汉字,共有32个汉字,则是全屏
023D 8028 LDD R2,Y+0
023E 8039 LDD R3,Y+1
023F 01C1 MOVW R24,R2
0240 9601 ADIW R24,1
0241 8399 STD Y+1,R25
0242 8388 STD Y+0,R24
0243 01F1 MOVW R30,R2
0244 840C LDD R0,Y+12
0245 841D LDD R1,Y+13
0246 0DE0 ADD R30,R0
0247 1DF1 ADC R31,R1
0248 9104 LPM R16,0(Z)
0249 DEDE RCALL _WriteData
024A 0116 MOVW R2,R12
024B 01C1 MOVW R24,R2
024C 9701 SBIW R24,1
024D 016C MOVW R12,R24
024E 2022 TST R2
024F F769 BNE 0x023D
0250 2033 TST R3
0251 F759 BNE 0x023D
0252 01C5 MOVW R24,R10
0253 9601 ADIW R24,1
0254 015C MOVW R10,R24
0255 01C7 MOVW R24,R14
0256 9601 ADIW R24,1
0257 017C MOVW R14,R24
0258 01C5 MOVW R24,R10
0259 3280 CPI R24,0x20
025A E0E0 LDI R30,0
025B 079E CPC R25,R30
025C F408 BCC 0x025E
025D CFD3 RJMP 0x0231
(0174) } //按顺序读入:0->(32*32-1)
(0175) x=0x88;//第三行
025E E868 LDI R22,0x88
025F E070 LDI R23,0
0260 5F4F SUBI R20,0xFF
0261 4F5F SBCI R21,0xFF
0262 3042 CPI R20,2
0263 E0E0 LDI R30,0
0264 075E CPC R21,R30
0265 F408 BCC 0x0267
0266 CFC4 RJMP 0x022B
0267 9622 ADIW R28,2
0268 940E052F CALL pop_gset5
026A 9622 ADIW R28,2
026B 9508 RET
_Display_Picture32:
i --> Y+1
x --> R22
y --> R10
j --> R20
l --> Y+0
k --> R14
tab --> R12
026C 940E0532 CALL push_gset5
026E 0168 MOVW R12,R16
026F 9722 SBIW R28,2
(0176) }
(0177) }
(0178) //显示图形子程序 32*32
(0179) void Display_Picture32( unsigned char *tab )//
(0180) {
(0181) unsigned i,j,k,l=0,x=0x80,y;
0270 2400 CLR R0
0271 2411 CLR R1
0272 8219 STD Y+1,R1
0273 8208 STD Y+0,R0
0274 E860 LDI R22,0x80
0275 E070 LDI R23,0
(0182)
(0183) for(j=0,y=0x80; j<32;j++,y++)//水平扫描32行 第一个32行(汉字的两行)为一个连续地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -