📄 avr_ks0108.lst
字号:
0332 90200073 LDS R2,LCD_EN_BIT
0334 91E00068 LDS R30,LCD_EN_PORT
0336 91F00069 LDS R31,LCD_EN_PORT+1
0338 8030 LDD R3,Z+0
0339 2832 OR R3,R2
033A 8230 STD Z+0,R3
(0136) *LCD_DIR_PORT = 0xff;
033B EF8F LDI R24,0xFF
033C 91E00060 LDS R30,LCD_DIR_PORT
033E 91F00061 LDS R31,LCD_DIR_PORT+1
0340 8380 STD Z+0,R24
(0137) *LCD_OP_PORT = data;
0341 91E00064 LDS R30,LCD_OP_PORT
0343 91F00065 LDS R31,LCD_OP_PORT+1
0345 800C LDD R0,Y+4
0346 8200 STD Z+0,R0
(0138) asm("nop");
0347 0000 NOP
(0139) asm("nop");
0348 0000 NOP
(0140) asm("nop");
0349 0000 NOP
(0141) asm("nop");
034A 0000 NOP
(0142) CLEAR_LCD_E;
034B 90200073 LDS R2,LCD_EN_BIT
034D 9420 COM R2
034E 91E00068 LDS R30,LCD_EN_PORT
0350 91F00069 LDS R31,LCD_EN_PORT+1
0352 8030 LDD R3,Z+0
0353 2032 AND R3,R2
0354 8230 STD Z+0,R3
(0143) *LCD_OP_PORT = 0xff;
0355 91E00064 LDS R30,LCD_OP_PORT
0357 91F00065 LDS R31,LCD_OP_PORT+1
0359 8380 STD Z+0,R24
(0144) asm("sei");
035A 9478 BSET 7
035B 940E098A CALL pop_gset2
035D 9508 RET
_read_LCD:
data --> R20
lr --> R22
035E 940E0999 CALL push_gset2
0360 2F60 MOV R22,R16
(0145) }
(0146) unsigned char read_LCD(unsigned char lr) /* 读显示数据 */
(0147) {
(0148) unsigned char data;
(0149) asm("cli");
0361 94F8 BCLR 7
(0150) LCD_BUSY(lr);
0362 2F06 MOV R16,R22
0363 DF12 RCALL _LCD_BUSY
(0151) SET_LCD_DATA;
0364 90200077 LDS R2,LCD_DI_BIT
0366 91E00070 LDS R30,LCD_DI_PORT
0368 91F00071 LDS R31,LCD_DI_PORT+1
036A 8030 LDD R3,Z+0
036B 2832 OR R3,R2
036C 8230 STD Z+0,R3
(0152) *LCD_DIR_PORT = 0x00;
036D 2422 CLR R2
036E 91E00060 LDS R30,LCD_DIR_PORT
0370 91F00061 LDS R31,LCD_DIR_PORT+1
0372 8220 STD Z+0,R2
(0153) *LCD_OP_PORT = 0xff;
0373 EF8F LDI R24,0xFF
0374 91E00064 LDS R30,LCD_OP_PORT
0376 91F00065 LDS R31,LCD_OP_PORT+1
0378 8380 STD Z+0,R24
(0154) SET_LCD_READ;
0379 90200076 LDS R2,LCD_RW_BIT
037B 91E0006E LDS R30,LCD_RW_PORT
037D 91F0006F LDS R31,LCD_RW_PORT+1
037F 8030 LDD R3,Z+0
0380 2832 OR R3,R2
0381 8230 STD Z+0,R3
(0155) SET_LCD_E;
0382 90200073 LDS R2,LCD_EN_BIT
0384 91E00068 LDS R30,LCD_EN_PORT
0386 91F00069 LDS R31,LCD_EN_PORT+1
0388 8030 LDD R3,Z+0
0389 2832 OR R3,R2
038A 8230 STD Z+0,R3
(0156) asm("nop");
038B 0000 NOP
(0157) asm("nop");
038C 0000 NOP
(0158) asm("nop");
038D 0000 NOP
(0159) asm("nop");
038E 0000 NOP
(0160) data=*LCD_IP_PORT;
038F 91E00062 LDS R30,LCD_IP_PORT
0391 91F00063 LDS R31,LCD_IP_PORT+1
0393 8140 LDD R20,Z+0
(0161) CLEAR_LCD_E;
0394 90200073 LDS R2,LCD_EN_BIT
0396 9420 COM R2
0397 91E00068 LDS R30,LCD_EN_PORT
0399 91F00069 LDS R31,LCD_EN_PORT+1
039B 8030 LDD R3,Z+0
039C 2032 AND R3,R2
039D 8230 STD Z+0,R3
(0162) SET_LCD_WRITE;
039E 90200076 LDS R2,LCD_RW_BIT
03A0 9420 COM R2
03A1 91E0006E LDS R30,LCD_RW_PORT
03A3 91F0006F LDS R31,LCD_RW_PORT+1
03A5 8030 LDD R3,Z+0
03A6 2032 AND R3,R2
03A7 8230 STD Z+0,R3
(0163) LCD_BUSY(lr);
03A8 2F06 MOV R16,R22
03A9 DECC RCALL _LCD_BUSY
(0164) SET_LCD_DATA;
03AA 90200077 LDS R2,LCD_DI_BIT
03AC 91E00070 LDS R30,LCD_DI_PORT
03AE 91F00071 LDS R31,LCD_DI_PORT+1
03B0 8030 LDD R3,Z+0
03B1 2832 OR R3,R2
03B2 8230 STD Z+0,R3
(0165) *LCD_DIR_PORT = 0x00;
03B3 2422 CLR R2
03B4 91E00060 LDS R30,LCD_DIR_PORT
03B6 91F00061 LDS R31,LCD_DIR_PORT+1
03B8 8220 STD Z+0,R2
(0166) *LCD_OP_PORT = 0xff;
03B9 EF8F LDI R24,0xFF
03BA 91E00064 LDS R30,LCD_OP_PORT
03BC 91F00065 LDS R31,LCD_OP_PORT+1
03BE 8380 STD Z+0,R24
(0167) SET_LCD_READ;
03BF 90200076 LDS R2,LCD_RW_BIT
03C1 91E0006E LDS R30,LCD_RW_PORT
03C3 91F0006F LDS R31,LCD_RW_PORT+1
03C5 8030 LDD R3,Z+0
03C6 2832 OR R3,R2
03C7 8230 STD Z+0,R3
(0168) SET_LCD_E;
03C8 90200073 LDS R2,LCD_EN_BIT
03CA 91E00068 LDS R30,LCD_EN_PORT
03CC 91F00069 LDS R31,LCD_EN_PORT+1
03CE 8030 LDD R3,Z+0
03CF 2832 OR R3,R2
03D0 8230 STD Z+0,R3
(0169) asm("nop");
03D1 0000 NOP
(0170) asm("nop");
03D2 0000 NOP
(0171) asm("nop");
03D3 0000 NOP
(0172) asm("nop");
03D4 0000 NOP
(0173) data=*LCD_IP_PORT;
03D5 91E00062 LDS R30,LCD_IP_PORT
03D7 91F00063 LDS R31,LCD_IP_PORT+1
03D9 8140 LDD R20,Z+0
(0174) CLEAR_LCD_E;
03DA 90200073 LDS R2,LCD_EN_BIT
03DC 9420 COM R2
03DD 91E00068 LDS R30,LCD_EN_PORT
03DF 91F00069 LDS R31,LCD_EN_PORT+1
03E1 8030 LDD R3,Z+0
03E2 2032 AND R3,R2
03E3 8230 STD Z+0,R3
(0175) SET_LCD_WRITE;
03E4 90200076 LDS R2,LCD_RW_BIT
03E6 9420 COM R2
03E7 91E0006E LDS R30,LCD_RW_PORT
03E9 91F0006F LDS R31,LCD_RW_PORT+1
03EB 8030 LDD R3,Z+0
03EC 2032 AND R3,R2
03ED 8230 STD Z+0,R3
(0176)
(0177) asm("sei");
03EE 9478 BSET 7
(0178) return data;
03EF 2F04 MOV R16,R20
03F0 940E098A CALL pop_gset2
03F2 9508 RET
_set_start_line_L:
line --> R20
03F3 940E099B CALL push_gset1
03F5 2F40 MOV R20,R16
03F6 9721 SBIW R28,1
(0179) }
(0180)
(0181) void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
(0182) {
(0183) write_LCD(LEFT,CMD,0xc0|line);
03F7 2F84 MOV R24,R20
03F8 6C80 ORI R24,0xC0
03F9 8388 STD Y+0,R24
03FA 2722 CLR R18
03FB 2700 CLR R16
03FC DF0E RCALL _write_LCD
03FD 9621 ADIW R28,1
03FE 940E099E CALL pop_gset1
0400 9508 RET
_set_start_line_R:
line --> R20
0401 940E099B CALL push_gset1
0403 2F40 MOV R20,R16
0404 9721 SBIW R28,1
(0184) }
(0185)
(0186) void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
(0187) {
(0188) write_LCD(RIGHT,CMD,0xc0|line);
0405 2F84 MOV R24,R20
0406 6C80 ORI R24,0xC0
0407 8388 STD Y+0,R24
0408 2722 CLR R18
0409 E001 LDI R16,1
040A DF00 RCALL _write_LCD
040B 9621 ADIW R28,1
040C 940E099E CALL pop_gset1
040E 9508 RET
_set_page_L:
page --> R20
040F 940E099B CALL push_gset1
0411 2F40 MOV R20,R16
0412 9721 SBIW R28,1
(0189) }
(0190)
(0191) void set_page_L(unsigned char page) /*设置X地址 设置页*/ //0-7
(0192) {
(0193) write_LCD(LEFT,CMD,0xb8|page);
0413 2F84 MOV R24,R20
0414 6B88 ORI R24,0xB8
0415 8388 STD Y+0,R24
0416 2722 CLR R18
0417 2700 CLR R16
0418 DEF2 RCALL _write_LCD
0419 9621 ADIW R28,1
041A 940E099E CALL pop_gset1
041C 9508 RET
_set_page_R:
page --> R20
041D 940E099B CALL push_gset1
041F 2F40 MOV R20,R16
0420 9721 SBIW R28,1
(0194) }
(0195) void set_page_R(unsigned char page) /*设置X地址 设置页*/ //0-7
(0196) {
(0197) write_LCD(RIGHT,CMD,0xb8|page);
0421 2F84 MOV R24,R20
0422 6B88 ORI R24,0xB8
0423 8388 STD Y+0,R24
0424 2722 CLR R18
0425 E001 LDI R16,1
0426 DEE4 RCALL _write_LCD
0427 9621 ADIW R28,1
0428 940E099E CALL pop_gset1
042A 9508 RET
_set_col_addr_L:
col --> R20
042B 940E099B CALL push_gset1
042D 2F40 MOV R20,R16
042E 9721 SBIW R28,1
(0198) }
(0199)
(0200) void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
(0201) {
(0202) write_LCD(LEFT,CMD,0x40|col);
042F 2F84 MOV R24,R20
0430 6480 ORI R24,0x40
0431 8388 STD Y+0,R24
0432 2722 CLR R18
0433 2700 CLR R16
0434 DED6 RCALL _write_LCD
0435 9621 ADIW R28,1
0436 940E099E CALL pop_gset1
0438 9508 RET
_set_col_addr_R:
col --> R20
0439 940E099B CALL push_gset1
043B 2F40 MOV R20,R16
043C 9721 SBIW R28,1
(0203) }
(0204)
(0205) void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
(0206) {
(0207) write_LCD(RIGHT,CMD,0x40|col);
043D 2F84 MOV R24,R20
043E 6480 ORI R24,0x40
043F 8388 STD Y+0,R24
0440 2722 CLR R18
0441 E001 LDI R16,1
0442 DEC8 RCALL _write_LCD
0443 9621 ADIW R28,1
0444 940E099E CALL pop_gset1
0446 9508 RET
_init_lcd:
0447 9721 SBIW R28,1
(0208) }
(0209)
(0210) void init_lcd(void) /*初始化函数*/
(0211) { delay_nms(1000);
0448 EE08 LDI R16,0xE8
0449 E013 LDI R17,3
044A DE1C RCALL _delay_nms
(0212) REST_LCD;
044B 90200072 LDS R2,LCD_RES_BIT
044D 91E00066 LDS R30,LCD_RES_PORT
044F 91F00067 LDS R31,LCD_RES_PORT+1
0451 8030 LDD R3,Z+0
0452 2832 OR R3,R2
0453 8230 STD Z+0,R3
(0213) delay_nms(1000);
0454 EE08 LDI R16,0xE8
0455 E013 LDI R17,3
0456 DE10 RCALL _delay_nms
(0214) set_start_line_L(0); /*显示起始行为0*/
0457 2700 CLR R16
0458 DF9A RCALL _set_start_line_L
(0215) set_start_line_R(0); /*显示起始行为0*/
0459 2700 CLR R16
045A DFA6 RCALL _set_start_line_R
(0216) write_LCD(LEFT,CMD,DISPLAY_ON); /* 开显示 */
045B E38F LDI R24,0x3F
045C 8388 STD Y+0,R24
045D 2722 CLR R18
045E 2700 CLR R16
045F DEAB RCALL _write_LCD
(0217) write_LCD(RIGHT,CMD,DISPLAY_ON); /* 开显示 */
0460 E38F LDI R24,0x3F
0461 8388 STD Y+0,R24
0462 2722 CLR R18
0463 E001 LDI R16,1
0464 DEA6 RCALL _write_LCD
0465 9621 ADIW R28,1
0466 9508 RET
_clr_lcd:
pages --> R20
i --> R22
0467 940E0999 CALL push_gset2
0469 9721 SBIW R28,1
(0218) }
(0219)
(0220) void clr_lcd(void) /*清屏函数*/
(0221) {
(0222) unsigned char pages,i;
(0223) for(pages=0;pages<8;pages++)
046A 2744 CLR R20
046B C018 RJMP 0x0484
(0224) {
(0225) set_page_L(pages); /* X 页地址 */
046C 2F04 MOV R16,R20
046D DFA1 RCALL _set_page_L
(0226) set_page_R(pages); /* X 页地址 */
046E 2F04 MOV R16,R20
046F DFAD RCALL _set_page_R
(0227) for(i=0;i<64;i++)
0470 2766 CLR R22
0471 C00F RJMP 0x0481
(0228) {
(0229) set_col_addr_L(i);//Y
0472 2F06 MOV R16,R22
0473 DFB7 RCALL _set_col_addr_L
(0230) set_col_addr_R(i);//Y
0474 2F06 MOV R16,R22
0475 DFC3 RCALL _set_col_addr_R
(0231) write_LCD(LEFT,DATA,0x0);
0476 2422 CLR R2
0477 8228 STD Y+0,R2
0478 E021 LDI R18,1
0479 2700 CLR R16
047A DE90 RCALL _write_LCD
(0232) write_LCD(RIGHT,DATA,0x0);
047B 2422 CLR R2
047C 8228 STD Y+0,R2
047D E021 LDI R18,1
047E E001 LDI R16,1
047F DE8B RCALL _write_LCD
0480 9563 INC R22
0481 3460 CPI R22,0x40
0482 F378 BCS 0x0472
0483 9543 INC R20
0484 3048 CPI R20,0x8
0485 F330 BCS 0x046C
0486 9621 ADIW R28,1
0487 940E098A CALL pop_gset2
0489 9508 RET
(0233) }
(0234) }
(0235) }
(0236)
(0237) //ASCII 字模宽度及高度
(0238) #define ASC_CHR_WIDTH 8
(0239) #define ASC_CHR_HEIGHT 12
(0240)
(0241) typedef struct typFNT_ASC16 /* 汉字字模显示数据结构 */
(0242) {
(0243) char Index[1];
(0244) char Msk[16];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -