📄 12864.lst
字号:
02A4 2700 CLR R16
02A5 DF91 RCALL _write_LCD
02A6 9621 ADIW R28,1
02A7 940E1817 CALL pop_gset1
02A9 9508 RET
_set_page_R:
page --> R20
02AA 940E1814 CALL push_gset1
02AC 2F40 MOV R20,R16
02AD 9721 SBIW R28,1
(0123) }
(0124) void set_page_R(unsigned char page) /*设置X地址 设置页*/ //0-7
(0125) {
(0126) write_LCD(RIGHT,CMD,0xb8|page);
02AE 2F84 MOV R24,R20
02AF 6B88 ORI R24,0xB8
02B0 8388 STD Y+0,R24
02B1 2722 CLR R18
02B2 E001 LDI R16,1
02B3 DF83 RCALL _write_LCD
02B4 9621 ADIW R28,1
02B5 940E1817 CALL pop_gset1
02B7 9508 RET
_set_col_addr_L:
col --> R20
02B8 940E1814 CALL push_gset1
02BA 2F40 MOV R20,R16
02BB 9721 SBIW R28,1
(0127) }
(0128)
(0129) void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
(0130) {
(0131) write_LCD(LEFT,CMD,0x40|col);
02BC 2F84 MOV R24,R20
02BD 6480 ORI R24,0x40
02BE 8388 STD Y+0,R24
02BF 2722 CLR R18
02C0 2700 CLR R16
02C1 DF75 RCALL _write_LCD
02C2 9621 ADIW R28,1
02C3 940E1817 CALL pop_gset1
02C5 9508 RET
_set_col_addr_R:
col --> R20
02C6 940E1814 CALL push_gset1
02C8 2F40 MOV R20,R16
02C9 9721 SBIW R28,1
(0132) }
(0133)
(0134) void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
(0135) {
(0136) write_LCD(RIGHT,CMD,0x40|col);
02CA 2F84 MOV R24,R20
02CB 6480 ORI R24,0x40
02CC 8388 STD Y+0,R24
02CD 2722 CLR R18
02CE E001 LDI R16,1
02CF DF67 RCALL _write_LCD
02D0 9621 ADIW R28,1
02D1 940E1817 CALL pop_gset1
02D3 9508 RET
_LCD_Init:
02D4 9721 SBIW R28,1
(0137) }
(0138)
(0139)
(0140) //------------液晶初始化函数-----------------------
(0141) void LCD_Init(void)
(0142) {
(0143) LCD_DIR_PORT = 0xff;
02D5 EF8F LDI R24,0xFF
02D6 BB8A OUT 0x1A,R24
(0144) LCD_OP_PORT = 0xff;
02D7 BB8B OUT 0x1B,R24
(0145) LCD_EN_DDR |= LCD_EN_BIT;
02D8 9ABA SBI 0x17,2
(0146) LCD_DI_DDR |= LCD_DI_BIT;
02D9 9AB8 SBI 0x17,0
(0147) LCD_CS1_DDR |= LCD_CS1_BIT;
02DA 9ABB SBI 0x17,3
(0148) LCD_CS2_DDR |= LCD_CS2_BIT;
02DB 9ABC SBI 0x17,4
(0149) LCD_RW_DDR |= LCD_RW_BIT;
02DC 9AB9 SBI 0x17,1
(0150) LCD_RW_PORT &= ~LCD_RW_BIT;
02DD 98C1 CBI 0x18,1
(0151) LCD_reset();
02DE DF26 RCALL _LCD_reset
(0152) set_start_line_L(0); /*显示起始行为0*/
02DF 2700 CLR R16
02E0 DF9F RCALL _set_start_line_L
(0153) set_start_line_R(0); /*显示起始行为0*/
02E1 2700 CLR R16
02E2 DFAB RCALL _set_start_line_R
(0154) write_LCD(LEFT,CMD,DISPLAY_ON); /* 开显示 */
02E3 E38F LDI R24,0x3F
02E4 8388 STD Y+0,R24
02E5 2722 CLR R18
02E6 2700 CLR R16
02E7 DF4F RCALL _write_LCD
(0155) write_LCD(RIGHT,CMD,DISPLAY_ON); /* 开显示 */
02E8 E38F LDI R24,0x3F
02E9 8388 STD Y+0,R24
02EA 2722 CLR R18
02EB E001 LDI R16,1
02EC DF4A RCALL _write_LCD
02ED 9621 ADIW R28,1
02EE 9508 RET
_LCD_clr:
pages --> R20
i --> R22
02EF 940E1812 CALL push_gset2
02F1 9721 SBIW R28,1
(0156) }
(0157)
(0158)
(0159) //-----------清屏函数---------------------------
(0160) void LCD_clr(void)
(0161) {
(0162) unsigned char pages,i;
(0163) for(pages=0;pages<8;pages++)
02F2 2744 CLR R20
02F3 C018 RJMP 0x030C
(0164) {
(0165) set_page_L(pages); /* X 页地址 */
02F4 2F04 MOV R16,R20
02F5 DFA6 RCALL _set_page_L
(0166) set_page_R(pages); /* X 页地址 */
02F6 2F04 MOV R16,R20
02F7 DFB2 RCALL _set_page_R
(0167) for(i=0;i<64;i++)
02F8 2766 CLR R22
02F9 C00F RJMP 0x0309
(0168) {
(0169) set_col_addr_L(i);//Y
02FA 2F06 MOV R16,R22
02FB DFBC RCALL _set_col_addr_L
(0170) set_col_addr_R(i);//Y
02FC 2F06 MOV R16,R22
02FD DFC8 RCALL _set_col_addr_R
(0171) write_LCD(LEFT,DATA,0x0);
02FE 2422 CLR R2
02FF 8228 STD Y+0,R2
0300 E021 LDI R18,1
0301 2700 CLR R16
0302 DF34 RCALL _write_LCD
(0172) write_LCD(RIGHT,DATA,0x0);
0303 2422 CLR R2
0304 8228 STD Y+0,R2
0305 E021 LDI R18,1
0306 E001 LDI R16,1
0307 DF2F RCALL _write_LCD
0308 9563 INC R22
0309 3460 CPI R22,0x40
030A F378 BCS 0x02FA
030B 9543 INC R20
030C 3048 CPI R20,0x8
030D F330 BCS 0x02F4
030E 9621 ADIW R28,1
030F 940E1800 CALL pop_gset2
0311 9508 RET
(0173) }
(0174) }
(0175) }
(0176)
(0177)
(0178) //---------当前行列获得函数-----------------------
(0179) unsigned char GetPage(void) /*得到当前页*/
(0180) {
(0181) return CurPage;
_GetPage:
0312 91000061 LDS R16,CurPage
0314 9508 RET
(0182) }
(0183)
(0184) unsigned char GetCol(void) /*得到当前列*/
(0185) {
(0186) return CurCol;
_GetCol:
0315 91000060 LDS R16,CurCol
0317 9508 RET
_SetPageCol:
ucol --> R20
upage --> R22
0318 940E1812 CALL push_gset2
031A 2F42 MOV R20,R18
031B 2F60 MOV R22,R16
(0187) }
(0188)
(0189) //-----------------页置函数-----------------
(0190) void SetPageCol(unsigned char upage, unsigned char ucol)
(0191) {
(0192) CurPage = upage;
031C 93600061 STS CurPage,R22
(0193) CurCol = ucol;
031E 93400060 STS CurCol,R20
(0194) if(ucol<64)
0320 3440 CPI R20,0x40
0321 F428 BCC 0x0327
(0195) {
(0196) set_page_L(upage);
0322 2F06 MOV R16,R22
0323 DF78 RCALL _set_page_L
(0197) set_col_addr_L(ucol);
0324 2F04 MOV R16,R20
0325 DF92 RCALL _set_col_addr_L
(0198) }
0326 C005 RJMP 0x032C
(0199) else
(0200) {
(0201) set_page_R(upage);
0327 2F06 MOV R16,R22
0328 DF81 RCALL _set_page_R
(0202) set_col_addr_R(ucol-64);
0329 2F04 MOV R16,R20
032A 5400 SUBI R16,0x40
032B DF9A RCALL _set_col_addr_R
(0203) }
032C 940E1800 CALL pop_gset2
032E 9508 RET
_SetRowCol:
page --> R20
ucol --> R22
urow --> R20
032F 940E1812 CALL push_gset2
0331 2F62 MOV R22,R18
0332 2F40 MOV R20,R16
(0204) }
(0205)
(0206) //---------------行列设置函数---------------------------
(0207) void SetRowCol(unsigned char urow, unsigned char ucol)
(0208) {
(0209) unsigned char page;
(0210) CurRow = urow;
0333 93400062 STS CurRow,R20
(0211) CurCol = ucol;
0335 93600060 STS CurCol,R22
(0212)
(0213) switch(urow)
0337 2755 CLR R21
0338 3041 CPI R20,1
0339 E0E0 LDI R30,0
033A 075E CPC R21,R30
033B F089 BEQ 0x034D
033C 3042 CPI R20,2
033D E0E0 LDI R30,0
033E 075E CPC R21,R30
033F F091 BEQ 0x0352
0340 3043 CPI R20,3
0341 E0E0 LDI R30,0
0342 075E CPC R21,R30
0343 F099 BEQ 0x0357
0344 3044 CPI R20,4
0345 E0E0 LDI R30,0
0346 075E CPC R21,R30
0347 F0A1 BEQ 0x035C
0348 3045 CPI R20,5
0349 E0E0 LDI R30,0
034A 075E CPC R21,R30
034B F0A9 BEQ 0x0361
034C C018 RJMP 0x0365
(0214) {
(0215) case 1:
(0216) page=0;
034D 2744 CLR R20
(0217) CurOffset=1;
034E E081 LDI R24,1
034F 93800063 STS CurOffset,R24
(0218) break;
0351 C013 RJMP 0x0365
(0219) case 2:
(0220) page=1;
0352 E041 LDI R20,1
(0221) CurOffset=2;
0353 E082 LDI R24,2
0354 93800063 STS CurOffset,R24
(0222) break;
0356 C00E RJMP 0x0365
(0223) case 3:
(0224) page=3;
0357 E043 LDI R20,3
(0225) CurOffset=1;
0358 E081 LDI R24,1
0359 93800063 STS CurOffset,R24
(0226) break;
035B C009 RJMP 0x0365
(0227) case 4:
(0228) page=4;
035C E044 LDI R20,4
(0229) CurOffset=2;
035D E082 LDI R24,2
035E 93800063 STS CurOffset,R24
(0230) break;
0360 C004 RJMP 0x0365
(0231) case 5:
(0232) page=6;
0361 E046 LDI R20,6
(0233) CurOffset=1;
0362 E081 LDI R24,1
0363 93800063 STS CurOffset,R24
(0234) break;
(0235) }
(0236) SetPageCol(page,ucol);
0365 2F26 MOV R18,R22
0366 2F04 MOV R16,R20
0367 DFB0 RCALL _SetPageCol
0368 940E1800 CALL pop_gset2
036A 9508 RET
_disp_char:
width --> R22
len --> R22
uPage --> Y+2
ch_r --> R10
uCol --> Y+1
ch_w --> R14
k --> R20
j --> R12
c --> R10
036B 940E180C CALL push_gset5
036D 2EA0 MOV R10,R16
036E 9723 SBIW R28,3
(0237) }
(0238)
(0239)
(0240) //----------------字符显示函数------------------
(0241) void disp_char(unsigned char c)
(0242) {
(0243) unsigned char k,j,uPage,uCol,ch_r,ch_w;
(0244) unsigned char width;
(0245) unsigned char len;
(0246) uPage = GetPage();
036F DFA2 RCALL _GetPage
0370 830A STD Y+2,R16
(0247) uCol = GetCol();
0371 DFA3 RCALL _GetCol
0372 8309 STD Y+1,R16
(0248) len=sizeof(ASC_16)/sizeof(ASC_16[0]);
0373 E16E LDI R22,0x1E
(0249) for(k=0;k<len;k++)
0374 2744 CLR R20
0375 C00C RJMP 0x0382
(0250) {
(0251) if(c == ASC_16[k].Index[0] )
0376 E181 LDI R24,0x11
0377 9F84 MUL R24,R20
0378 01F0 MOVW R30,R0
0379 E584 LDI R24,0x54
037A E090 LDI R25,0
037B 0FE8 ADD R30,R24
037C 1FF9 ADC R31,R25
037D 91E4 LPM R30,0(Z)
037E 16AE CP R10,R30
037F F409 BNE 0x0381
(0252) break;
0380 C003 RJMP 0x0384
0381 9543 INC R20
0382 1746 CP R20,R22
0383 F390 BCS 0x0376
(0253) }
(0254) if(k<len)
0384 1746 CP R20,R22
0385 F008 BCS 0x0387
0386 C0F1 RJMP 0x0478
(0255) {
(0256) if(c=='-'||c==':')
0387 2D8A MOV R24,R10
0388 328D CPI R24,0x2D
0389 F011 BEQ 0x038C
038A 338A CPI R24,0x3A
038B F411 BNE 0x038E
(0257) width=ASC_CHR_WIDTH-2;
038C E066 LDI R22,6
038D C006 RJMP 0x0394
(0258) else if(c=='|')
038E 2D8A MOV R24,R10
038F 378C CPI R24,0x7C
0390 F411 BNE 0x0393
(0259) width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
0391 E064 LDI R22,4
0392 C001 RJMP 0x0394
(0260) else
(0261) width=ASC_CHR_WIDTH;
0393 E068 LDI R22,0x8
(0262)
(0263) if(CurOffset==1) //下半部是写半个字节
0394 91800063 LDS R24,CurOffset
0396 3081 CPI R24,1
0397 F009 BEQ 0x0399
0398 C062 RJMP 0x03FB
(0264) {
(0265) for(j=0;j<width;j++)
0399 24CC CLR R12
039A C01E RJMP 0x03B9
(0266) {
(0267) SetPageCol(uPage,uCol+j);
039B 8129 LDD R18,Y+1
039C 0D2C ADD R18,R12
039D 810A LDD R16,Y+2
039E DF79 RCALL _SetPageCol
(0268) ch_w=ASC_16[k].Msk[j];
039F E181 LDI R24,0x11
03A0 9F84 MUL R24,R20
03A1 0110 MOVW R2,R0
03A2 E585 LDI R24,0x55
03A3 E090 LDI R25,0
03A4 0E28 ADD R2,R24
03A5 1E39 ADC R3,R25
03A6 2DEC MOV R30,R12
03A7 27FF CLR R31
03A8 0DE2 ADD R30,R2
03A9 1DF3 ADC R31,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -