📄 18lcd.lst
字号:
(0071) CSB_SET;
0546 9AAE SBI 0x15,6
(0072) EN_SET;
0547 9AAC SBI 0x15,4
(0073) PORTA = com;
0548 BB4B OUT 0x1B,R20
(0074) delay_us(1);
0549 E001 LDI R16,1
054A E010 LDI R17,0
054B DFCA RCALL _delay_us
(0075) EN_CLR;
054C 98AC CBI 0x15,4
054D 940E07D3 CALL pop_gset1
054F 9508 RET
_LCD0_write_data:
data --> R20
0550 940E07D0 CALL push_gset1
0552 2F40 MOV R20,R16
(0076) }
(0077)
(0078) /*显示屏命令写入函数*/
(0079) void LCD0_write_data(unsigned char data) {
(0080)
(0081) RS_SET;
0553 9AAA SBI 0x15,2
(0082) RW_CLR;
0554 98AB CBI 0x15,3
(0083) CSA_SET;
0555 9AAF SBI 0x15,7
(0084) CSB_CLR;
0556 98AE CBI 0x15,6
(0085) EN_SET;
0557 9AAC SBI 0x15,4
(0086) PORTA = data;
0558 BB4B OUT 0x1B,R20
(0087) delay_us(1);
0559 E001 LDI R16,1
055A E010 LDI R17,0
055B DFBA RCALL _delay_us
(0088) EN_CLR;
055C 98AC CBI 0x15,4
055D 940E07D3 CALL pop_gset1
055F 9508 RET
_LCD1_write_data:
data --> R20
0560 940E07D0 CALL push_gset1
0562 2F40 MOV R20,R16
(0089) }
(0090)
(0091) /*显示屏命令写入函数*/
(0092) void LCD1_write_data(unsigned char data) {
(0093)
(0094) RS_SET;
0563 9AAA SBI 0x15,2
(0095) RW_CLR;
0564 98AB CBI 0x15,3
(0096) CSA_CLR;
0565 98AF CBI 0x15,7
(0097) CSB_SET;
0566 9AAE SBI 0x15,6
(0098) EN_SET;
0567 9AAC SBI 0x15,4
(0099) PORTA = data;
0568 BB4B OUT 0x1B,R20
(0100) delay_us(1);
0569 E001 LDI R16,1
056A E010 LDI R17,0
056B DFAA RCALL _delay_us
(0101) EN_CLR;
056C 98AC CBI 0x15,4
056D 940E07D3 CALL pop_gset1
056F 9508 RET
_disp_clear:
x --> R20
y --> R10
x1 --> R22
x0 --> R12
0570 940E07CA CALL push_gset4
0572 2F62 MOV R22,R18
0573 2EC0 MOV R12,R16
0574 84A8 LDD R10,Y+8
(0102) }
(0103)
(0104) /*显示屏清空显示*/
(0105) void disp_clear(unsigned char x0, unsigned char x1, unsigned char y) {
(0106)
(0107) unsigned char x;
(0108)
(0109) /*清除高位*/
(0110) x = x0;
0575 2D4C MOV R20,R12
(0111) if (x < 63) { /*地址在左半屏范围内*/
0576 334F CPI R20,0x3F
0577 F470 BCC 0x0586
(0112) LCD0_write_com(y | 0xB8);
0578 2D0A MOV R16,R10
0579 6B08 ORI R16,0xB8
057A DFB5 RCALL _LCD0_write_com
(0113) LCD0_write_com(x | 0x40);
057B 2F04 MOV R16,R20
057C 6400 ORI R16,0x40
057D DFB2 RCALL _LCD0_write_com
(0114) }
057E C007 RJMP 0x0586
(0115) while (x < x1) {
(0116) LCD0_write_data(0x00);
057F 2700 CLR R16
0580 DFCF RCALL _LCD0_write_data
(0117) x ++;
0581 9543 INC R20
(0118) if (x > 63) { /*判断地址是否越界*/
0582 E38F LDI R24,0x3F
0583 1784 CP R24,R20
0584 F408 BCC 0x0586
(0119) break;
0585 C002 RJMP 0x0588
0586 1746 CP R20,R22
0587 F3B8 BCS 0x057F
(0120) }
(0121) }
(0122) if (x < x1) { /*地址进入左半屏范围*/
0588 1746 CP R20,R22
0589 F450 BCC 0x0594
(0123) LCD1_write_com(y | 0xB8);
058A 2D0A MOV R16,R10
058B 6B08 ORI R16,0xB8
058C DFB3 RCALL _LCD1_write_com
(0124) LCD1_write_com(x | 0x40);
058D 2F04 MOV R16,R20
058E 6400 ORI R16,0x40
058F DFB0 RCALL _LCD1_write_com
(0125) }
0590 C003 RJMP 0x0594
(0126) while (x < x1) {
(0127) LCD1_write_data(0x00);
0591 2700 CLR R16
0592 DFCD RCALL _LCD1_write_data
(0128) x ++;
0593 9543 INC R20
0594 1746 CP R20,R22
0595 F3D8 BCS 0x0591
(0129) }
(0130)
(0131) /*清除低位*/
(0132) x = x0;
0596 2D4C MOV R20,R12
(0133) if (x < 63) { /*地址在左半屏范围内*/
0597 334F CPI R20,0x3F
0598 F478 BCC 0x05A8
(0134) LCD0_write_com((y+1) | 0xB8);
0599 2D0A MOV R16,R10
059A 5F0F SUBI R16,0xFF
059B 6B08 ORI R16,0xB8
059C DF93 RCALL _LCD0_write_com
(0135) LCD0_write_com(x | 0x40);
059D 2F04 MOV R16,R20
059E 6400 ORI R16,0x40
059F DF90 RCALL _LCD0_write_com
(0136) }
05A0 C007 RJMP 0x05A8
(0137) while (x < x1) {
(0138) LCD0_write_data(0x00);
05A1 2700 CLR R16
05A2 DFAD RCALL _LCD0_write_data
(0139) x ++;
05A3 9543 INC R20
(0140) if (x > 63) { /*判断地址是否越界*/
05A4 E38F LDI R24,0x3F
05A5 1784 CP R24,R20
05A6 F408 BCC 0x05A8
(0141) break;
05A7 C002 RJMP 0x05AA
05A8 1746 CP R20,R22
05A9 F3B8 BCS 0x05A1
(0142) }
(0143) }
(0144) if (x < x1) { /*地址进入左半屏范围*/
05AA 1746 CP R20,R22
05AB F458 BCC 0x05B7
(0145) LCD1_write_com((y+1) | 0xB8);
05AC 2D0A MOV R16,R10
05AD 5F0F SUBI R16,0xFF
05AE 6B08 ORI R16,0xB8
05AF DF90 RCALL _LCD1_write_com
(0146) LCD1_write_com(x | 0x40);
05B0 2F04 MOV R16,R20
05B1 6400 ORI R16,0x40
05B2 DF8D RCALL _LCD1_write_com
(0147) }
05B3 C003 RJMP 0x05B7
(0148) while (x < x1) {
(0149) LCD1_write_data(0x00);
05B4 2700 CLR R16
05B5 DFAA RCALL _LCD1_write_data
(0150) x ++;
05B6 9543 INC R20
05B7 1746 CP R20,R22
05B8 F3D8 BCS 0x05B4
05B9 940E07C2 CALL pop_gset4
05BB 9508 RET
_disp_char:
q --> R20
i --> R22
ascii --> Y+8
y --> R12
x --> R10
05BC 940E07CA CALL push_gset4
05BE 2EC2 MOV R12,R18
05BF 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;
05C0 2766 CLR R22
(0158) const unsigned char *q; /*取字库指针*/
(0159)
(0160)
(0161) ascii -= 0x20;
05C1 8588 LDD R24,Y+8
05C2 5280 SUBI R24,0x20
05C3 8788 STD Y+8,R24
(0162) q = &ENGLISH_FONT[ascii * 16]; /*定位指针地址*/
05C4 E180 LDI R24,0x10
05C5 8408 LDD R0,Y+8
05C6 9D80 MUL R24,R0
05C7 01A0 MOVW R20,R0
05C8 E780 LDI R24,0x70
05C9 E090 LDI R25,0
05CA 0F48 ADD R20,R24
05CB 1F59 ADC R21,R25
(0163)
(0164) /*显示高8位*/
(0165) i = 0x00;
(0166) if (x < 64) { /*地址在左半屏范围内*/
05CC 2D8A MOV R24,R10
05CD 3480 CPI R24,0x40
05CE F4A0 BCC 0x05E3
(0167) LCD0_write_com(y | 0xB8);
05CF 2D0C MOV R16,R12
05D0 6B08 ORI R16,0xB8
05D1 DF5E RCALL _LCD0_write_com
(0168) LCD0_write_com(x | 0x40);
05D2 2D0A MOV R16,R10
05D3 6400 ORI R16,0x40
05D4 DF5B RCALL _LCD0_write_com
05D5 C00B RJMP 0x05E1
(0169) while (i < 8) {
(0170) LCD0_write_data(*q);
05D6 01FA MOVW R30,R20
05D7 9104 LPM R16,0(Z)
05D8 DF77 RCALL _LCD0_write_data
(0171) q ++;
05D9 5F4F SUBI R20,0xFF
05DA 4F5F SBCI R21,0xFF
(0172) x ++;
05DB 94A3 INC R10
(0173) i ++;
05DC 9563 INC R22
(0174) if (x > 63) { /*判断地址是否越界*/
05DD E38F LDI R24,0x3F
05DE 158A CP R24,R10
05DF F408 BCC 0x05E1
(0175) break;
05E0 C002 RJMP 0x05E3
05E1 3068 CPI R22,0x8
05E2 F398 BCS 0x05D6
(0176) }
(0177) }
(0178) }
(0179) if (i < 8) { /*地址进入左半屏范围*/
05E3 3068 CPI R22,0x8
05E4 F480 BCC 0x05F5
(0180) LCD1_write_com(y | 0xB8);
05E5 2D0C MOV R16,R12
05E6 6B08 ORI R16,0xB8
05E7 DF58 RCALL _LCD1_write_com
(0181) LCD1_write_com(x | 0x40);
05E8 2D0A MOV R16,R10
05E9 6400 ORI R16,0x40
05EA DF55 RCALL _LCD1_write_com
05EB C007 RJMP 0x05F3
(0182) while (i < 8) {
(0183) LCD1_write_data(*q);
05EC 01FA MOVW R30,R20
05ED 9104 LPM R16,0(Z)
05EE DF71 RCALL _LCD1_write_data
(0184) q ++;
05EF 5F4F SUBI R20,0xFF
05F0 4F5F SBCI R21,0xFF
(0185) x ++;
05F1 94A3 INC R10
(0186) i ++;
05F2 9563 INC R22
05F3 3068 CPI R22,0x8
05F4 F3B8 BCS 0x05EC
(0187) }
(0188) }
(0189)
(0190) /*显示低8位*/
(0191) i = 0x00;
05F5 2766 CLR R22
(0192) x -= 8;
05F6 2D8A MOV R24,R10
05F7 5088 SUBI R24,0x8
05F8 2EA8 MOV R10,R24
(0193) if (x < 64) { /*地址在左半屏范围内*/
05F9 3480 CPI R24,0x40
05FA F4A8 BCC 0x0610
(0194) LCD0_write_com((y+1) | 0xB8);
05FB 2D0C MOV R16,R12
05FC 5F0F SUBI R16,0xFF
05FD 6B08 ORI R16,0xB8
05FE DF31 RCALL _LCD0_write_com
(0195) LCD0_write_com(x | 0x40);
05FF 2D0A MOV R16,R10
0600 6400 ORI R16,0x40
0601 DF2E RCALL _LCD0_write_com
0602 C00B RJMP 0x060E
(0196) while (i < 8) {
(0197) LCD0_write_data(*q);
0603 01FA MOVW R30,R20
0604 9104 LPM R16,0(Z)
0605 DF4A RCALL _LCD0_write_data
(0198) q ++;
0606 5F4F SUBI R20,0xFF
0607 4F5F SBCI R21,0xFF
(0199) x ++;
0608 94A3 INC R10
(0200) i ++;
0609 9563 INC R22
(0201) if (x > 63) { /*判断地址是否越界*/
060A E38F LDI R24,0x3F
060B 158A CP R24,R10
060C F408 BCC 0x060E
(0202) break;
060D C002 RJMP 0x0610
060E 3068 CPI R22,0x8
060F F398 BCS 0x0603
(0203) }
(0204) }
(0205) }
(0206) if (i < 8) { /*地址进入左半屏范围*/
0610 3068 CPI R22,0x8
0611 F488 BCC 0x0623
(0207) LCD1_write_com((y+1) | 0xB8);
0612 2D0C MOV R16,R12
0613 5F0F SUBI R16,0xFF
0614 6B08 ORI R16,0xB8
0615 DF2A RCALL _LCD1_write_com
(0208) LCD1_write_com(x | 0x40);
0616 2D0A MOV R16,R10
0617 6400 ORI R16,0x40
0618 DF27 RCALL _LCD1_write_com
0619 C007 RJMP 0x0621
(0209) while (i < 8) {
(0210) LCD1_write_data(*q);
061A 01FA MOVW R30,R20
061B 9104 LPM R16,0(Z)
061C DF43 RCALL _LCD1_write_data
(0211) q ++;
061D 5F4F SUBI R20,0xFF
061E 4F5F SBCI R21,0xFF
(0212) x ++;
061F 94A3 INC R10
(0213) i ++;
0620 9563 INC R22
0621 3068 CPI R22,0x8
0622 F3B8 BCS 0x061A
(0214) }
(0215) }
(0216) CSA_CLR;
0623 98AF CBI 0x15,7
(0217) CSB_CLR;
0624 98AE CBI 0x15,6
0625 940E07C2 CALL pop_gset4
0627 9508 RET
_disp_word:
q --> R20
i --> R22
word --> Y+8
y --> R12
x --> R10
0628 940E07CA CALL push_gset4
062A 2EC2 MOV R12,R18
062B 2EA0 MOV R10,R16
(0218) }
(0219)
(0220) /*在指定位置显示一个汉字*/
(0221) void disp_word(unsigned char x, unsigned char y, unsigned char word) {
(0222)
(0223) unsigned char i = 0x00;
062C 2766 CLR R22
(0224) const unsigned char *q; /*取字库指针*/
(0225)
(0226) q = &CHINESE_FONT[word * 32]; /*定位指针地址*/
062D E280 LDI R24,0x20
062E 8408 LDD R0,Y+8
062F 9D80 MUL R24,R0
0630 01A0 MOVW R20,R0
0631 E480 LDI R24,0x40
0632 E096 LDI R25,6
0633 0F48 ADD R20,R24
0634 1F59 ADC R21,R25
(0227)
(0228) /*显示高16位*/
(0229) i = 0x00;
(0230) if (x < 64) { /*地址在左半屏范围内*/
0635 2D8A MOV R24,R10
0636 3480 CPI R24,0x40
0637 F4A0 BCC 0x064C
(0231) LCD0_write_com(y | 0xB8);
0638 2D0C MOV R16,R12
0639 6B08 ORI R16,0xB8
063A DEF5 RCALL _LCD0_write_com
(0232) LCD0_write_com(x | 0x40);
063B 2D0A MOV R16,R10
063C 6400 ORI R16,0x40
063D DEF2 RCALL _LCD0_write_com
063E C00B RJMP 0x064A
(0233) while (i < 16) {
(0234) LCD0_write_data(*q);
063F 01FA MOVW R30,R20
0640 9104 LPM R16,0(Z)
0641 DF0E RCALL _LCD0_write_data
(0235) q ++;
0642 5F4F SUBI R20,0xFF
0643 4F5F SBCI R21,0xFF
(0236) x ++;
0644 94A3 INC R10
(0237) i ++;
0645 9563 INC R22
(0238) if (x > 63) { /*判断地址是否越界*/
0646 E38F LDI R24,0x3F
0647 158A CP R24,R10
0648 F408 BCC 0x064A
(0239) break;
0649 C002 RJMP 0x064C
064A 3160 CPI R22,0x10
064B F398 BCS 0x063F
(0240) }
(0241) }
(0242) }
(0243) if (i < 16) { /*地址进入左半屏范围*/
064C 3160 CPI R22,0x10
064D F480 BCC 0x065E
(0244) LCD1_write_com(y | 0xB8);
064E 2D0C MOV R16,R12
064F 6B08 ORI R16,0xB8
0650 DEEF RCALL _LCD1_write_com
(0245) LCD1_write_com(x | 0x40);
0651 2D0A MOV R16,R10
0652 6400 ORI R16,0x40
0653 DEEC RCALL _LCD1_write_com
0654 C007 RJMP 0x065C
(0246) while (i < 16) {
(0247) LCD1_write_data(*q);
0655 01FA MOVW R30,R20
0656 9104 LPM R16,0(Z)
0657 DF08 RCALL _LCD1_write_data
(0248) q ++;
0658 5F4F SUBI R20,0xFF
0659 4F5F SBCI R21,0xFF
(0249) x ++;
065A 94A3 INC R10
(0250) i ++;
065B 9563 INC R22
065C 3160 CPI R22,0x10
065D F3B8 BCS 0x0655
(0251) }
(0252) }
(0253)
(0254) /*显示低16位*/
(0255) i = 0x00;
065E 2766 CLR R22
(0256) x -= 16;
065F 2D8A MOV R24,R10
0660 5180 SUBI R24,0x10
0661 2EA8 MOV R10,R24
(0257) if (x < 64) { /*地址在左半屏范围内*/
0662 3480 CPI R24,0x40
0663 F4A8 BCC 0x0679
(0258) LCD0_write_com((y+1) | 0xB8);
0664 2D0C MOV R16,R12
0665 5F0F SUBI R16,0xFF
0666 6B08 ORI R16,0xB8
0667 DEC8 RCALL _LCD0_write_com
(0259) LCD0_write_com(x | 0x40);
0668 2D0A MOV R16,R10
0669 6400 ORI R16,0x40
066A DEC5 RCALL _LCD0_write_com
066B C00B RJMP 0x0677
(0260) while (i < 16) {
(0261) LCD0_write_data(*q);
066C 01FA MOVW R30,R20
066D 9104 LPM R16,0(Z)
066E DEE1 RCALL _LCD0_write_data
(0262) q ++;
066F 5F4F SUBI R20,0xFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -