📄 18lcd.lst
字号:
(0150) x ++;
047F 9543 INC R20
0480 1746 CP R20,R22
0481 F3D8 BCS 0x047D
0482 940E058B CALL pop_gset4
0484 9508 RET
_disp_char:
q --> R20
i --> R22
ascii --> Y+8
y --> R12
x --> R10
0485 940E0590 CALL push_gset4
0487 2EC2 MOV R12,R18
0488 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;
0489 2766 CLR R22
(0158) const unsigned char *q; /*取字库指针*/
(0159)
(0160) ascii -= 0x20;
048A 8588 LDD R24,Y+8
048B 5280 SUBI R24,0x20
048C 8788 STD Y+8,R24
(0161) q = &ENGLISH_FONT[ascii * 16]; /*定位指针地址*/
048D E180 LDI R24,0x10
048E 8408 LDD R0,Y+8
048F 9D80 MUL R24,R0
0490 01A0 MOVW R20,R0
0491 E88C LDI R24,0x8C
0492 E090 LDI R25,0
0493 0F48 ADD R20,R24
0494 1F59 ADC R21,R25
(0162)
(0163) /*显示高8位*/
(0164) i = 0x00;
(0165) if (x < 64) { /*地址在左半屏范围内*/
0495 2D8A MOV R24,R10
0496 3480 CPI R24,0x40
0497 F4A0 BCC 0x04AC
(0166) LCD0_write_com(y | 0xB8);
0498 2D0C MOV R16,R12
0499 6B08 ORI R16,0xB8
049A DF5E RCALL _LCD0_write_com
(0167) LCD0_write_com(x | 0x40);
049B 2D0A MOV R16,R10
049C 6400 ORI R16,0x40
049D DF5B RCALL _LCD0_write_com
049E C00B RJMP 0x04AA
(0168) while (i < 8) {
(0169) LCD0_write_data(*q);
049F 01FA MOVW R30,R20
04A0 9104 LPM R16,0(Z)
04A1 DF77 RCALL _LCD0_write_data
(0170) q ++;
04A2 5F4F SUBI R20,0xFF
04A3 4F5F SBCI R21,0xFF
(0171) x ++;
04A4 94A3 INC R10
(0172) i ++;
04A5 9563 INC R22
(0173) if (x > 63) { /*判断地址是否越界*/
04A6 E38F LDI R24,0x3F
04A7 158A CP R24,R10
04A8 F408 BCC 0x04AA
(0174) break;
04A9 C002 RJMP 0x04AC
04AA 3068 CPI R22,0x8
04AB F398 BCS 0x049F
(0175) }
(0176) }
(0177) }
(0178) if (i < 8) { /*地址进入左半屏范围*/
04AC 3068 CPI R22,0x8
04AD F480 BCC 0x04BE
(0179) LCD1_write_com(y | 0xB8);
04AE 2D0C MOV R16,R12
04AF 6B08 ORI R16,0xB8
04B0 DF58 RCALL _LCD1_write_com
(0180) LCD1_write_com(x | 0x40);
04B1 2D0A MOV R16,R10
04B2 6400 ORI R16,0x40
04B3 DF55 RCALL _LCD1_write_com
04B4 C007 RJMP 0x04BC
(0181) while (i < 8) {
(0182) LCD1_write_data(*q);
04B5 01FA MOVW R30,R20
04B6 9104 LPM R16,0(Z)
04B7 DF71 RCALL _LCD1_write_data
(0183) q ++;
04B8 5F4F SUBI R20,0xFF
04B9 4F5F SBCI R21,0xFF
(0184) x ++;
04BA 94A3 INC R10
(0185) i ++;
04BB 9563 INC R22
04BC 3068 CPI R22,0x8
04BD F3B8 BCS 0x04B5
(0186) }
(0187) }
(0188)
(0189) /*显示低8位*/
(0190) i = 0x00;
04BE 2766 CLR R22
(0191) x -= 8;
04BF 2D8A MOV R24,R10
04C0 5088 SUBI R24,0x8
04C1 2EA8 MOV R10,R24
(0192) if (x < 64) { /*地址在左半屏范围内*/
04C2 3480 CPI R24,0x40
04C3 F4A8 BCC 0x04D9
(0193) LCD0_write_com((y+1) | 0xB8);
04C4 2D0C MOV R16,R12
04C5 5F0F SUBI R16,0xFF
04C6 6B08 ORI R16,0xB8
04C7 DF31 RCALL _LCD0_write_com
(0194) LCD0_write_com(x | 0x40);
04C8 2D0A MOV R16,R10
04C9 6400 ORI R16,0x40
04CA DF2E RCALL _LCD0_write_com
04CB C00B RJMP 0x04D7
(0195) while (i < 8) {
(0196) LCD0_write_data(*q);
04CC 01FA MOVW R30,R20
04CD 9104 LPM R16,0(Z)
04CE DF4A RCALL _LCD0_write_data
(0197) q ++;
04CF 5F4F SUBI R20,0xFF
04D0 4F5F SBCI R21,0xFF
(0198) x ++;
04D1 94A3 INC R10
(0199) i ++;
04D2 9563 INC R22
(0200) if (x > 63) { /*判断地址是否越界*/
04D3 E38F LDI R24,0x3F
04D4 158A CP R24,R10
04D5 F408 BCC 0x04D7
(0201) break;
04D6 C002 RJMP 0x04D9
04D7 3068 CPI R22,0x8
04D8 F398 BCS 0x04CC
(0202) }
(0203) }
(0204) }
(0205) if (i < 8) { /*地址进入左半屏范围*/
04D9 3068 CPI R22,0x8
04DA F488 BCC 0x04EC
(0206) LCD1_write_com((y+1) | 0xB8);
04DB 2D0C MOV R16,R12
04DC 5F0F SUBI R16,0xFF
04DD 6B08 ORI R16,0xB8
04DE DF2A RCALL _LCD1_write_com
(0207) LCD1_write_com(x | 0x40);
04DF 2D0A MOV R16,R10
04E0 6400 ORI R16,0x40
04E1 DF27 RCALL _LCD1_write_com
04E2 C007 RJMP 0x04EA
(0208) while (i < 8) {
(0209) LCD1_write_data(*q);
04E3 01FA MOVW R30,R20
04E4 9104 LPM R16,0(Z)
04E5 DF43 RCALL _LCD1_write_data
(0210) q ++;
04E6 5F4F SUBI R20,0xFF
04E7 4F5F SBCI R21,0xFF
(0211) x ++;
04E8 94A3 INC R10
(0212) i ++;
04E9 9563 INC R22
04EA 3068 CPI R22,0x8
04EB F3B8 BCS 0x04E3
(0213) }
(0214) }
(0215) CSA_CLR;
04EC 98AF CBI 0x15,7
(0216) CSB_CLR;
04ED 98AE CBI 0x15,6
04EE 940E058B CALL pop_gset4
04F0 9508 RET
_disp_word:
q --> R20
i --> R22
word --> Y+8
y --> R12
x --> R10
04F1 940E0590 CALL push_gset4
04F3 2EC2 MOV R12,R18
04F4 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;
04F5 2766 CLR R22
(0223) const unsigned char *q; /*取字库指针*/
(0224)
(0225) q = &CHINESE_FONT[word * 32]; /*定位指针地址*/
04F6 E280 LDI R24,0x20
04F7 8408 LDD R0,Y+8
04F8 9D80 MUL R24,R0
04F9 01A0 MOVW R20,R0
04FA E38C LDI R24,0x3C
04FB E096 LDI R25,6
04FC 0F48 ADD R20,R24
04FD 1F59 ADC R21,R25
(0226)
(0227) /*显示高16位*/
(0228) i = 0x00;
(0229) if (x < 64) { /*地址在左半屏范围内*/
04FE 2D8A MOV R24,R10
04FF 3480 CPI R24,0x40
0500 F4A0 BCC 0x0515
(0230) LCD0_write_com(y | 0xB8);
0501 2D0C MOV R16,R12
0502 6B08 ORI R16,0xB8
0503 DEF5 RCALL _LCD0_write_com
(0231) LCD0_write_com(x | 0x40);
0504 2D0A MOV R16,R10
0505 6400 ORI R16,0x40
0506 DEF2 RCALL _LCD0_write_com
0507 C00B RJMP 0x0513
(0232) while (i < 16) {
(0233) LCD0_write_data(*q);
0508 01FA MOVW R30,R20
0509 9104 LPM R16,0(Z)
050A DF0E RCALL _LCD0_write_data
(0234) q ++;
050B 5F4F SUBI R20,0xFF
050C 4F5F SBCI R21,0xFF
(0235) x ++;
050D 94A3 INC R10
(0236) i ++;
050E 9563 INC R22
(0237) if (x > 63) { /*判断地址是否越界*/
050F E38F LDI R24,0x3F
0510 158A CP R24,R10
0511 F408 BCC 0x0513
(0238) break;
0512 C002 RJMP 0x0515
0513 3160 CPI R22,0x10
0514 F398 BCS 0x0508
(0239) }
(0240) }
(0241) }
(0242) if (i < 16) { /*地址进入左半屏范围*/
0515 3160 CPI R22,0x10
0516 F480 BCC 0x0527
(0243) LCD1_write_com(y | 0xB8);
0517 2D0C MOV R16,R12
0518 6B08 ORI R16,0xB8
0519 DEEF RCALL _LCD1_write_com
(0244) LCD1_write_com(x | 0x40);
051A 2D0A MOV R16,R10
051B 6400 ORI R16,0x40
051C DEEC RCALL _LCD1_write_com
051D C007 RJMP 0x0525
(0245) while (i < 16) {
(0246) LCD1_write_data(*q);
051E 01FA MOVW R30,R20
051F 9104 LPM R16,0(Z)
0520 DF08 RCALL _LCD1_write_data
(0247) q ++;
0521 5F4F SUBI R20,0xFF
0522 4F5F SBCI R21,0xFF
(0248) x ++;
0523 94A3 INC R10
(0249) i ++;
0524 9563 INC R22
0525 3160 CPI R22,0x10
0526 F3B8 BCS 0x051E
(0250) }
(0251) }
(0252)
(0253) /*显示低16位*/
(0254) i = 0x00;
0527 2766 CLR R22
(0255) x -= 16;
0528 2D8A MOV R24,R10
0529 5180 SUBI R24,0x10
052A 2EA8 MOV R10,R24
(0256) if (x < 64) { /*地址在左半屏范围内*/
052B 3480 CPI R24,0x40
052C F4A8 BCC 0x0542
(0257) LCD0_write_com((y+1) | 0xB8);
052D 2D0C MOV R16,R12
052E 5F0F SUBI R16,0xFF
052F 6B08 ORI R16,0xB8
0530 DEC8 RCALL _LCD0_write_com
(0258) LCD0_write_com(x | 0x40);
0531 2D0A MOV R16,R10
0532 6400 ORI R16,0x40
0533 DEC5 RCALL _LCD0_write_com
0534 C00B RJMP 0x0540
(0259) while (i < 16) {
(0260) LCD0_write_data(*q);
0535 01FA MOVW R30,R20
0536 9104 LPM R16,0(Z)
0537 DEE1 RCALL _LCD0_write_data
(0261) q ++;
0538 5F4F SUBI R20,0xFF
0539 4F5F SBCI R21,0xFF
(0262) x ++;
053A 94A3 INC R10
(0263) i ++;
053B 9563 INC R22
(0264) if (x > 63) { /*判断地址是否越界*/
053C E38F LDI R24,0x3F
053D 158A CP R24,R10
053E F408 BCC 0x0540
(0265) break;
053F C002 RJMP 0x0542
0540 3160 CPI R22,0x10
0541 F398 BCS 0x0535
(0266) }
(0267) }
(0268) }
(0269) if (i < 16) { /*地址进入左半屏范围*/
0542 3160 CPI R22,0x10
0543 F488 BCC 0x0555
(0270) LCD1_write_com((y+1) | 0xB8);
0544 2D0C MOV R16,R12
0545 5F0F SUBI R16,0xFF
0546 6B08 ORI R16,0xB8
0547 DEC1 RCALL _LCD1_write_com
(0271) LCD1_write_com(x | 0x40);
0548 2D0A MOV R16,R10
0549 6400 ORI R16,0x40
054A DEBE RCALL _LCD1_write_com
054B C007 RJMP 0x0553
(0272) while (i < 16) {
(0273) LCD1_write_data(*q);
054C 01FA MOVW R30,R20
054D 9104 LPM R16,0(Z)
054E DEDA RCALL _LCD1_write_data
(0274) q ++;
054F 5F4F SUBI R20,0xFF
0550 4F5F SBCI R21,0xFF
(0275) x ++;
0551 94A3 INC R10
(0276) i ++;
0552 9563 INC R22
0553 3160 CPI R22,0x10
0554 F3B8 BCS 0x054C
(0277) }
(0278) }
(0279) CSA_CLR;
0555 98AF CBI 0x15,7
(0280) CSB_CLR;
0556 98AE CBI 0x15,6
0557 940E058B CALL pop_gset4
0559 9508 RET
_disp_char_str:
str --> R20
y --> R22
x --> R10
055A 940E0592 CALL push_gset3
055C 2F62 MOV R22,R18
055D 2EA0 MOV R10,R16
055E 9721 SBIW R28,1
055F 814F LDD R20,Y+7
0560 8558 LDD R21,Y+8
(0281) }
(0282)
(0283) /*显示一串字符*/
(0284) void disp_char_str(unsigned char x, unsigned char y, unsigned char *str) {
0561 C00B RJMP 0x056D
(0285)
(0286) while (*str != 0) {
(0287) disp_char(x, y, *str);
0562 01FA MOVW R30,R20
0563 8020 LDD R2,Z+0
0564 8228 STD Y+0,R2
0565 2F26 MOV R18,R22
0566 2D0A MOV R16,R10
0567 DF1D RCALL _disp_char
(0288) x += 8;
0568 2D8A MOV R24,R10
0569 5F88 SUBI R24,0xF8
056A 2EA8 MOV R10,R24
(0289) str ++;
056B 5F4F SUBI R20,0xFF
056C 4F5F SBCI R21,0xFF
056D 01FA MOVW R30,R20
056E 8020 LDD R2,Z+0
056F 2022 TST R2
0570 F789 BNE 0x0562
0571 9621 ADIW R28,1
0572 940E0588 CALL pop_gset3
0574 9508 RET
(0290) }
(0291) }
(0292)
(0293) /*显示屏初始化函数*/
(0294) void disp_init(void) {
(0295)
(0296) DDRA = 0xFF; /*I/O口方向设置*/
_disp_init:
0575 EF8F LDI R24,0xFF
0576 BB8A OUT 0x1A,R24
(0297) DDRC = 0xFF;
0577 BB84 OUT 0x14,R24
(0298)
(0299) RST_CLR;
0578 98AD CBI 0x15,5
(0300) delay_ms(10);
0579 E00A LDI R16,0xA
057A DE6F RCALL _delay_ms
(0301) RST_SET;
057B 9AAD SBI 0x15,5
(0302)
(0303) LCD0_write_com(0xC0); /*显示起行设置*/
057C EC00 LDI R16,0xC0
057D DE7B RCALL _LCD0_write_com
(0304) LCD1_write_com(0xC0);
057E EC00 LDI R16,0xC0
057F DE89 RCALL _LCD1_write_com
(0305)
(0306) LCD0_write_com(0x3F); /*开显示设置*/
0580 E30F LDI R16,0x3F
0581 DE77 RCALL _LCD0_write_com
(0307) LCD1_write_com(0x3F);
FILE: <library>
0582 E30F LDI R16,0x3F
0583 DE85 RCALL _LCD1_write_com
0584 9508 RET
pop_gset2:
0585 E0E2 LDI R30,2
0586 940C059A JMP pop
pop_gset3:
0588 E0E4 LDI R30,4
0589 940C059A JMP pop
pop_gset4:
058B E0E8 LDI R30,0x8
058C 940C059A JMP pop
push_gset5:
058E 92FA ST R15,-Y
058F 92EA ST R14,-Y
push_gset4:
0590 92DA ST R13,-Y
0591 92CA ST R12,-Y
push_gset3:
0592 92BA ST R11,-Y
0593 92AA ST R10,-Y
push_gset2:
0594 937A ST R23,-Y
0595 936A ST R22,-Y
push_gset1:
0596 935A ST R21,-Y
0597 934A ST R20,-Y
0598 9508 RET
pop_gset1:
0599 E0E1 LDI R30,1
pop:
059A 9149 LD R20,Y+
059B 9159 LD R21,Y+
059C FDE0 SBRC R30,0
059D 9508 RET
059E 9169 LD R22,Y+
059F 9179 LD R23,Y+
05A0 FDE1 SBRC R30,1
05A1 9508 RET
05A2 90A9 LD R10,Y+
05A3 90B9 LD R11,Y+
05A4 FDE2 SBRC R30,2
05A5 9508 RET
05A6 90C9 LD R12,Y+
05A7 90D9 LD R13,Y+
05A8 FDE3 SBRC R30,3
05A9 9508 RET
05AA 90E9 LD R14,Y+
05AB 90F9 LD R15,Y+
05AC 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -