📄 18lcd.lst
字号:
__start:
__text_start:
0368 EFCF LDI R28,0xFF
0369 E1D0 LDI R29,0x10
036A BFCD OUT 0x3D,R28
036B BFDE OUT 0x3E,R29
036C 51C0 SUBI R28,0x10
036D 40D0 SBCI R29,0
036E EA0A LDI R16,0xAA
036F 8308 STD Y+0,R16
0370 2400 CLR R0
0371 E1E3 LDI R30,0x13
0372 E0F1 LDI R31,1
0373 E011 LDI R17,1
0374 31E3 CPI R30,0x13
0375 07F1 CPC R31,R17
0376 F011 BEQ 0x0379
0377 9201 ST R0,Z+
0378 CFFB RJMP 0x0374
0379 8300 STD Z+0,R16
037A EBEC LDI R30,0xBC
037B E0F6 LDI R31,6
037C E0A0 LDI R26,0
037D E0B1 LDI R27,1
037E E016 LDI R17,6
037F 3CEF CPI R30,0xCF
0380 07F1 CPC R31,R17
0381 F021 BEQ 0x0386
0382 95C8 LPM
0383 9631 ADIW R30,1
0384 920D ST R0,X+
0385 CFF9 RJMP 0x037F
0386 940E039E CALL _main
_exit:
0388 CFFF RJMP _exit
FILE: E:\ICCAVR\project\AVRMEG~3\icc\018-LCD12864\main.c
(0001) /*
(0002) 实验十六:
(0003) LCD12864液晶屏显示实验。
(0004) 1、LCD12864显示实验。显示AVR开发网及网址信息。
(0005) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 3、进行此实验请插上JP1、JP2的所有8个短路块,PC6、PC7短路块。
(0007) 4、RW1用于调节显示屏的对比度。
(0008)
(0009) AVR mega16学习板
(0010) www.iccavr.com
(0011) 16:22 2007-4-25
(0012) */
(0013)
(0014) #include <iom128v.h>
(0015) #include "font.h"
(0016) #include "lcd12864.h"
(0017)
(0018) /*IO口初始化函数*/
(0019) void io_init(void) {
(0020)
(0021) DDRA = 0xFF; /*方向输出*/
_io_init:
0389 EF8F LDI R24,0xFF
038A BB8A OUT 0x1A,R24
(0022) PORTA = 0xFF; /*高电平*/
038B BB8B OUT 0x1B,R24
(0023) DDRB = 0x00; /*方向输入*/
038C 2422 CLR R2
038D BA27 OUT 0x17,R2
(0024) PORTB = 0xFF; /*打开上拉*/
038E BB88 OUT 0x18,R24
(0025) DDRC = 0xFF; /*不用的IO口建议设置为输入带上拉*/
038F BB84 OUT 0x14,R24
(0026) PORTC = 0x00;
0390 BA25 OUT 0x15,R2
(0027) DDRD = 0x00;
0391 BA21 OUT 0x11,R2
(0028) PORTD = 0xFF;
0392 BB82 OUT 0x12,R24
(0029) DDRE = 0x00;
0393 B822 OUT 0x02,R2
(0030) PORTE = 0xFF;
0394 B983 OUT 0x03,R24
(0031) DDRF = 0x00;
0395 92200061 STS 0x61,R2
(0032) PORTF = 0xFF;
0397 93800062 STS 0x62,R24
(0033) DDRG = 0x00;
0399 92200064 STS 0x64,R2
(0034) PORTG = 0xFF;
039B 93800065 STS 0x65,R24
039D 9508 RET
_main:
039E 9722 SBIW R28,2
(0035) }
(0036)
(0037) void main(void) {
(0038)
(0039) io_init(); /*IO口初始化*/
039F DFE9 RCALL _io_init
(0040) disp_init(); /*LCD初始化*/
03A0 940E0575 CALL _disp_init
(0041) disp_clear(0, 128, 0); /*清除四行显示*/
03A2 2422 CLR R2
03A3 8228 STD Y+0,R2
03A4 E820 LDI R18,0x80
03A5 2700 CLR R16
03A6 940E0439 CALL _disp_clear
(0042) disp_clear(0, 128, 2);
03A8 E082 LDI R24,2
03A9 8388 STD Y+0,R24
03AA E820 LDI R18,0x80
03AB 2700 CLR R16
03AC 940E0439 CALL _disp_clear
(0043) disp_clear(0, 128, 4);
03AE E084 LDI R24,4
03AF 8388 STD Y+0,R24
03B0 E820 LDI R18,0x80
03B1 2700 CLR R16
03B2 940E0439 CALL _disp_clear
(0044) disp_clear(0, 128, 6);
03B4 E086 LDI R24,6
03B5 8388 STD Y+0,R24
03B6 E820 LDI R18,0x80
03B7 2700 CLR R16
03B8 940E0439 CALL _disp_clear
(0045)
(0046) disp_char_str(28, 2, "AVR"); /*写入“AVR”三个字母*/
03BA E08F LDI R24,0xF
03BB E091 LDI R25,1
03BC 8399 STD Y+1,R25
03BD 8388 STD Y+0,R24
03BE E022 LDI R18,2
03BF E10C LDI R16,0x1C
03C0 940E055A CALL _disp_char_str
(0047) disp_word(52, 2, CBFAA); /*写入“开发网”三个汉字*/
03C2 E081 LDI R24,1
03C3 8388 STD Y+0,R24
03C4 E022 LDI R18,2
03C5 E304 LDI R16,0x34
03C6 940E04F1 CALL _disp_word
(0048) disp_word(68, 2, CB7A2);
03C8 E082 LDI R24,2
03C9 8388 STD Y+0,R24
03CA E022 LDI R18,2
03CB E404 LDI R16,0x44
03CC 940E04F1 CALL _disp_word
(0049) disp_word(84, 2, CCDF8);
03CE E083 LDI R24,3
03CF 8388 STD Y+0,R24
03D0 E022 LDI R18,2
03D1 E504 LDI R16,0x54
03D2 940E04F1 CALL _disp_word
(0050) disp_char_str(8, 5, "www.iccavr.com"); /*显示网址信息*/
03D4 E080 LDI R24,0
03D5 E091 LDI R25,1
03D6 8399 STD Y+1,R25
03D7 8388 STD Y+0,R24
03D8 E025 LDI R18,5
03D9 E008 LDI R16,0x8
03DA 940E055A CALL _disp_char_str
(0051)
(0052) while (1);
03DC CFFF RJMP 0x03DC
03DD 9622 ADIW R28,2
03DE 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\018-LCD12864\lcd12864.c
(0001) /*
(0002) LCD12864液晶屏驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006)
(0007) AVR_AFA
(0008) www.iccavr.com
(0009) */
(0010)
(0011) #include <iom128v.h>
(0012) #include "font.h"
(0013)
(0014) #define RS_CLR PORTC &= ~(1 << PC2) /*命令或数据选择*/
(0015) #define RS_SET PORTC |= (1 << PC2) /*RS = 1命令,RS = 0数据*/
(0016)
(0017) #define RW_CLR PORTC &= ~(1 << PC3) /*读取或写入选择*/
(0018) #define RW_SET PORTC |= (1 << PC3) /*RW = 1读,RW = 0写*/
(0019)
(0020) #define EN_CLR PORTC &= ~(1 << PC4) /*读写使能信号*/
(0021) #define EN_SET PORTC |= (1 << PC4) /*下降沿有效*/
(0022)
(0023) #define RST_CLR PORTC &= ~(1 << PC5) /*芯片复位脚*/
(0024) #define RST_SET PORTC |= (1 << PC5) /*高电平复位*/
(0025)
(0026) #define CSA_CLR PORTC &= ~(1 << PC7) /*左半屏片选*/
(0027) #define CSA_SET PORTC |= (1 << PC7) /*高电平选中*/
(0028)
(0029) #define CSB_CLR PORTC &= ~(1 << PC6) /*右半屏片选*/
(0030) #define CSB_SET PORTC |= (1 << PC6) /*高电平选中*/
(0031)
(0032) /*延时函数*/
(0033) void delay_us(unsigned int n) {
(0034)
(0035) if (n == 0) {
_delay_us:
n --> R16
03DF 3000 CPI R16,0
03E0 0701 CPC R16,R17
03E1 F409 BNE 0x03E3
(0036) return ;
03E2 C006 RJMP 0x03E9
(0037) }
(0038) while (--n);
03E3 01C8 MOVW R24,R16
03E4 9701 SBIW R24,1
03E5 018C MOVW R16,R24
03E6 3000 CPI R16,0
03E7 0701 CPC R16,R17
03E8 F7D1 BNE 0x03E3
03E9 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
03EA 940E0594 CALL push_gset2
(0039) }
(0040)
(0041) /*延时函数*/
(0042) void delay_ms(unsigned char i) {
(0043)
(0044) unsigned char a, b;
(0045) for (a = 1; a < i; a++) {
03EC E041 LDI R20,1
03ED C006 RJMP 0x03F4
(0046) for (b = 1; b; b++) {
03EE E061 LDI R22,1
03EF C001 RJMP 0x03F1
03F0 9563 INC R22
03F1 2366 TST R22
03F2 F7E9 BNE 0x03F0
03F3 9543 INC R20
03F4 1740 CP R20,R16
03F5 F3C0 BCS 0x03EE
03F6 940E0585 CALL pop_gset2
03F8 9508 RET
_LCD0_write_com:
com --> R20
03F9 940E0596 CALL push_gset1
03FB 2F40 MOV R20,R16
(0047) ;
(0048) }
(0049) }
(0050) }
(0051)
(0052) /*显示屏命令写入函数前半屏*/
(0053) void LCD0_write_com(unsigned char com) {
(0054)
(0055) RS_CLR;
03FC 98AA CBI 0x15,2
(0056) RW_CLR;
03FD 98AB CBI 0x15,3
(0057) CSA_SET;
03FE 9AAF SBI 0x15,7
(0058) CSB_CLR;
03FF 98AE CBI 0x15,6
(0059) EN_SET;
0400 9AAC SBI 0x15,4
(0060) PORTA = com;
0401 BB4B OUT 0x1B,R20
(0061) delay_us(1);
0402 E001 LDI R16,1
0403 E010 LDI R17,0
0404 DFDA RCALL _delay_us
(0062) EN_CLR;
0405 98AC CBI 0x15,4
0406 940E0599 CALL pop_gset1
0408 9508 RET
_LCD1_write_com:
com --> R20
0409 940E0596 CALL push_gset1
040B 2F40 MOV R20,R16
(0063) }
(0064)
(0065) /*显示屏命令写入函数后半屏*/
(0066) void LCD1_write_com(unsigned char com) {
(0067)
(0068) RS_CLR;
040C 98AA CBI 0x15,2
(0069) RW_CLR;
040D 98AB CBI 0x15,3
(0070) CSA_CLR;
040E 98AF CBI 0x15,7
(0071) CSB_SET;
040F 9AAE SBI 0x15,6
(0072) EN_SET;
0410 9AAC SBI 0x15,4
(0073) PORTA = com;
0411 BB4B OUT 0x1B,R20
(0074) delay_us(1);
0412 E001 LDI R16,1
0413 E010 LDI R17,0
0414 DFCA RCALL _delay_us
(0075) EN_CLR;
0415 98AC CBI 0x15,4
0416 940E0599 CALL pop_gset1
0418 9508 RET
_LCD0_write_data:
data --> R20
0419 940E0596 CALL push_gset1
041B 2F40 MOV R20,R16
(0076) }
(0077)
(0078) /*显示屏命令写入函数*/
(0079) void LCD0_write_data(unsigned char data) {
(0080)
(0081) RS_SET;
041C 9AAA SBI 0x15,2
(0082) RW_CLR;
041D 98AB CBI 0x15,3
(0083) CSA_SET;
041E 9AAF SBI 0x15,7
(0084) CSB_CLR;
041F 98AE CBI 0x15,6
(0085) EN_SET;
0420 9AAC SBI 0x15,4
(0086) PORTA = data;
0421 BB4B OUT 0x1B,R20
(0087) delay_us(1);
0422 E001 LDI R16,1
0423 E010 LDI R17,0
0424 DFBA RCALL _delay_us
(0088) EN_CLR;
0425 98AC CBI 0x15,4
0426 940E0599 CALL pop_gset1
0428 9508 RET
_LCD1_write_data:
data --> R20
0429 940E0596 CALL push_gset1
042B 2F40 MOV R20,R16
(0089) }
(0090)
(0091) /*显示屏命令写入函数*/
(0092) void LCD1_write_data(unsigned char data) {
(0093)
(0094) RS_SET;
042C 9AAA SBI 0x15,2
(0095) RW_CLR;
042D 98AB CBI 0x15,3
(0096) CSA_CLR;
042E 98AF CBI 0x15,7
(0097) CSB_SET;
042F 9AAE SBI 0x15,6
(0098) EN_SET;
0430 9AAC SBI 0x15,4
(0099) PORTA = data;
0431 BB4B OUT 0x1B,R20
(0100) delay_us(1);
0432 E001 LDI R16,1
0433 E010 LDI R17,0
0434 DFAA RCALL _delay_us
(0101) EN_CLR;
0435 98AC CBI 0x15,4
0436 940E0599 CALL pop_gset1
0438 9508 RET
_disp_clear:
x --> R20
y --> R10
x1 --> R22
x0 --> R12
0439 940E0590 CALL push_gset4
043B 2F62 MOV R22,R18
043C 2EC0 MOV R12,R16
043D 84A8 LDD R10,Y+8
(0102) }
(0103)
(0104) /*显示屏清空显示*/
(0105) void disp_clear(unsigned char x0, unsigned char x1, unsigned char y) {
(0106)
(0107) unsigned char x;
(0108)
(0109) /*清除高位*/
(0110) x = x0;
043E 2D4C MOV R20,R12
(0111) if (x < 63) { /*地址在左半屏范围内*/
043F 334F CPI R20,0x3F
0440 F470 BCC 0x044F
(0112) LCD0_write_com(y | 0xB8);
0441 2D0A MOV R16,R10
0442 6B08 ORI R16,0xB8
0443 DFB5 RCALL _LCD0_write_com
(0113) LCD0_write_com(x | 0x40);
0444 2F04 MOV R16,R20
0445 6400 ORI R16,0x40
0446 DFB2 RCALL _LCD0_write_com
(0114) }
0447 C007 RJMP 0x044F
(0115) while (x < x1) {
(0116) LCD0_write_data(0x00);
0448 2700 CLR R16
0449 DFCF RCALL _LCD0_write_data
(0117) x ++;
044A 9543 INC R20
(0118) if (x > 63) { /*判断地址是否越界*/
044B E38F LDI R24,0x3F
044C 1784 CP R24,R20
044D F408 BCC 0x044F
(0119) break;
044E C002 RJMP 0x0451
044F 1746 CP R20,R22
0450 F3B8 BCS 0x0448
(0120) }
(0121) }
(0122) if (x < x1) { /*地址进入左半屏范围*/
0451 1746 CP R20,R22
0452 F450 BCC 0x045D
(0123) LCD1_write_com(y | 0xB8);
0453 2D0A MOV R16,R10
0454 6B08 ORI R16,0xB8
0455 DFB3 RCALL _LCD1_write_com
(0124) LCD1_write_com(x | 0x40);
0456 2F04 MOV R16,R20
0457 6400 ORI R16,0x40
0458 DFB0 RCALL _LCD1_write_com
(0125) }
0459 C003 RJMP 0x045D
(0126) while (x < x1) {
(0127) LCD1_write_data(0x00);
045A 2700 CLR R16
045B DFCD RCALL _LCD1_write_data
(0128) x ++;
045C 9543 INC R20
045D 1746 CP R20,R22
045E F3D8 BCS 0x045A
(0129) }
(0130)
(0131) /*清除低位*/
(0132) x = x0;
045F 2D4C MOV R20,R12
(0133) if (x < 63) { /*地址在左半屏范围内*/
0460 334F CPI R20,0x3F
0461 F478 BCC 0x0471
(0134) LCD0_write_com((y+1) | 0xB8);
0462 2D0A MOV R16,R10
0463 5F0F SUBI R16,0xFF
0464 6B08 ORI R16,0xB8
0465 DF93 RCALL _LCD0_write_com
(0135) LCD0_write_com(x | 0x40);
0466 2F04 MOV R16,R20
0467 6400 ORI R16,0x40
0468 DF90 RCALL _LCD0_write_com
(0136) }
0469 C007 RJMP 0x0471
(0137) while (x < x1) {
(0138) LCD0_write_data(0x00);
046A 2700 CLR R16
046B DFAD RCALL _LCD0_write_data
(0139) x ++;
046C 9543 INC R20
(0140) if (x > 63) { /*判断地址是否越界*/
046D E38F LDI R24,0x3F
046E 1784 CP R24,R20
046F F408 BCC 0x0471
(0141) break;
0470 C002 RJMP 0x0473
0471 1746 CP R20,R22
0472 F3B8 BCS 0x046A
(0142) }
(0143) }
(0144) if (x < x1) { /*地址进入左半屏范围*/
0473 1746 CP R20,R22
0474 F458 BCC 0x0480
(0145) LCD1_write_com((y+1) | 0xB8);
0475 2D0A MOV R16,R10
0476 5F0F SUBI R16,0xFF
0477 6B08 ORI R16,0xB8
0478 DF90 RCALL _LCD1_write_com
(0146) LCD1_write_com(x | 0x40);
0479 2F04 MOV R16,R20
047A 6400 ORI R16,0x40
047B DF8D RCALL _LCD1_write_com
(0147) }
047C C003 RJMP 0x0480
(0148) while (x < x1) {
(0149) LCD1_write_data(0x00);
047D 2700 CLR R16
047E DFAA RCALL _LCD1_write_data
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -