📄 lcd5110.lst
字号:
02DF 2022 TST R2
02E0 F7B9 BNE 0x02D8
02E1 940E03BA CALL pop_gset3
02E3 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
02E4 940E038A CALL push_arg4
02E6 940E03C0 CALL push_gset5
02E8 8968 LDD R22,Y+16
02E9 88CA LDD R12,Y+18
02EA 88AC LDD R10,Y+20
(0131) }
(0132) }
(0133) /********************************************************************************************************************/
(0134) /*-----------------------------------------------------------------------
(0135) LCD_write_chinese_string: 在LCD上显示汉字
(0136)
(0137) 输入参数:X、Y :显示汉字的起始X、Y坐标;
(0138) ch_with :汉字点阵的宽度
(0139) num :显示汉字的个数;
(0140) line :汉字点阵数组中的起始行数
(0141) row :汉字显示的行间距
(0142) -----------------------------------------------------------------------*/
(0143) void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row)
(0144) {
(0145) unsigned char i,n;
(0146)
(0147) LCD_set_XY(X,Y); //设置初始位置
02EB 852C LDD R18,Y+12
02EC 850A LDD R16,Y+10
02ED DFB7 RCALL _LCD_set_XY
(0148)
(0149) for (i=0;i<num;)
02EE 2744 CLR R20
02EF C032 RJMP 0x0322
(0150) {
(0151) for (n=0; n<ch_with*2; n++) //写一个汉字
02F0 24EE CLR R14
02F1 C023 RJMP 0x0315
(0152) {
(0153) if (n==ch_with) //写汉字的下半部分
02F2 840E LDD R0,Y+14
02F3 14E0 CP R14,R0
02F4 F479 BNE 0x0304
(0154) {
(0155) if (i==0) LCD_set_XY(X,Y+1);
02F5 2344 TST R20
02F6 F429 BNE 0x02FC
02F7 852C LDD R18,Y+12
02F8 5F2F SUBI R18,0xFF
02F9 850A LDD R16,Y+10
02FA DFAA RCALL _LCD_set_XY
02FB C008 RJMP 0x0304
(0156) else
(0157) {
(0158) LCD_set_XY((X+(ch_with+row)*i),Y+1);
02FC 852C LDD R18,Y+12
02FD 5F2F SUBI R18,0xFF
02FE 842E LDD R2,Y+14
02FF 0C2A ADD R2,R10
0300 9E24 MUL R2,R20
0301 850A LDD R16,Y+10
0302 0D00 ADD R16,R0
0303 DFA1 RCALL _LCD_set_XY
(0159) }
(0160) }
(0161) LCD_write_byte(HZK[line+i][n],1);
0304 E021 LDI R18,1
0305 2C2C MOV R2,R12
0306 0E24 ADD R2,R20
0307 E188 LDI R24,0x18
0308 9D82 MUL R24,R2
0309 0110 MOVW R2,R0
030A E78C LDI R24,0x7C
030B E092 LDI R25,2
030C 0E28 ADD R2,R24
030D 1E39 ADC R3,R25
030E 2DEE MOV R30,R14
030F 27FF CLR R31
0310 0DE2 ADD R30,R2
0311 1DF3 ADC R31,R3
0312 9104 LPM R16,0(Z)
0313 D05D RCALL _LCD_write_byte
0314 94E3 INC R14
0315 E082 LDI R24,2
0316 840E LDD R0,Y+14
0317 9D80 MUL R24,R0
0318 14E0 CP R14,R0
0319 F2C0 BCS 0x02F2
(0162) }
(0163) i++;
031A 9543 INC R20
(0164) LCD_set_XY((X+(ch_with+row)*i),Y);
031B 852C LDD R18,Y+12
031C 842E LDD R2,Y+14
031D 0C2A ADD R2,R10
031E 9E24 MUL R2,R20
031F 850A LDD R16,Y+10
0320 0D00 ADD R16,R0
0321 DF83 RCALL _LCD_set_XY
0322 1746 CP R20,R22
0323 F408 BCC 0x0325
0324 CFCB RJMP 0x02F0
0325 940E03BD CALL pop_gset5
0327 9624 ADIW R28,4
0328 9508 RET
_LCD_draw_bmp_pixel:
row --> R20
n --> R22
i --> R14
Pix_y --> Y+18
Pix_x --> R10
map --> R12
Y --> Y+12
X --> Y+10
0329 940E038A CALL push_arg4
032B 940E03C0 CALL push_gset5
032D 84CE LDD R12,Y+14
032E 84DF LDD R13,Y+15
032F 88A8 LDD R10,Y+16
(0165) }
(0166) }
(0167) /********************************************************************************************************************/
(0168) /*-----------------------------------------------------------------------
(0169) LCD_draw_map : 位图绘制函数
(0170)
(0171) 输入参数:X、Y :位图绘制的起始X、Y坐标;
(0172) *map :位图点阵数据;
(0173) Pix_x :位图像素(长)
(0174) Pix_y :位图像素(宽)
(0175) -----------------------------------------------------------------------*/
(0176) void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,unsigned char Pix_x,unsigned char Pix_y)
(0177) {
(0178) unsigned int i,n;
(0179) unsigned char row;
(0180)
(0181) if (Pix_y%8==0)
0330 E018 LDI R17,0x8
0331 890A LDD R16,Y+18
0332 940E038F CALL mod8u
0334 2300 TST R16
0335 F429 BNE 0x033B
(0182) {
(0183) row=Pix_y/8; //计算位图所占行数
0336 894A LDD R20,Y+18
0337 9546 LSR R20
0338 9546 LSR R20
0339 9546 LSR R20
(0184) }
033A C005 RJMP 0x0340
(0185) else
(0186) {
(0187) row=Pix_y/8+1;
033B 894A LDD R20,Y+18
033C 9546 LSR R20
033D 9546 LSR R20
033E 9546 LSR R20
033F 5F4F SUBI R20,0xFF
(0188) }
(0189) for (n=0;n<row;n++)
0340 2766 CLR R22
0341 2777 CLR R23
0342 C025 RJMP 0x0368
(0190) {
(0191) LCD_set_XY(X,Y);
0343 852C LDD R18,Y+12
0344 850A LDD R16,Y+10
0345 DF5F RCALL _LCD_set_XY
(0192) for(i=0; i<Pix_x; i++)
0346 24EE CLR R14
0347 24FF CLR R15
0348 C015 RJMP 0x035E
(0193) {
(0194) LCD_write_byte(map[i+n*Pix_x], 1);
0349 E021 LDI R18,1
034A 2C2A MOV R2,R10
034B 2433 CLR R3
034C 932F PUSH R18
034D 933F PUSH R19
034E 0191 MOVW R18,R2
034F 018B MOVW R16,R22
0350 940E03A7 CALL empy16s
0352 913F POP R19
0353 912F POP R18
0354 01F7 MOVW R30,R14
0355 0FE0 ADD R30,R16
0356 1FF1 ADC R31,R17
0357 0DEC ADD R30,R12
0358 1DFD ADC R31,R13
0359 8100 LDD R16,Z+0
035A D016 RCALL _LCD_write_byte
035B 01C7 MOVW R24,R14
035C 9601 ADIW R24,1
035D 017C MOVW R14,R24
035E 2C2A MOV R2,R10
035F 2433 CLR R3
0360 14E2 CP R14,R2
0361 04F3 CPC R15,R3
0362 F330 BCS 0x0349
(0195) }
(0196) Y++; //换行
0363 840C LDD R0,Y+12
0364 9403 INC R0
0365 860C STD Y+12,R0
0366 5F6F SUBI R22,0xFF
0367 4F7F SBCI R23,0xFF
0368 2E24 MOV R2,R20
0369 2433 CLR R3
036A 1562 CP R22,R2
036B 0573 CPC R23,R3
036C F2B0 BCS 0x0343
036D 940E03BD CALL pop_gset5
036F 9624 ADIW R28,4
0370 9508 RET
_LCD_write_byte:
i --> R20
command --> R18
dat --> R16
0371 940E03C8 CALL push_gset1
(0197) }
(0198) }
(0199) /********************************************************************************************************************/
(0200) /*-----------------------------------------------------------------------
(0201) LCD_write_byte : 写数据到LCD
(0202)
(0203) 输入参数:data :写入的数据;
(0204) command :写数据/命令选择;
(0205) -----------------------------------------------------------------------*/
(0206) void LCD_write_byte(unsigned char dat, unsigned char command)
(0207) {
(0208) unsigned char i;
(0209)
(0210) CLEARBIT(LCD_PORT,LCD_CE);// 使能LCD_CE = 0
0373 98C4 CBI 0x18,4
(0211)
(0212) if (command == 0)
0374 2322 TST R18
0375 F411 BNE 0x0378
(0213) {
(0214) CLEARBIT(LCD_PORT,LCD_DC);// 传送命令 LCD_DC = 0;
0376 98C6 CBI 0x18,6
(0215) }
0377 C001 RJMP 0x0379
(0216) else
(0217) {
(0218) SETBIT(LCD_PORT,LCD_DC);// 传送数据LCD_DC = 1;
0378 9AC6 SBI 0x18,6
(0219) }
(0220)
(0221) for(i=0;i<8;i++)
0379 2744 CLR R20
037A C009 RJMP 0x0384
(0222) {
(0223) if(dat&0x80)
037B FF07 SBRS R16,7
037C C002 RJMP 0x037F
(0224) {
(0225) SETBIT(LCD_PORT,SDIN);//SDIN = 1;
037D 9AC5 SBI 0x18,5
(0226) }
037E C001 RJMP 0x0380
(0227) else
(0228) {
(0229) CLEARBIT(LCD_PORT,SDIN);//SDIN = 0;
037F 98C5 CBI 0x18,5
(0230) }
(0231) CLEARBIT(LCD_PORT,SCLK);//SCLK = 0;
0380 98C7 CBI 0x18,7
(0232) dat = dat << 1;
0381 0F00 LSL R16
(0233) SETBIT(LCD_PORT,SCLK);//SCLK = 1;
0382 9AC7 SBI 0x18,7
0383 9543 INC R20
0384 3048 CPI R20,0x8
0385 F3A8 BCS 0x037B
(0234) }
(0235) SETBIT(LCD_PORT,LCD_CE);//LCD_CE = 1;
FILE: <library>
0386 9AC4 SBI 0x18,4
0387 940E03CB CALL pop_gset1
0389 9508 RET
push_arg4:
038A 933A ST R19,-Y
038B 932A ST R18,-Y
push_arg2:
038C 931A ST R17,-Y
038D 930A ST R16,-Y
038E 9508 RET
mod8u:
038F 9468 BSET 6
0390 C001 RJMP xdiv8u
div8u:
0391 94E8 BCLR 6
xdiv8u:
0392 932A ST R18,-Y
0393 92FA ST R15,-Y
0394 92EA ST R14,-Y
0395 24FF CLR R15
0396 24EE CLR R14
0397 E120 LDI R18,0x10
0398 0F00 LSL R16
0399 1CFF ROL R15
039A 1CEE ROL R14
039B 16E1 CP R14,R17
039C F010 BCS 0x039F
039D 1AE1 SUB R14,R17
039E 9503 INC R16
039F 952A DEC R18
03A0 F7B9 BNE 0x0398
03A1 F40E BRTC 0x03A3
03A2 2D0E MOV R16,R14
03A3 90E9 LD R14,Y+
03A4 90F9 LD R15,Y+
03A5 9129 LD R18,Y+
03A6 9508 RET
empy16s:
03A7 920A ST R0,-Y
03A8 921A ST R1,-Y
03A9 938A ST R24,-Y
03AA 939A ST R25,-Y
03AB 9F02 MUL R16,R18
03AC 01C0 MOVW R24,R0
03AD 9F12 MUL R17,R18
03AE 0D90 ADD R25,R0
03AF 9F03 MUL R16,R19
03B0 0D90 ADD R25,R0
03B1 018C MOVW R16,R24
03B2 9199 LD R25,Y+
03B3 9189 LD R24,Y+
03B4 9019 LD R1,Y+
03B5 9009 LD R0,Y+
03B6 9508 RET
pop_gset2:
03B7 E0E2 LDI R30,2
03B8 940C03CC JMP pop
pop_gset3:
03BA E0E4 LDI R30,4
03BB 940C03CC JMP pop
pop_gset5:
03BD 27EE CLR R30
03BE 940C03CC JMP pop
push_gset5:
03C0 92FA ST R15,-Y
03C1 92EA ST R14,-Y
push_gset4:
03C2 92DA ST R13,-Y
03C3 92CA ST R12,-Y
push_gset3:
03C4 92BA ST R11,-Y
03C5 92AA ST R10,-Y
push_gset2:
03C6 937A ST R23,-Y
03C7 936A ST R22,-Y
push_gset1:
03C8 935A ST R21,-Y
03C9 934A ST R20,-Y
03CA 9508 RET
pop_gset1:
03CB E0E1 LDI R30,1
pop:
03CC 9149 LD R20,Y+
03CD 9159 LD R21,Y+
03CE FDE0 SBRC R30,0
03CF 9508 RET
03D0 9169 LD R22,Y+
03D1 9179 LD R23,Y+
03D2 FDE1 SBRC R30,1
03D3 9508 RET
03D4 90A9 LD R10,Y+
03D5 90B9 LD R11,Y+
03D6 FDE2 SBRC R30,2
03D7 9508 RET
03D8 90C9 LD R12,Y+
03D9 90D9 LD R13,Y+
03DA FDE3 SBRC R30,3
03DB 9508 RET
03DC 90E9 LD R14,Y+
03DD 90F9 LD R15,Y+
03DE 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -