?? 016.lst
字號:
0460 940E0570 CALL push_gset4
0462 2EC2 MOV R12,R18
0463 2EA0 MOV R10,R16
(0151) }
(0152) }
(0153)
(0154) /*在指定位置顯示一個ASCII 字符*/
(0155) void disp_char(unsigned char x, unsigned char y, unsigned char ascii) {
(0156)
(0157) unsigned char i = 0x00;
0464 2766 CLR R22
(0158) const unsigned char *q; /*取字庫指針*/
(0159)
(0160) ascii -= 0x20;
0465 8588 LDD R24,Y+8
0466 5280 SUBI R24,0x20
0467 8788 STD Y+8,R24
(0161) q = &ENGLISH_FONT[ascii * 16];/*定位指針地址*/
0468 E180 LDI R24,0x10
0469 8408 LDD R0,Y+8
046A 9D80 MUL R24,R0
046B 01A0 MOVW R20,R0
046C E584 LDI R24,0x54
046D E090 LDI R25,0
046E 0F48 ADD R20,R24
046F 1F59 ADC R21,R25
(0162)
(0163) /*顯示高8位*/
(0164) i = 0x00;
(0165) if (x < 64) { /*地址在左半屏范圍內*/
0470 2D8A MOV R24,R10
0471 3480 CPI R24,0x40
0472 F4A0 BCC 0x0487
(0166) LCD0_write_com(y | 0xB8);
0473 2D0C MOV R16,R12
0474 6B08 ORI R16,0xB8
0475 DF5E RCALL _LCD0_write_com
(0167) LCD0_write_com(x | 0x40);
0476 2D0A MOV R16,R10
0477 6400 ORI R16,0x40
0478 DF5B RCALL _LCD0_write_com
0479 C00B RJMP 0x0485
(0168) while (i < 8) {
(0169) LCD0_write_data(*q);
047A 01FA MOVW R30,R20
047B 9104 LPM R16,0(Z)
047C DF77 RCALL _LCD0_write_data
(0170) q ++;
047D 5F4F SUBI R20,0xFF
047E 4F5F SBCI R21,0xFF
(0171) x ++;
047F 94A3 INC R10
(0172) i ++;
0480 9563 INC R22
(0173) if (x > 63) { /*判斷地址是否越界*/
0481 E38F LDI R24,0x3F
0482 158A CP R24,R10
0483 F408 BCC 0x0485
(0174) break;
0484 C002 RJMP 0x0487
0485 3068 CPI R22,0x8
0486 F398 BCS 0x047A
(0175) }
(0176) }
(0177) }
(0178) if (i < 8) { /*地址進入左半屏范圍*/
0487 3068 CPI R22,0x8
0488 F480 BCC 0x0499
(0179) LCD1_write_com(y | 0xB8);
0489 2D0C MOV R16,R12
048A 6B08 ORI R16,0xB8
048B DF58 RCALL _LCD1_write_com
(0180) LCD1_write_com(x | 0x40);
048C 2D0A MOV R16,R10
048D 6400 ORI R16,0x40
048E DF55 RCALL _LCD1_write_com
048F C007 RJMP 0x0497
(0181) while (i < 8) {
(0182) LCD1_write_data(*q);
0490 01FA MOVW R30,R20
0491 9104 LPM R16,0(Z)
0492 DF71 RCALL _LCD1_write_data
(0183) q ++;
0493 5F4F SUBI R20,0xFF
0494 4F5F SBCI R21,0xFF
(0184) x ++;
0495 94A3 INC R10
(0185) i ++;
0496 9563 INC R22
0497 3068 CPI R22,0x8
0498 F3B8 BCS 0x0490
(0186) }
(0187) }
(0188)
(0189) /*顯示低8位*/
(0190) i = 0x00;
0499 2766 CLR R22
(0191) x -= 8;
049A 2D8A MOV R24,R10
049B 5088 SUBI R24,0x8
049C 2EA8 MOV R10,R24
(0192) if (x < 64) { /*地址在左半屏范圍內*/
049D 3480 CPI R24,0x40
049E F4A8 BCC 0x04B4
(0193) LCD0_write_com((y+1) | 0xB8);
049F 2D0C MOV R16,R12
04A0 5F0F SUBI R16,0xFF
04A1 6B08 ORI R16,0xB8
04A2 DF31 RCALL _LCD0_write_com
(0194) LCD0_write_com(x | 0x40);
04A3 2D0A MOV R16,R10
04A4 6400 ORI R16,0x40
04A5 DF2E RCALL _LCD0_write_com
04A6 C00B RJMP 0x04B2
(0195) while (i < 8) {
(0196) LCD0_write_data(*q);
04A7 01FA MOVW R30,R20
04A8 9104 LPM R16,0(Z)
04A9 DF4A RCALL _LCD0_write_data
(0197) q ++;
04AA 5F4F SUBI R20,0xFF
04AB 4F5F SBCI R21,0xFF
(0198) x ++;
04AC 94A3 INC R10
(0199) i ++;
04AD 9563 INC R22
(0200) if (x > 63) { /*判斷地址是否越界*/
04AE E38F LDI R24,0x3F
04AF 158A CP R24,R10
04B0 F408 BCC 0x04B2
(0201) break;
04B1 C002 RJMP 0x04B4
04B2 3068 CPI R22,0x8
04B3 F398 BCS 0x04A7
(0202) }
(0203) }
(0204) }
(0205) if (i < 8) { /*地址進入左半屏范圍*/
04B4 3068 CPI R22,0x8
04B5 F488 BCC 0x04C7
(0206) LCD1_write_com((y+1) | 0xB8);
04B6 2D0C MOV R16,R12
04B7 5F0F SUBI R16,0xFF
04B8 6B08 ORI R16,0xB8
04B9 DF2A RCALL _LCD1_write_com
(0207) LCD1_write_com(x | 0x40);
04BA 2D0A MOV R16,R10
04BB 6400 ORI R16,0x40
04BC DF27 RCALL _LCD1_write_com
04BD C007 RJMP 0x04C5
(0208) while (i < 8) {
(0209) LCD1_write_data(*q);
04BE 01FA MOVW R30,R20
04BF 9104 LPM R16,0(Z)
04C0 DF43 RCALL _LCD1_write_data
(0210) q ++;
04C1 5F4F SUBI R20,0xFF
04C2 4F5F SBCI R21,0xFF
(0211) x ++;
04C3 94A3 INC R10
(0212) i ++;
04C4 9563 INC R22
04C5 3068 CPI R22,0x8
04C6 F3B8 BCS 0x04BE
(0213) }
(0214) }
(0215) CSA_CLR;
04C7 98AE CBI 0x15,6
(0216) CSB_CLR;
04C8 98AF CBI 0x15,7
04C9 940E056B CALL pop_gset4
04CB 9508 RET
_disp_word:
q --> R20
i --> R22
word --> Y+8
y --> R12
x --> R10
04CC 940E0570 CALL push_gset4
04CE 2EC2 MOV R12,R18
04CF 2EA0 MOV R10,R16
(0217) }
(0218)
(0219) /*在指定位置顯示一個漢字*/
(0220) void disp_word(unsigned char x, unsigned char y, unsigned char word) {
(0221)
(0222) unsigned char i = 0x00;
04D0 2766 CLR R22
(0223) const unsigned char *q; /*取字庫指針*/
(0224)
(0225) q = &CHINESE_FONT[word * 32];/*定位指針地址*/
04D1 E280 LDI R24,0x20
04D2 8408 LDD R0,Y+8
04D3 9D80 MUL R24,R0
04D4 01A0 MOVW R20,R0
04D5 E084 LDI R24,4
04D6 E096 LDI R25,6
04D7 0F48 ADD R20,R24
04D8 1F59 ADC R21,R25
(0226)
(0227) /*顯示高16位*/
(0228) i = 0x00;
(0229) if (x < 64) { /*地址在左半屏范圍內*/
04D9 2D8A MOV R24,R10
04DA 3480 CPI R24,0x40
04DB F4A0 BCC 0x04F0
(0230) LCD0_write_com(y | 0xB8);
04DC 2D0C MOV R16,R12
04DD 6B08 ORI R16,0xB8
04DE DEF5 RCALL _LCD0_write_com
(0231) LCD0_write_com(x | 0x40);
04DF 2D0A MOV R16,R10
04E0 6400 ORI R16,0x40
04E1 DEF2 RCALL _LCD0_write_com
04E2 C00B RJMP 0x04EE
(0232) while (i < 16) {
(0233) LCD0_write_data(*q);
04E3 01FA MOVW R30,R20
04E4 9104 LPM R16,0(Z)
04E5 DF0E RCALL _LCD0_write_data
(0234) q ++;
04E6 5F4F SUBI R20,0xFF
04E7 4F5F SBCI R21,0xFF
(0235) x ++;
04E8 94A3 INC R10
(0236) i ++;
04E9 9563 INC R22
(0237) if (x > 63) { /*判斷地址是否越界*/
04EA E38F LDI R24,0x3F
04EB 158A CP R24,R10
04EC F408 BCC 0x04EE
(0238) break;
04ED C002 RJMP 0x04F0
04EE 3160 CPI R22,0x10
04EF F398 BCS 0x04E3
(0239) }
(0240) }
(0241) }
(0242) if (i < 16) { /*地址進入左半屏范圍*/
04F0 3160 CPI R22,0x10
04F1 F480 BCC 0x0502
(0243) LCD1_write_com(y | 0xB8);
04F2 2D0C MOV R16,R12
04F3 6B08 ORI R16,0xB8
04F4 DEEF RCALL _LCD1_write_com
(0244) LCD1_write_com(x | 0x40);
04F5 2D0A MOV R16,R10
04F6 6400 ORI R16,0x40
04F7 DEEC RCALL _LCD1_write_com
04F8 C007 RJMP 0x0500
(0245) while (i < 16) {
(0246) LCD1_write_data(*q);
04F9 01FA MOVW R30,R20
04FA 9104 LPM R16,0(Z)
04FB DF08 RCALL _LCD1_write_data
(0247) q ++;
04FC 5F4F SUBI R20,0xFF
04FD 4F5F SBCI R21,0xFF
(0248) x ++;
04FE 94A3 INC R10
(0249) i ++;
04FF 9563 INC R22
0500 3160 CPI R22,0x10
0501 F3B8 BCS 0x04F9
(0250) }
(0251) }
(0252)
(0253) /*顯示低16位*/
(0254) i = 0x00;
0502 2766 CLR R22
(0255) x -= 16;
0503 2D8A MOV R24,R10
0504 5180 SUBI R24,0x10
0505 2EA8 MOV R10,R24
(0256) if (x < 64) { /*地址在左半屏范圍內*/
0506 3480 CPI R24,0x40
0507 F4A8 BCC 0x051D
(0257) LCD0_write_com((y+1) | 0xB8);
0508 2D0C MOV R16,R12
0509 5F0F SUBI R16,0xFF
050A 6B08 ORI R16,0xB8
050B DEC8 RCALL _LCD0_write_com
(0258) LCD0_write_com(x | 0x40);
050C 2D0A MOV R16,R10
050D 6400 ORI R16,0x40
050E DEC5 RCALL _LCD0_write_com
050F C00B RJMP 0x051B
(0259) while (i < 16) {
(0260) LCD0_write_data(*q);
0510 01FA MOVW R30,R20
0511 9104 LPM R16,0(Z)
0512 DEE1 RCALL _LCD0_write_data
(0261) q ++;
0513 5F4F SUBI R20,0xFF
0514 4F5F SBCI R21,0xFF
(0262) x ++;
0515 94A3 INC R10
(0263) i ++;
0516 9563 INC R22
(0264) if (x > 63) { /*判斷地址是否越界*/
0517 E38F LDI R24,0x3F
0518 158A CP R24,R10
0519 F408 BCC 0x051B
(0265) break;
051A C002 RJMP 0x051D
051B 3160 CPI R22,0x10
051C F398 BCS 0x0510
(0266) }
(0267) }
(0268) }
(0269) if (i < 16) { /*地址進入左半屏范圍*/
051D 3160 CPI R22,0x10
051E F488 BCC 0x0530
(0270) LCD1_write_com((y+1) | 0xB8);
051F 2D0C MOV R16,R12
0520 5F0F SUBI R16,0xFF
0521 6B08 ORI R16,0xB8
0522 DEC1 RCALL _LCD1_write_com
(0271) LCD1_write_com(x | 0x40);
0523 2D0A MOV R16,R10
0524 6400 ORI R16,0x40
0525 DEBE RCALL _LCD1_write_com
0526 C007 RJMP 0x052E
(0272) while (i < 16) {
(0273) LCD1_write_data(*q);
0527 01FA MOVW R30,R20
0528 9104 LPM R16,0(Z)
0529 DEDA RCALL _LCD1_write_data
(0274) q ++;
052A 5F4F SUBI R20,0xFF
052B 4F5F SBCI R21,0xFF
(0275) x ++;
052C 94A3 INC R10
(0276) i ++;
052D 9563 INC R22
052E 3160 CPI R22,0x10
052F F3B8 BCS 0x0527
(0277) }
(0278) }
(0279) CSA_CLR;
0530 98AE CBI 0x15,6
(0280) CSB_CLR;
0531 98AF CBI 0x15,7
0532 940E056B CALL pop_gset4
0534 9508 RET
_disp_char_str:
str --> R20
y --> R22
x --> R10
0535 940E0572 CALL push_gset3
0537 2F62 MOV R22,R18
0538 2EA0 MOV R10,R16
0539 9721 SBIW R28,1
053A 814F LDD R20,Y+7
053B 8558 LDD R21,Y+8
(0281) }
(0282)
(0283) /*顯示一串字符*/
(0284) void disp_char_str(unsigned char x, unsigned char y, unsigned char *str) {
053C C00B RJMP 0x0548
(0285)
(0286) while (*str != 0) {
(0287) disp_char(x, y, *str);
053D 01FA MOVW R30,R20
053E 8020 LDD R2,Z+0
053F 8228 STD Y+0,R2
0540 2F26 MOV R18,R22
0541 2D0A MOV R16,R10
0542 DF1D RCALL _disp_char
(0288) x += 8;
0543 2D8A MOV R24,R10
0544 5F88 SUBI R24,0xF8
0545 2EA8 MOV R10,R24
(0289) str ++;
0546 5F4F SUBI R20,0xFF
0547 4F5F SBCI R21,0xFF
0548 01FA MOVW R30,R20
0549 8020 LDD R2,Z+0
054A 2022 TST R2
054B F789 BNE 0x053D
054C 9621 ADIW R28,1
054D 940E0568 CALL pop_gset3
054F 9508 RET
(0290) }
(0291) }
(0292)
(0293) /*顯示屏初始化函數*/
(0294) void disp_init(void) {
(0295)
(0296) DDRB = 0xFF; /*I/O口方向設置*/
_disp_init:
0550 EF8F LDI R24,0xFF
0551 BB87 OUT 0x17,R24
(0297) DDRC |= (1 << PC6) | (1 << PC7);
0552 B384 IN R24,0x14
0553 6C80 ORI R24,0xC0
0554 BB84 OUT 0x14,R24
(0298) DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6) | (1 << PD7);
0555 B381 IN R24,0x11
0556 6D88 ORI R24,0xD8
0557 BB81 OUT 0x11,R24
(0299)
(0300) RST_CLR;
0558 9897 CBI 0x12,7
(0301) delay_ms(10);
0559 E00A LDI R16,0xA
055A DE6A RCALL _delay_ms
(0302) RST_SET;
055B 9A97 SBI 0x12,7
(0303)
(0304) LCD0_write_com(0xC0); /*顯示起行設置*/
055C EC00 LDI R16,0xC0
055D DE76 RCALL _LCD0_write_com
(0305) LCD1_write_com(0xC0);
055E EC00 LDI R16,0xC0
055F DE84 RCALL _LCD1_write_com
(0306)
(0307) LCD0_write_com(0x3F); /*開顯示設置*/
0560 E30F LDI R16,0x3F
0561 DE72 RCALL _LCD0_write_com
(0308) LCD1_write_com(0x3F);
FILE: <library>
0562 E30F LDI R16,0x3F
0563 DE80 RCALL _LCD1_write_com
0564 9508 RET
pop_gset2:
0565 E0E2 LDI R30,2
0566 940C057A JMP pop
pop_gset3:
0568 E0E4 LDI R30,4
0569 940C057A JMP pop
pop_gset4:
056B E0E8 LDI R30,0x8
056C 940C057A JMP pop
push_gset5:
056E 92FA ST R15,-Y
056F 92EA ST R14,-Y
push_gset4:
0570 92DA ST R13,-Y
0571 92CA ST R12,-Y
push_gset3:
0572 92BA ST R11,-Y
0573 92AA ST R10,-Y
push_gset2:
0574 937A ST R23,-Y
0575 936A ST R22,-Y
push_gset1:
0576 935A ST R21,-Y
0577 934A ST R20,-Y
0578 9508 RET
pop_gset1:
0579 E0E1 LDI R30,1
pop:
057A 9149 LD R20,Y+
057B 9159 LD R21,Y+
057C FDE0 SBRC R30,0
057D 9508 RET
057E 9169 LD R22,Y+
057F 9179 LD R23,Y+
0580 FDE1 SBRC R30,1
0581 9508 RET
0582 90A9 LD R10,Y+
0583 90B9 LD R11,Y+
0584 FDE2 SBRC R30,2
0585 9508 RET
0586 90C9 LD R12,Y+
0587 90D9 LD R13,Y+
0588 FDE3 SBRC R30,3
0589 9508 RET
058A 90E9 LD R14,Y+
058B 90F9 LD R15,Y+
058C 9508 RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -