📄 3310lcd_prj.lst
字号:
(0074) 最后修改日期 :2004-8-10
(0075) -----------------------------------------------------------------------*/
(0076) void LCD_write_char(unsigned char c)
(0077) {
(0078) unsigned char line;
(0079)
(0080) c -= 32;
0305 5260 SUBI R22,0x20
(0081)
(0082) for (line=0; line<6; line++)
0306 2744 CLR R20
0307 C00F RJMP 0x0317
(0083) LCD_write_byte(font6x8[c][line], 1);
0308 E021 LDI R18,1
0309 E086 LDI R24,6
030A 9F86 MUL R24,R22
030B 0110 MOVW R2,R0
030C E286 LDI R24,0x26
030D E090 LDI R25,0
030E 0E28 ADD R2,R24
030F 1E39 ADC R3,R25
0310 2FE4 MOV R30,R20
0311 27FF CLR R31
0312 0DE2 ADD R30,R2
0313 1DF3 ADC R31,R3
0314 9104 LPM R16,0(Z)
0315 D147 RCALL _LCD_write_byte
0316 9543 INC R20
0317 3046 CPI R20,6
0318 F378 BCS 0x0308
0319 D17B RCALL pop_gset2
031A 9508 RET
_LCD_write_english_string:
s --> R20
Y --> R10
X --> R22
031B D183 RCALL push_gset3
031C 2EA2 MOV R10,R18
031D 2F60 MOV R22,R16
031E 814E LDD R20,Y+6
031F 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);
0320 2D2A MOV R18,R10
0321 2F06 MOV R16,R22
0322 DFD3 RCALL _LCD_set_XY
0323 C005 RJMP 0x0329
(0098) while (*s)
(0099) {
(0100) LCD_write_char(*s);
0324 01FA MOVW R30,R20
0325 8100 LDD R16,Z+0
0326 DFDC RCALL _LCD_write_char
(0101) s++;
0327 5F4F SUBI R20,0xFF
0328 4F5F SBCI R21,0xFF
0329 01FA MOVW R30,R20
032A 8020 LDD R2,Z+0
032B 2022 TST R2
032C F7B9 BNE 0x0324
032D D169 RCALL pop_gset3
032E 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
032F D138 RCALL push_arg4
0330 D16A RCALL push_gset5
0331 8968 LDD R22,Y+16
0332 88CA LDD R12,Y+18
0333 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); //设置初始位置
0334 852C LDD R18,Y+12
0335 850A LDD R16,Y+10
0336 DFBF RCALL _LCD_set_XY
(0126)
(0127) for (i=0;i<num;)
0337 2744 CLR R20
0338 C032 RJMP 0x036B
(0128) {
(0129) for (n=0; n<ch_with*2; n++) //写一个汉字
0339 24EE CLR R14
033A C023 RJMP 0x035E
(0130) {
(0131) if (n==ch_with) //写汉字的下半部分
033B 840E LDD R0,Y+14
033C 14E0 CP R14,R0
033D F479 BNE 0x034D
(0132) {
(0133) if (i==0) LCD_set_XY(X,Y+1);
033E 2344 TST R20
033F F429 BNE 0x0345
0340 852C LDD R18,Y+12
0341 5F2F SUBI R18,0xFF
0342 850A LDD R16,Y+10
0343 DFB2 RCALL _LCD_set_XY
0344 C008 RJMP 0x034D
(0134) else
(0135) LCD_set_XY((X+(ch_with+row)*i),Y+1);
0345 852C LDD R18,Y+12
0346 5F2F SUBI R18,0xFF
0347 842E LDD R2,Y+14
0348 0C2A ADD R2,R10
0349 9E24 MUL R2,R20
034A 850A LDD R16,Y+10
034B 0D00 ADD R16,R0
034C DFA9 RCALL _LCD_set_XY
(0136) }
(0137) LCD_write_byte(write_chinese_string[line+i][n],1);
034D E021 LDI R18,1
034E 2C2C MOV R2,R12
034F 0E24 ADD R2,R20
0350 E188 LDI R24,0x18
0351 9D82 MUL R24,R2
0352 0110 MOVW R2,R0
0353 E48E LDI R24,0x4E
0354 E092 LDI R25,2
0355 0E28 ADD R2,R24
0356 1E39 ADC R3,R25
0357 2DEE MOV R30,R14
0358 27FF CLR R31
0359 0DE2 ADD R30,R2
035A 1DF3 ADC R31,R3
035B 9104 LPM R16,0(Z)
035C D100 RCALL _LCD_write_byte
035D 94E3 INC R14
035E E082 LDI R24,2
035F 840E LDD R0,Y+14
0360 9D80 MUL R24,R0
0361 14E0 CP R14,R0
0362 F2C0 BCS 0x033B
(0138) }
(0139) i++;
0363 9543 INC R20
(0140) LCD_set_XY((X+(ch_with+row)*i),Y);
0364 852C LDD R18,Y+12
0365 842E LDD R2,Y+14
0366 0C2A ADD R2,R10
0367 9E24 MUL R2,R20
0368 850A LDD R16,Y+10
0369 0D00 ADD R16,R0
036A DF8B RCALL _LCD_set_XY
036B 1746 CP R20,R22
036C F408 BCC 0x036E
036D CFCB RJMP 0x0339
036E D12A RCALL pop_gset5
036F 9624 ADIW R28,4
0370 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
0371 D0F6 RCALL push_arg4
0372 D128 RCALL push_gset5
0373 2EE2 MOV R14,R18
0374 97EF SBIW R28,0x3F
0375 97EF SBIW R28,0x3F
0376 97AA SBIW R28,0x2A
0377 01FE MOVW R30,R28
0378 54EA SUBI R30,0x4A
0379 4FFF SBCI R31,0xFF
037A 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;
037B 2766 CLR R22
(0156) unsigned char buffer_h[84]={0};
037C E586 LDI R24,0x56
037D E093 LDI R25,3
037E 01FE MOVW R30,R28
037F E504 LDI R16,0x54
0380 E010 LDI R17,0
0381 93FA ST R31,-Y
0382 93EA ST R30,-Y
0383 939A ST R25,-Y
0384 938A ST R24,-Y
0385 D134 RCALL asgncblk
(0157) unsigned char buffer_l[84]={0};
0386 EA8A LDI R24,0xAA
0387 E093 LDI R25,3
0388 01FE MOVW R30,R28
0389 5AEC SUBI R30,0xAC
038A 4FFF SBCI R31,0xFF
038B E504 LDI R16,0x54
038C E010 LDI R17,0
038D 93FA ST R31,-Y
038E 93EA ST R30,-Y
038F 939A ST R25,-Y
0390 938A ST R24,-Y
0391 D128 RCALL asgncblk
(0158)
(0159) for (i=0; i<156; i++)
0392 2744 CLR R20
0393 C07D RJMP 0x0411
(0160) {
(0161) buffer_h[83] = move_chinese_string[i/12][j];
0394 E01C LDI R17,0xC
0395 2F04 MOV R16,R20
0396 D0D8 RCALL div8u
0397 E188 LDI R24,0x18
0398 9F80 MUL R24,R16
0399 0110 MOVW R2,R0
039A E986 LDI R24,0x96
039B E092 LDI R25,2
039C 0E28 ADD R2,R24
039D 1E39 ADC R3,R25
039E 2FE6 MOV R30,R22
039F 27FF CLR R31
03A0 0DE2 ADD R30,R2
03A1 1DF3 ADC R31,R3
03A2 91E4 LPM R30,0(Z)
03A3 01DE MOVW R26,R28
03A4 5AAD SUBI R26,0xAD
03A5 4FBF SBCI R27,0xFF
03A6 93EC ST R30,0(X)
(0162) buffer_l[83] = move_chinese_string[i/12][j+12];
03A7 E01C LDI R17,0xC
03A8 2F04 MOV R16,R20
03A9 D0C5 RCALL div8u
03AA E188 LDI R24,0x18
03AB 9F80 MUL R24,R16
03AC 0110 MOVW R2,R0
03AD E986 LDI R24,0x96
03AE E092 LDI R25,2
03AF 0E28 ADD R2,R24
03B0 1E39 ADC R3,R25
03B1 2FE6 MOV R30,R22
03B2 27FF CLR R31
03B3 963C ADIW R30,0xC
03B4 0DE2 ADD R30,R2
03B5 1DF3 ADC R31,R3
03B6 91E4 LPM R30,0(Z)
03B7 01DE MOVW R26,R28
03B8 55A9 SUBI R26,0x59
03B9 4FBF SBCI R27,0xFF
03BA 93EC ST R30,0(X)
(0163) j++;
03BB 9563 INC R22
(0164) if (j==12) j=0;
03BC 306C CPI R22,0xC
03BD F409 BNE 0x03BF
03BE 2766 CLR R22
(0165)
(0166) for (n=0; n<83; n++)
03BF 24AA CLR R10
03C0 C01E RJMP 0x03DF
(0167) {
(0168) buffer_h[n]=buffer_h[n+1];
03C1 01CE MOVW R24,R28
03C2 9601 ADIW R24,1
03C3 2DEA MOV R30,R10
03C4 27FF CLR R31
03C5 0FE8 ADD R30,R24
03C6 1FF9 ADC R31,R25
03C7 8020 LDD R2,Z+0
03C8 01CE MOVW R24,R28
03C9 2DEA MOV R30,R10
03CA 27FF CLR R31
03CB 0FE8 ADD R30,R24
03CC 1FF9 ADC R31,R25
03CD 8220 STD Z+0,R2
(0169) buffer_l[n]=buffer_l[n+1];
03CE 01CE MOVW R24,R28
03CF 5A8B SUBI R24,0xAB
03D0 4F9F SBCI R25,0xFF
03D1 2DEA MOV R30,R10
03D2 27FF CLR R31
03D3 0FE8 ADD R30,R24
03D4 1FF9 ADC R31,R25
03D5 8020 LDD R2,Z+0
03D6 01CE MOVW R24,R28
03D7 5A8C SUBI R24,0xAC
03D8 4F9F SBCI R25,0xFF
03D9 2DEA MOV R30,R10
03DA 27FF CLR R31
03DB 0FE8 ADD R30,R24
03DC 1FF9 ADC R31,R25
03DD 8220 STD Z+0,R2
03DE 94A3 INC R10
03DF 2D8A MOV R24,R10
03E0 3583 CPI R24,0x53
03E1 F2F8 BCS 0x03C1
(0170) }
(0171)
(0172) LCD_set_XY(X,Y);
03E2 2D2E MOV R18,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -