📄 3310lcd_prj.lst
字号:
(0078) unsigned char line;
(0079)
(0080) c -= 32;
032E 5260 SUBI R22,0x20
(0081)
(0082) for (line=0; line<6; line++)
032F 2744 CLR R20
0330 C00F RJMP 0x0340
(0083) LCD_write_byte(font6x8[c][line], 1);
0331 E021 LDI R18,1
0332 E086 LDI R24,6
0333 9F86 MUL R24,R22
0334 0110 MOVW R2,R0
0335 E584 LDI R24,0x54
0336 E090 LDI R25,0
0337 0E28 ADD R2,R24
0338 1E39 ADC R3,R25
0339 2FE4 MOV R30,R20
033A 27FF CLR R31
033B 0DE2 ADD R30,R2
033C 1DF3 ADC R31,R3
033D 9104 LPM R16,0(Z)
033E D15A RCALL _LCD_write_byte
033F 9543 INC R20
0340 3046 CPI R20,6
0341 F378 BCS 0x0331
0342 940E04D1 CALL pop_gset2
0344 9508 RET
_LCD_write_english_string:
s --> R20
Y --> R10
X --> R22
0345 940E04DE CALL push_gset3
0347 2EA2 MOV R10,R18
0348 2F60 MOV R22,R16
0349 814E LDD R20,Y+6
034A 815F LDD R21,Y+7
(0084) }
(0085)
(0086) /*-----------------------------------------------------------------------
(0087) LCD_write_english_String : 英文字符串显示函数
(0088)
(0089) 输入参数:*s :英文字符串指针;
(0090) X、Y : 显示字符串的位置,x 0-83 ,y 0-5
(0091)
(0092) 编写日期 :2004-8-10
(0093) 最后修改日期 :2004-8-10
(0094) -----------------------------------------------------------------------*/
(0095) void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
(0096) {
(0097) LCD_set_XY(X,Y);
034B 2D2A MOV R18,R10
034C 2F06 MOV R16,R22
034D DFCE RCALL _LCD_set_XY
034E C005 RJMP 0x0354
(0098) while (*s)
(0099) {
(0100) LCD_write_char(*s);
034F 01FA MOVW R30,R20
0350 8100 LDD R16,Z+0
0351 DFD9 RCALL _LCD_write_char
(0101) s++;
0352 5F4F SUBI R20,0xFF
0353 4F5F SBCI R21,0xFF
0354 01FA MOVW R30,R20
0355 8020 LDD R2,Z+0
0356 2022 TST R2
0357 F7B9 BNE 0x034F
0358 940E04D4 CALL pop_gset3
035A 9508 RET
_LCD_write_chinese_string:
i --> R20
n --> R14
row --> R10
line --> R12
num --> R22
ch_with --> Y+14
Y --> Y+12
X --> Y+10
035B 940E04A4 CALL push_arg4
035D 940E04DA CALL push_gset5
035F 8968 LDD R22,Y+16
0360 88CA LDD R12,Y+18
0361 88AC LDD R10,Y+20
(0102) }
(0103) }
(0104) /*-----------------------------------------------------------------------
(0105) LCD_write_chinese_string: 在LCD上显示汉字
(0106)
(0107) 输入参数:X、Y :显示汉字的起始X、Y坐标;
(0108) ch_with :汉字点阵的宽度
(0109) num :显示汉字的个数;
(0110) line :汉字点阵数组中的起始行数
(0111) row :汉字显示的行间距
(0112) 编写日期 :2004-8-11
(0113) 最后修改日期 :2004-8-12
(0114) 测试:
(0115) LCD_write_chi(0,0,12,7,0,0);
(0116) LCD_write_chi(0,2,12,7,0,0);
(0117) LCD_write_chi(0,4,12,7,0,0);
(0118) -----------------------------------------------------------------------*/
(0119) void LCD_write_chinese_string(unsigned char X, unsigned char Y,
(0120) unsigned char ch_with,unsigned char num,
(0121) unsigned char line,unsigned char row)
(0122) {
(0123) unsigned char i,n;
(0124)
(0125) LCD_set_XY(X,Y); //设置初始位置
0362 852C LDD R18,Y+12
0363 850A LDD R16,Y+10
0364 DFB7 RCALL _LCD_set_XY
(0126)
(0127) for (i=0;i<num;)
0365 2744 CLR R20
0366 C032 RJMP 0x0399
(0128) {
(0129) for (n=0; n<ch_with*2; n++) //写一个汉字
0367 24EE CLR R14
0368 C023 RJMP 0x038C
(0130) {
(0131) if (n==ch_with) //写汉字的下半部分
0369 840E LDD R0,Y+14
036A 14E0 CP R14,R0
036B F479 BNE 0x037B
(0132) {
(0133) if (i==0) LCD_set_XY(X,Y+1);
036C 2344 TST R20
036D F429 BNE 0x0373
036E 852C LDD R18,Y+12
036F 5F2F SUBI R18,0xFF
0370 850A LDD R16,Y+10
0371 DFAA RCALL _LCD_set_XY
0372 C008 RJMP 0x037B
(0134) else
(0135) LCD_set_XY((X+(ch_with+row)*i),Y+1);
0373 852C LDD R18,Y+12
0374 5F2F SUBI R18,0xFF
0375 842E LDD R2,Y+14
0376 0C2A ADD R2,R10
0377 9E24 MUL R2,R20
0378 850A LDD R16,Y+10
0379 0D00 ADD R16,R0
037A DFA1 RCALL _LCD_set_XY
(0136) }
(0137) LCD_write_byte(write_chinese_string[line+i][n],1);
037B E021 LDI R18,1
037C 2C2C MOV R2,R12
037D 0E24 ADD R2,R20
037E E188 LDI R24,0x18
037F 9D82 MUL R24,R2
0380 0110 MOVW R2,R0
0381 E78C LDI R24,0x7C
0382 E092 LDI R25,2
0383 0E28 ADD R2,R24
0384 1E39 ADC R3,R25
0385 2DEE MOV R30,R14
0386 27FF CLR R31
0387 0DE2 ADD R30,R2
0388 1DF3 ADC R31,R3
0389 9104 LPM R16,0(Z)
038A D10E RCALL _LCD_write_byte
038B 94E3 INC R14
038C E082 LDI R24,2
038D 840E LDD R0,Y+14
038E 9D80 MUL R24,R0
038F 14E0 CP R14,R0
0390 F2C0 BCS 0x0369
(0138) }
(0139) i++;
0391 9543 INC R20
(0140) LCD_set_XY((X+(ch_with+row)*i),Y);
0392 852C LDD R18,Y+12
0393 842E LDD R2,Y+14
0394 0C2A ADD R2,R10
0395 9E24 MUL R2,R20
0396 850A LDD R16,Y+10
0397 0D00 ADD R16,R0
0398 DF83 RCALL _LCD_set_XY
0399 1746 CP R20,R22
039A F408 BCC 0x039C
039B CFCB RJMP 0x0367
039C 940E04D7 CALL pop_gset5
039E 9624 ADIW R28,4
039F 9508 RET
_LCD_move_chinese_string:
i --> R20
j --> R22
buffer_l --> Y+84
buffer_h --> Y+0
n --> R10
T --> R12
Y --> R14
X --> Y+178
03A0 940E04A4 CALL push_arg4
03A2 940E04DA CALL push_gset5
03A4 2EE2 MOV R14,R18
03A5 97EF SBIW R28,0x3F
03A6 97EF SBIW R28,0x3F
03A7 97AA SBIW R28,0x2A
03A8 01FE MOVW R30,R28
03A9 54EA SUBI R30,0x4A
03AA 4FFF SBCI R31,0xFF
03AB 80C0 LDD R12,Z+0
(0141) }
(0142) }
(0143)
(0144) /*-----------------------------------------------------------------------
(0145) LCD_move_chinese_string: 汉字移动
(0146)
(0147) 输入参数:X、Y :显示汉字的起始X、Y坐标;
(0148) T :移动速度;
(0149)
(0150) 编写日期 :2004-8-13
(0151) 最后修改日期 :2004-8-13
(0152) -----------------------------------------------------------------------*/
(0153) void LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T)
(0154) {
(0155) unsigned char i,n,j=0;
03AC 2766 CLR R22
(0156) unsigned char buffer_h[84]={0};
03AD E884 LDI R24,0x84
03AE E093 LDI R25,3
03AF 01FE MOVW R30,R28
03B0 E504 LDI R16,0x54
03B1 E010 LDI R17,0
03B2 93FA ST R31,-Y
03B3 93EA ST R30,-Y
03B4 939A ST R25,-Y
03B5 938A ST R24,-Y
03B6 940E04F9 CALL asgncblk
(0157) unsigned char buffer_l[84]={0};
03B8 ED88 LDI R24,0xD8
03B9 E093 LDI R25,3
03BA 01FE MOVW R30,R28
03BB 5AEC SUBI R30,0xAC
03BC 4FFF SBCI R31,0xFF
03BD E504 LDI R16,0x54
03BE E010 LDI R17,0
03BF 93FA ST R31,-Y
03C0 93EA ST R30,-Y
03C1 939A ST R25,-Y
03C2 938A ST R24,-Y
03C3 940E04F9 CALL asgncblk
(0158)
(0159) for (i=0; i<156; i++)
03C5 2744 CLR R20
03C6 C080 RJMP 0x0447
(0160) {
(0161) buffer_h[83] = move_chinese_string[i/12][j];
03C7 E01C LDI R17,0xC
03C8 2F04 MOV R16,R20
03C9 940E04AB CALL div8u
03CB E188 LDI R24,0x18
03CC 9F80 MUL R24,R16
03CD 0110 MOVW R2,R0
03CE EC84 LDI R24,0xC4
03CF E092 LDI R25,2
03D0 0E28 ADD R2,R24
03D1 1E39 ADC R3,R25
03D2 2FE6 MOV R30,R22
03D3 27FF CLR R31
03D4 0DE2 ADD R30,R2
03D5 1DF3 ADC R31,R3
03D6 91E4 LPM R30,0(Z)
03D7 01DE MOVW R26,R28
03D8 5AAD SUBI R26,0xAD
03D9 4FBF SBCI R27,0xFF
03DA 93EC ST R30,0(X)
(0162) buffer_l[83] = move_chinese_string[i/12][j+12];
03DB E01C LDI R17,0xC
03DC 2F04 MOV R16,R20
03DD 940E04AB CALL div8u
03DF E188 LDI R24,0x18
03E0 9F80 MUL R24,R16
03E1 0110 MOVW R2,R0
03E2 EC84 LDI R24,0xC4
03E3 E092 LDI R25,2
03E4 0E28 ADD R2,R24
03E5 1E39 ADC R3,R25
03E6 2FE6 MOV R30,R22
03E7 27FF CLR R31
03E8 963C ADIW R30,0xC
03E9 0DE2 ADD R30,R2
03EA 1DF3 ADC R31,R3
03EB 91E4 LPM R30,0(Z)
03EC 01DE MOVW R26,R28
03ED 55A9 SUBI R26,0x59
03EE 4FBF SBCI R27,0xFF
03EF 93EC ST R30,0(X)
(0163) j++;
03F0 9563 INC R22
(0164) if (j==12) j=0;
03F1 306C CPI R22,0xC
03F2 F409 BNE 0x03F4
03F3 2766 CLR R22
(0165)
(0166) for (n=0; n<83; n++)
03F4 24AA CLR R10
03F5 C01E RJMP 0x0414
(0167) {
(0168) buffer_h[n]=buffer_h[n+1];
03F6 01CE MOVW R24,R28
03F7 9601 ADIW R24,1
03F8 2DEA MOV R30,R10
03F9 27FF CLR R31
03FA 0FE8 ADD R30,R24
03FB 1FF9 ADC R31,R25
03FC 8020 LDD R2,Z+0
03FD 01CE MOVW R24,R28
03FE 2DEA MOV R30,R10
03FF 27FF CLR R31
0400 0FE8 ADD R30,R24
0401 1FF9 ADC R31,R25
0402 8220 STD Z+0,R2
(0169) buffer_l[n]=buffer_l[n+1];
0403 01CE MOVW R24,R28
0404 5A8B SUBI R24,0xAB
0405 4F9F SBCI R25,0xFF
0406 2DEA MOV R30,R10
0407 27FF CLR R31
0408 0FE8 ADD R30,R24
0409 1FF9 ADC R31,R25
040A 8020 LDD R2,Z+0
040B 01CE MOVW R24,R28
040C 5A8C SUBI R24,0xAC
040D 4F9F SBCI R25,0xFF
040E 2DEA MOV R30,R10
040F 27FF CLR R31
0410 0FE8 ADD R30,R24
0411 1FF9 ADC R31,R25
0412 8220 STD Z+0,R2
0413 94A3 INC R10
0414 2D8A MOV R24,R10
0415 3583 CPI R24,0x53
0416 F2F8 BCS 0x03F6
(0170) }
(0171)
(0172) LCD_set_XY(X,Y);
0417 2D2E MOV R18,R14
0418 01FE MOVW R30,R28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -