?? 016.lst
字號:
__start:
__text_start:
034C E5CF LDI R28,0x5F
034D E0D4 LDI R29,4
034E BFCD OUT 0x3D,R28
034F BFDE OUT 0x3E,R29
0350 51C0 SUBI R28,0x10
0351 40D0 SBCI R29,0
0352 EA0A LDI R16,0xAA
0353 8308 STD Y+0,R16
0354 2400 CLR R0
0355 E7E3 LDI R30,0x73
0356 E0F0 LDI R31,0
0357 E010 LDI R17,0
0358 37E3 CPI R30,0x73
0359 07F1 CPC R31,R17
035A F011 BEQ 0x035D
035B 9201 ST R0,Z+
035C CFFB RJMP 0x0358
035D 8300 STD Z+0,R16
035E E8E4 LDI R30,0x84
035F E0F6 LDI R31,6
0360 E6A0 LDI R26,0x60
0361 E0B0 LDI R27,0
0362 E016 LDI R17,6
0363 39E7 CPI R30,0x97
0364 07F1 CPC R31,R17
0365 F021 BEQ 0x036A
0366 95C8 LPM
0367 9631 ADIW R30,1
0368 920D ST R0,X+
0369 CFF9 RJMP 0x0363
036A 940E036D CALL _main
_exit:
036C CFFF RJMP _exit
_main:
036D 9722 SBIW R28,2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\016-LCD12864\main.c
(0001) /*
(0002) 實驗十五:
(0003) LCD1602顯示實驗。
(0004) 1、LCD1602顯示實驗。顯示歡及網址信息。
(0005) 2、內部1 M晶振,程序采用單任務方式,軟件延時。
(0006) 3、進行此實驗請插上JP1、JP2的所有8個短路塊,PC7短路塊。
(0007)
(0008) AVR mega16學習板
(0009) www.iccavr.com
(0010) 23:03 2007-4-13
(0011) */
(0012)
(0013) #include <iom16v.h>
(0014) #include "font.h"
(0015) #include "lcd12864.h"
(0016)
(0017) void main(void) {
(0018)
(0019) PORTA = 0xFF; /*打開上拉*/
036E EF8F LDI R24,0xFF
036F BB8B OUT 0x1B,R24
(0020) DDRA = 0x00; /*方向輸入*/
0370 2422 CLR R2
0371 BA2A OUT 0x1A,R2
(0021) PORTB = 0xFF; /*電平設置*/
0372 BB88 OUT 0x18,R24
(0022) DDRB = 0xFF; /*方向輸出*/
0373 BB87 OUT 0x17,R24
(0023) PORTC = 0x7F;
0374 E78F LDI R24,0x7F
0375 BB85 OUT 0x15,R24
(0024) DDRC = 0x80;
0376 E880 LDI R24,0x80
0377 BB84 OUT 0x14,R24
(0025) PORTD = 0xFF;
0378 EF8F LDI R24,0xFF
0379 BB82 OUT 0x12,R24
(0026) DDRD = 0x00;
037A BA21 OUT 0x11,R2
(0027)
(0028) disp_init();
037B 940E0550 CALL _disp_init
(0029) disp_clear(0, 128, 0);
037D 2422 CLR R2
037E 8228 STD Y+0,R2
037F E820 LDI R18,0x80
0380 2700 CLR R16
0381 940E0414 CALL _disp_clear
(0030) disp_clear(0, 128, 2);
0383 E082 LDI R24,2
0384 8388 STD Y+0,R24
0385 E820 LDI R18,0x80
0386 2700 CLR R16
0387 940E0414 CALL _disp_clear
(0031) disp_clear(0, 128, 4);
0389 E084 LDI R24,4
038A 8388 STD Y+0,R24
038B E820 LDI R18,0x80
038C 2700 CLR R16
038D 940E0414 CALL _disp_clear
(0032) disp_clear(0, 128, 6);
038F E086 LDI R24,6
0390 8388 STD Y+0,R24
0391 E820 LDI R18,0x80
0392 2700 CLR R16
0393 940E0414 CALL _disp_clear
(0033)
(0034) disp_char_str(28, 2, "AVR");
0395 E68F LDI R24,0x6F
0396 E090 LDI R25,0
0397 8399 STD Y+1,R25
0398 8388 STD Y+0,R24
0399 E022 LDI R18,2
039A E10C LDI R16,0x1C
039B 940E0535 CALL _disp_char_str
(0035) disp_word(52, 2, CBFAA);
039D E081 LDI R24,1
039E 8388 STD Y+0,R24
039F E022 LDI R18,2
03A0 E304 LDI R16,0x34
03A1 940E04CC CALL _disp_word
(0036) disp_word(68, 2, CB7A2);
03A3 E082 LDI R24,2
03A4 8388 STD Y+0,R24
03A5 E022 LDI R18,2
03A6 E404 LDI R16,0x44
03A7 940E04CC CALL _disp_word
(0037) disp_word(84, 2, CCDF8);
03A9 E083 LDI R24,3
03AA 8388 STD Y+0,R24
03AB E022 LDI R18,2
03AC E504 LDI R16,0x54
03AD 940E04CC CALL _disp_word
(0038) disp_char_str(8, 5, "www.iccavr.com");
03AF E680 LDI R24,0x60
03B0 E090 LDI R25,0
03B1 8399 STD Y+1,R25
03B2 8388 STD Y+0,R24
03B3 E025 LDI R18,5
03B4 E008 LDI R16,0x8
03B5 940E0535 CALL _disp_char_str
(0039)
(0040) while (1);
03B7 CFFF RJMP 0x03B7
03B8 9622 ADIW R28,2
03B9 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\016-LCD12864\lcd12864.c
(0001) /*
(0002) LCD1602液晶屏驅動模塊
(0003) 1、可直接嵌入到項目中使用
(0004) 2、晶振頻率:1M
(0005) 3、如晶振提高低層驅動延時要作相應修改
(0006)
(0007) AVR_AFA
(0008) www.iccavr.com
(0009) */
(0010)
(0011) #include <iom16v.h>
(0012) #include "font.h"
(0013)
(0014) #define RS_CLR PORTD &= ~(1 << PD3)/*命令或數據選擇*/
(0015) #define RS_SET PORTD |= (1 << PD3)/*RS = 1命令,RS = 0數據*/
(0016)
(0017) #define RW_CLR PORTD &= ~(1 << PD4)/*讀取或寫入選擇*/
(0018) #define RW_SET PORTD |= (1 << PD4)/*RW = 1讀,RW = 0寫*/
(0019)
(0020) #define EN_CLR PORTD &= ~(1 << PD6)/*讀寫使能信號*/
(0021) #define EN_SET PORTD |= (1 << PD6)/*下降沿有效*/
(0022)
(0023) #define RST_CLR PORTD &= ~(1 << PD7)/*芯片復位腳*/
(0024) #define RST_SET PORTD |= (1 << PD7)/*高電平復位*/
(0025)
(0026) #define CSA_CLR PORTC &= ~(1 << PC6)/*左半屏片選*/
(0027) #define CSA_SET PORTC |= (1 << PC6)/*高電平選中*/
(0028)
(0029) #define CSB_CLR PORTC &= ~(1 << PC7)/*右半屏片選*/
(0030) #define CSB_SET PORTC |= (1 << PC7)/*高電平選中*/
(0031)
(0032) /*延時函數*/
(0033) void delay_us(unsigned int n) {
(0034)
(0035) if (n == 0) {
_delay_us:
n --> R16
03BA 3000 CPI R16,0
03BB 0701 CPC R16,R17
03BC F409 BNE 0x03BE
(0036) return ;
03BD C006 RJMP 0x03C4
(0037) }
(0038) while (--n);
03BE 01C8 MOVW R24,R16
03BF 9701 SBIW R24,1
03C0 018C MOVW R16,R24
03C1 3000 CPI R16,0
03C2 0701 CPC R16,R17
03C3 F7D1 BNE 0x03BE
03C4 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
03C5 940E0574 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++) {
03C7 E041 LDI R20,1
03C8 C006 RJMP 0x03CF
(0046) for (b = 1; b; b++) {
03C9 E061 LDI R22,1
03CA C001 RJMP 0x03CC
03CB 9563 INC R22
03CC 2366 TST R22
03CD F7E9 BNE 0x03CB
03CE 9543 INC R20
03CF 1740 CP R20,R16
03D0 F3C0 BCS 0x03C9
03D1 940E0565 CALL pop_gset2
03D3 9508 RET
_LCD0_write_com:
com --> R20
03D4 940E0576 CALL push_gset1
03D6 2F40 MOV R20,R16
(0047) ;
(0048) }
(0049) }
(0050) }
(0051)
(0052) /*顯示屏命令寫入函數前半屏*/
(0053) void LCD0_write_com(unsigned char com) {
(0054)
(0055) RS_CLR;
03D7 9893 CBI 0x12,3
(0056) RW_CLR;
03D8 9894 CBI 0x12,4
(0057) CSA_SET;
03D9 9AAE SBI 0x15,6
(0058) CSB_CLR;
03DA 98AF CBI 0x15,7
(0059) EN_SET;
03DB 9A96 SBI 0x12,6
(0060) PORTB = com;
03DC BB48 OUT 0x18,R20
(0061) delay_us(1);
03DD E001 LDI R16,1
03DE E010 LDI R17,0
03DF DFDA RCALL _delay_us
(0062) EN_CLR;
03E0 9896 CBI 0x12,6
03E1 940E0579 CALL pop_gset1
03E3 9508 RET
_LCD1_write_com:
com --> R20
03E4 940E0576 CALL push_gset1
03E6 2F40 MOV R20,R16
(0063) }
(0064)
(0065) /*顯示屏命令寫入函數后半屏*/
(0066) void LCD1_write_com(unsigned char com) {
(0067)
(0068) RS_CLR;
03E7 9893 CBI 0x12,3
(0069) RW_CLR;
03E8 9894 CBI 0x12,4
(0070) CSA_CLR;
03E9 98AE CBI 0x15,6
(0071) CSB_SET;
03EA 9AAF SBI 0x15,7
(0072) EN_SET;
03EB 9A96 SBI 0x12,6
(0073) PORTB = com;
03EC BB48 OUT 0x18,R20
(0074) delay_us(1);
03ED E001 LDI R16,1
03EE E010 LDI R17,0
03EF DFCA RCALL _delay_us
(0075) EN_CLR;
03F0 9896 CBI 0x12,6
03F1 940E0579 CALL pop_gset1
03F3 9508 RET
_LCD0_write_data:
data --> R20
03F4 940E0576 CALL push_gset1
03F6 2F40 MOV R20,R16
(0076) }
(0077)
(0078) /*顯示屏命令寫入函數*/
(0079) void LCD0_write_data(unsigned char data) {
(0080)
(0081) RS_SET;
03F7 9A93 SBI 0x12,3
(0082) RW_CLR;
03F8 9894 CBI 0x12,4
(0083) CSA_SET;
03F9 9AAE SBI 0x15,6
(0084) CSB_CLR;
03FA 98AF CBI 0x15,7
(0085) EN_SET;
03FB 9A96 SBI 0x12,6
(0086) PORTB = data;
03FC BB48 OUT 0x18,R20
(0087) delay_us(1);
03FD E001 LDI R16,1
03FE E010 LDI R17,0
03FF DFBA RCALL _delay_us
(0088) EN_CLR;
0400 9896 CBI 0x12,6
0401 940E0579 CALL pop_gset1
0403 9508 RET
_LCD1_write_data:
data --> R20
0404 940E0576 CALL push_gset1
0406 2F40 MOV R20,R16
(0089) }
(0090)
(0091) /*顯示屏命令寫入函數*/
(0092) void LCD1_write_data(unsigned char data) {
(0093)
(0094) RS_SET;
0407 9A93 SBI 0x12,3
(0095) RW_CLR;
0408 9894 CBI 0x12,4
(0096) CSA_CLR;
0409 98AE CBI 0x15,6
(0097) CSB_SET;
040A 9AAF SBI 0x15,7
(0098) EN_SET;
040B 9A96 SBI 0x12,6
(0099) PORTB = data;
040C BB48 OUT 0x18,R20
(0100) delay_us(1);
040D E001 LDI R16,1
040E E010 LDI R17,0
040F DFAA RCALL _delay_us
(0101) EN_CLR;
0410 9896 CBI 0x12,6
0411 940E0579 CALL pop_gset1
0413 9508 RET
_disp_clear:
x --> R20
y --> R10
x1 --> R22
x0 --> R12
0414 940E0570 CALL push_gset4
0416 2F62 MOV R22,R18
0417 2EC0 MOV R12,R16
0418 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;
0419 2D4C MOV R20,R12
(0111) if (x < 63) { /*地址在左半屏范圍內*/
041A 334F CPI R20,0x3F
041B F470 BCC 0x042A
(0112) LCD0_write_com(y | 0xB8);
041C 2D0A MOV R16,R10
041D 6B08 ORI R16,0xB8
041E DFB5 RCALL _LCD0_write_com
(0113) LCD0_write_com(x | 0x40);
041F 2F04 MOV R16,R20
0420 6400 ORI R16,0x40
0421 DFB2 RCALL _LCD0_write_com
(0114) }
0422 C007 RJMP 0x042A
(0115) while (x < x1) {
(0116) LCD0_write_data(0x00);
0423 2700 CLR R16
0424 DFCF RCALL _LCD0_write_data
(0117) x ++;
0425 9543 INC R20
(0118) if (x > 63) { /*判斷地址是否越界*/
0426 E38F LDI R24,0x3F
0427 1784 CP R24,R20
0428 F408 BCC 0x042A
(0119) break;
0429 C002 RJMP 0x042C
042A 1746 CP R20,R22
042B F3B8 BCS 0x0423
(0120) }
(0121) }
(0122) if (x < x1) { /*地址進入左半屏范圍*/
042C 1746 CP R20,R22
042D F450 BCC 0x0438
(0123) LCD1_write_com(y | 0xB8);
042E 2D0A MOV R16,R10
042F 6B08 ORI R16,0xB8
0430 DFB3 RCALL _LCD1_write_com
(0124) LCD1_write_com(x | 0x40);
0431 2F04 MOV R16,R20
0432 6400 ORI R16,0x40
0433 DFB0 RCALL _LCD1_write_com
(0125) }
0434 C003 RJMP 0x0438
(0126) while (x < x1) {
(0127) LCD1_write_data(0x00);
0435 2700 CLR R16
0436 DFCD RCALL _LCD1_write_data
(0128) x ++;
0437 9543 INC R20
0438 1746 CP R20,R22
0439 F3D8 BCS 0x0435
(0129) }
(0130)
(0131) /*清除低位*/
(0132) x = x0;
043A 2D4C MOV R20,R12
(0133) if (x < 63) { /*地址在左半屏范圍內*/
043B 334F CPI R20,0x3F
043C F478 BCC 0x044C
(0134) LCD0_write_com((y+1) | 0xB8);
043D 2D0A MOV R16,R10
043E 5F0F SUBI R16,0xFF
043F 6B08 ORI R16,0xB8
0440 DF93 RCALL _LCD0_write_com
(0135) LCD0_write_com(x | 0x40);
0441 2F04 MOV R16,R20
0442 6400 ORI R16,0x40
0443 DF90 RCALL _LCD0_write_com
(0136) }
0444 C007 RJMP 0x044C
(0137) while (x < x1) {
(0138) LCD0_write_data(0x00);
0445 2700 CLR R16
0446 DFAD RCALL _LCD0_write_data
(0139) x ++;
0447 9543 INC R20
(0140) if (x > 63) { /*判斷地址是否越界*/
0448 E38F LDI R24,0x3F
0449 1784 CP R24,R20
044A F408 BCC 0x044C
(0141) break;
044B C002 RJMP 0x044E
044C 1746 CP R20,R22
044D F3B8 BCS 0x0445
(0142) }
(0143) }
(0144) if (x < x1) { /*地址進入左半屏范圍*/
044E 1746 CP R20,R22
044F F458 BCC 0x045B
(0145) LCD1_write_com((y+1) | 0xB8);
0450 2D0A MOV R16,R10
0451 5F0F SUBI R16,0xFF
0452 6B08 ORI R16,0xB8
0453 DF90 RCALL _LCD1_write_com
(0146) LCD1_write_com(x | 0x40);
0454 2F04 MOV R16,R20
0455 6400 ORI R16,0x40
0456 DF8D RCALL _LCD1_write_com
(0147) }
0457 C003 RJMP 0x045B
(0148) while (x < x1) {
(0149) LCD1_write_data(0x00);
0458 2700 CLR R16
0459 DFAA RCALL _LCD1_write_data
(0150) x ++;
045A 9543 INC R20
045B 1746 CP R20,R22
045C F3D8 BCS 0x0458
045D 940E056B CALL pop_gset4
045F 9508 RET
_disp_char:
q --> R20
i --> R22
ascii --> Y+8
y --> R12
x --> R10
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -