📄 gps.lst
字号:
(0264) if(x==1) WriteCommand(0x0c|0x03);
0264 3041 CPI R20,1
0265 F419 BNE 0x0269
0266 E00F LDI R16,0xF
0267 DFE8 RCALL _WriteCommand
0268 C002 RJMP 0x026B
(0265) else WriteCommand(0x0c);
0269 E00C LDI R16,0xC
026A DFE5 RCALL _WriteCommand
026B 940E0861 CALL pop_gset1
026D 9508 RET
_Set_display_Adress:
address --> R20
x --> R22
y --> R20
026E 940E085C CALL push_gset2
0270 2F62 MOV R22,R18
0271 2F40 MOV R20,R16
(0266) }
(0267)
(0268) // 设置显示坐标:y行,x列
(0269) void Set_display_Adress(uchar y,uchar x)//
(0270) {
(0271) uchar address;
(0272) switch(y)
0272 2755 CLR R21
0273 3040 CPI R20,0
0274 0745 CPC R20,R21
0275 F069 BEQ 0x0283
0276 3041 CPI R20,1
0277 E0E0 LDI R30,0
0278 075E CPC R21,R30
0279 F061 BEQ 0x0286
027A 3042 CPI R20,2
027B E0E0 LDI R30,0
027C 075E CPC R21,R30
027D F059 BEQ 0x0289
027E 3043 CPI R20,3
027F E0E0 LDI R30,0
0280 075E CPC R21,R30
0281 F051 BEQ 0x028C
0282 C00B RJMP 0x028E
(0273) {
(0274) case 0:
(0275) address=0x80+x;
0283 2F46 MOV R20,R22
0284 5840 SUBI R20,0x80
(0276) break;
0285 C008 RJMP 0x028E
(0277) case 1:
(0278) address=0x90+x;
0286 2F46 MOV R20,R22
0287 5740 SUBI R20,0x70
(0279) break;
0288 C005 RJMP 0x028E
(0280) case 2:
(0281) address=0x88+x;
0289 2F46 MOV R20,R22
028A 5748 SUBI R20,0x78
(0282) break;
028B C002 RJMP 0x028E
(0283) case 3:
(0284) address=0x98+x;
028C 2F46 MOV R20,R22
028D 5648 SUBI R20,0x68
(0285) break;
(0286) }
(0287) WriteCommand(address);
028E 2F04 MOV R16,R20
028F DFC0 RCALL _WriteCommand
0290 940E084A CALL pop_gset2
0292 9508 RET
_display_String:
i --> R20
s --> R22
x --> R10
y --> R12
0293 940E0856 CALL push_gset5
0295 2EA2 MOV R10,R18
0296 2EC0 MOV R12,R16
0297 856A LDD R22,Y+10
0298 857B LDD R23,Y+11
(0288) }
(0289) //显示字符串
(0290) void display_String(uchar y,uchar x,uchar *s) //
(0291) {
(0292) uchar i=0;
0299 2744 CLR R20
(0293) if(*s=='\0')return;
029A 01FB MOVW R30,R22
029B 8020 LDD R2,Z+0
029C 2022 TST R2
029D F409 BNE 0x029F
029E C030 RJMP 0x02CF
(0294) for(i=0;;i++)
029F 2744 CLR R20
(0295) {
(0296) if(*(s+i)=='\0')break;
02A0 2FE4 MOV R30,R20
02A1 27FF CLR R31
02A2 0FE6 ADD R30,R22
02A3 1FF7 ADC R31,R23
02A4 8020 LDD R2,Z+0
02A5 2022 TST R2
02A6 F409 BNE 0x02A8
02A7 C027 RJMP 0x02CF
(0297) if(!i%2)
02A8 2344 TST R20
02A9 F421 BNE 0x02AE
02AA E081 LDI R24,1
02AB E090 LDI R25,0
02AC 017C MOVW R14,R24
02AD C002 RJMP 0x02B0
02AE 24EE CLR R14
02AF 24FF CLR R15
02B0 E022 LDI R18,2
02B1 E030 LDI R19,0
02B2 0187 MOVW R16,R14
02B3 940E07E8 CALL mod16s
02B5 3000 CPI R16,0
02B6 0701 CPC R16,R17
02B7 F019 BEQ 0x02BB
(0298) Set_display_Adress(y,x);
02B8 2D2A MOV R18,R10
02B9 2D0C MOV R16,R12
02BA DFB3 RCALL _Set_display_Adress
(0299) WriteData(*(s+i));
02BB 2FE4 MOV R30,R20
02BC 27FF CLR R31
02BD 0FE6 ADD R30,R22
02BE 1FF7 ADC R31,R23
02BF 8100 LDD R16,Z+0
02C0 DF7E RCALL _WriteData
(0300) if(i%2)x++;
02C1 E012 LDI R17,2
02C2 2F04 MOV R16,R20
02C3 940E0822 CALL mod8u
02C5 2300 TST R16
02C6 F009 BEQ 0x02C8
02C7 94A3 INC R10
(0301) if(x>7){y++,x=0;}
02C8 E087 LDI R24,7
02C9 158A CP R24,R10
02CA F410 BCC 0x02CD
02CB 94C3 INC R12
02CC 24AA CLR R10
02CD 9543 INC R20
02CE CFD1 RJMP 0x02A0
02CF 940E0853 CALL pop_gset5
02D1 9508 RET
_display_Char:
ch --> Y+4
x --> R22
y --> R20
02D2 940E085C CALL push_gset2
02D4 2F62 MOV R22,R18
02D5 2F40 MOV R20,R16
(0302) }
(0303) }
(0304) //显示单个字符
(0305) void display_Char(uchar y,uchar x,char ch)
(0306) {
(0307) Set_display_Adress(y,x);
02D6 2F26 MOV R18,R22
02D7 2F04 MOV R16,R20
02D8 DF95 RCALL _Set_display_Adress
(0308) WriteData(ch);
02D9 810C LDD R16,Y+4
02DA DF64 RCALL _WriteData
02DB 940E084A CALL pop_gset2
02DD 9508 RET
_display_Num:
tmp --> Y+0
i --> R20
N --> R22
num --> R10
x --> R12
y --> R14
02DE 940E0856 CALL push_gset5
02E0 2EC2 MOV R12,R18
02E1 2EE0 MOV R14,R16
02E2 9725 SBIW R28,5
02E3 84AF LDD R10,Y+15
02E4 88B8 LDD R11,Y+16
02E5 8969 LDD R22,Y+17
(0309)
(0310) }
(0311) //可以显示 N 位的的整数num,(从个位起)最多显示6位
(0312) void display_Num(uchar y,uchar x,uint num,char N)//
(0313) {
(0314) char tmp[5],i;//加大数组可以达到加多显示数位的效果
(0315) //N%=6;
(0316) for(i=0;i<N;i++)
02E6 2744 CLR R20
02E7 C012 RJMP 0x02FA
(0317) {
(0318) tmp[i]=(num%10);
02E8 E02A LDI R18,0xA
02E9 E030 LDI R19,0
02EA 0185 MOVW R16,R10
02EB 940E0806 CALL mod16u
02ED 01CE MOVW R24,R28
02EE 2FE4 MOV R30,R20
02EF 27FF CLR R31
02F0 0FE8 ADD R30,R24
02F1 1FF9 ADC R31,R25
02F2 8300 STD Z+0,R16
(0319) num/=10;
02F3 E02A LDI R18,0xA
02F4 E030 LDI R19,0
02F5 0185 MOVW R16,R10
02F6 940E0808 CALL div16u
02F8 0158 MOVW R10,R16
02F9 9543 INC R20
02FA 1746 CP R20,R22
02FB F360 BCS 0x02E8
(0320) };
(0321) i--;
02FC 954A DEC R20
02FD C030 RJMP 0x032E
(0322) while(1)
(0323) {
(0324) Set_display_Adress(y,x);
02FE 2D2C MOV R18,R12
02FF 2D0E MOV R16,R14
0300 DF6D RCALL _Set_display_Adress
(0325) WriteData(tmp[i--]+0x30);
0301 2E24 MOV R2,R20
0302 2433 CLR R3
0303 5041 SUBI R20,1
0304 01CE MOVW R24,R28
0305 2DE2 MOV R30,R2
0306 27FF CLR R31
0307 0FE8 ADD R30,R24
0308 1FF9 ADC R31,R25
0309 8100 LDD R16,Z+0
030A 5D00 SUBI R16,0xD0
030B DF33 RCALL _WriteData
(0326) if(!i)
030C 2344 TST R20
030D F449 BNE 0x0317
(0327) {WriteData(tmp[i]+0x30);break;}
030E 01CE MOVW R24,R28
030F 2FE4 MOV R30,R20
0310 27FF CLR R31
0311 0FE8 ADD R30,R24
0312 1FF9 ADC R31,R25
0313 8100 LDD R16,Z+0
0314 5D00 SUBI R16,0xD0
0315 DF29 RCALL _WriteData
0316 C018 RJMP 0x032F
(0328) WriteData(tmp[i--]+0x30);
0317 2E24 MOV R2,R20
0318 2433 CLR R3
0319 5041 SUBI R20,1
031A 01CE MOVW R24,R28
031B 2DE2 MOV R30,R2
031C 27FF CLR R31
031D 0FE8 ADD R30,R24
031E 1FF9 ADC R31,R25
031F 8100 LDD R16,Z+0
0320 5D00 SUBI R16,0xD0
0321 DF1D RCALL _WriteData
(0329) if(!i)
0322 2344 TST R20
0323 F449 BNE 0x032D
(0330) {WriteData(tmp[i]+0x30);break;}
0324 01CE MOVW R24,R28
0325 2FE4 MOV R30,R20
0326 27FF CLR R31
0327 0FE8 ADD R30,R24
0328 1FF9 ADC R31,R25
0329 8100 LDD R16,Z+0
032A 5D00 SUBI R16,0xD0
032B DF13 RCALL _WriteData
032C C002 RJMP 0x032F
(0331) x++;
032D 94C3 INC R12
032E CFCF RJMP 0x02FE
(0332) }
(0333) x--;
032F 94CA DEC R12
0330 9625 ADIW R28,5
0331 940E0853 CALL pop_gset5
0333 9508 RET
_Display_Picture:
i --> R20
x --> R22
y --> R14
j --> R10
l --> Y+0
k --> R12
tab --> Y+12
0334 931A ST R17,-Y
0335 930A ST R16,-Y
0336 940E0856 CALL push_gset5
0338 9722 SBIW R28,2
(0334) }
(0335) //全屏显示图形子程序 128*64
(0336) void Display_Picture(const uchar *tab )
(0337) {
(0338) unsigned i,j,k,l=0,x=0x80,y;
0339 2400 CLR R0
033A 2411 CLR R1
033B 8219 STD Y+1,R1
033C 8208 STD Y+0,R0
033D E860 LDI R22,0x80
033E E070 LDI R23,0
(0339) for(i=0;i<2;i++) //x=0x80 为第一行
033F 2744 CLR R20
0340 2755 CLR R21
0341 C037 RJMP 0x0379
(0340) {
(0341) for(j=0,y=0x80; j<32;j++,y++)//y为水平方向以字节为单位
0342 24AA CLR R10
0343 24BB CLR R11
0344 E880 LDI R24,0x80
0345 E090 LDI R25,0
0346 017C MOVW R14,R24
0347 C027 RJMP 0x036F
(0342) {
(0343) WriteCommand(0x36); //8位扩充指令集,允许绘图
0348 E306 LDI R16,0x36
0349 DF06 RCALL _WriteCommand
(0344) WriteCommand(y);//地址设置
034A 2D0E MOV R16,R14
034B DF04 RCALL _WriteCommand
(0345) WriteCommand(x);
034C 2F06 MOV R16,R22
034D DF02 RCALL _WriteCommand
(0346) WriteCommand(0x30);
034E E300 LDI R16,0x30
034F DF00 RCALL _WriteCommand
(0347) k=16;
0350 E180 LDI R24,0x10
0351 E090 LDI R25,0
0352 016C MOVW R12,R24
0353 C00D RJMP 0x0361
(0348) while(k--)
(0349) WriteData(tab[l++]); //时间复杂度(16*32)*2=32*32=32个H代码控制一个汉字,共有32个汉字,则是全屏
0354 8028 LDD R2,Y+0
0355 8039 LDD R3,Y+1
0356 01C1 MOVW R24,R2
0357 9601 ADIW R24,1
0358 8399 STD Y+1,R25
0359 8388 STD Y+0,R24
035A 01F1 MOVW R30,R2
035B 840C LDD R0,Y+12
035C 841D LDD R1,Y+13
035D 0DE0 ADD R30,R0
035E 1DF1 ADC R31,R1
035F 9104 LPM R16,0(Z)
0360 DEDE RCALL _WriteData
0361 0116 MOVW R2,R12
0362 01C1 MOVW R24,R2
0363 9701 SBIW R24,1
0364 016C MOVW R12,R24
0365 2022 TST R2
0366 F769 BNE 0x0354
0367 2033 TST R3
0368 F759 BNE 0x0354
0369 01C5 MOVW R24,R10
036A 9601 ADIW R24,1
036B 015C MOVW R10,R24
036C 01C7 MOVW R24,R14
036D 9601 ADIW R24,1
036E 017C MOVW R14,R24
036F 01C5 MOVW R24,R10
0370 3280 CPI R24,0x20
0371 E0E0 LDI R30,0
0372 079E CPC R25,R30
0373 F408 BCC 0x0375
0374 CFD3 RJMP 0x0348
(0350) } //按顺序读入:0->(32*32-1)
(0351) x=0x88;//第三行
0375 E868 LDI R22,0x88
0376 E070 LDI R23,0
0377 5F4F SUBI R20,0xFF
0378 4F5F SBCI R21,0xFF
0379 3042 CPI R20,2
037A E0E0 LDI R30,0
037B 075E CPC R21,R30
037C F408 BCC 0x037E
037D CFC4 RJMP 0x0342
037E 9622 ADIW R28,2
037F 940E0853 CALL pop_gset5
0381 9622 ADIW R28,2
0382 9508 RET
_Display_Picture32:
i --> Y+1
x --> R22
y --> R10
j --> R20
l --> Y+0
k --> R14
tab --> R12
0383 940E0856 CALL push_gset5
0385 0168 MOVW R12,R16
0386 9722 SBIW R28,2
(0352) }
(0353) }
(0354) //显示图形子程序 32*32
(0355) void Display_Picture32( unsigned char *tab )//
(0356) {
(0357) unsigned i,j,k,l=0,x=0x80,y;
0387 2400 CLR R0
0388 2411 CLR R1
0389 8219 STD Y+1,R1
038A 8208 STD Y+0,R0
038B E860 LDI R22,0x80
038C E070 LDI R23,0
(0358)
(0359) for(j=0,y=0x80; j<32;j++,y++)//水平扫描32行 第一个32行(汉字的两行)为一个连续地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -