📄 17lcd.lst
字号:
__text_start:
__start:
0052 EFCF LDI R28,0xFF
0053 E1D0 LDI R29,0x10
0054 BFCD OUT 0x3D,R28
0055 BFDE OUT 0x3E,R29
0056 51C0 SUBI R28,0x10
0057 40D0 SBCI R29,0
0058 EA0A LDI R16,0xAA
0059 8308 STD Y+0,R16
005A 2400 CLR R0
005B E1E7 LDI R30,0x17
005C E0F1 LDI R31,1
005D E011 LDI R17,1
005E 31E7 CPI R30,0x17
005F 07F1 CPC R31,R17
0060 F011 BEQ 0x0063
0061 9201 ST R0,Z+
0062 CFFB RJMP 0x005E
0063 8300 STD Z+0,R16
0064 E8EC LDI R30,0x8C
0065 E0F0 LDI R31,0
0066 E0A0 LDI R26,0
0067 E0B1 LDI R27,1
0068 E010 LDI R17,0
0069 3AE3 CPI R30,0xA3
006A 07F1 CPC R31,R17
006B F021 BEQ 0x0070
006C 95C8 LPM
006D 9631 ADIW R30,1
006E 920D ST R0,X+
006F CFF9 RJMP 0x0069
0070 940E010D CALL _main
_exit:
0072 CFFF RJMP _exit
FILE: E:\ICCAVR\project\AVRMEG~3\icc\017-LCD1602\lcd1602.c
(0001) /*
(0002) LCD1602液晶屏驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006)
(0007) AVR_AFA
(0008) www.iccavr.com
(0009) 程序编写过程中参照了peak的4线显示程序
(0010) peak:AVR论坛技术版版主
(0011) */
(0012)
(0013) #include <iom128v.h>
(0014)
(0015) #define RS_CLR PORTC &= ~(1 << PC2)
(0016) #define RS_SET PORTC |= (1 << PC2)
(0017)
(0018) #define RW_CLR PORTC &= ~(1 << PC3)
(0019) #define RW_SET PORTC |= (1 << PC3)
(0020)
(0021) #define EN_CLR PORTC &= ~(1 << PC4)
(0022) #define EN_SET PORTC |= (1 << PC4)
(0023)
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026)
(0027) if (n == 0) {
_delay_us:
n --> R16
0073 3000 CPI R16,0
0074 0701 CPC R16,R17
0075 F409 BNE 0x0077
(0028) return ;
0076 C006 RJMP 0x007D
(0029) }
(0030) while (--n);
0077 01C8 MOVW R24,R16
0078 9701 SBIW R24,1
0079 018C MOVW R16,R24
007A 3000 CPI R16,0
007B 0701 CPC R16,R17
007C F7D1 BNE 0x0077
007D 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
007E 940E0149 CALL push_gset2
(0031) }
(0032)
(0033) /*延时函数*/
(0034) void delay_ms(unsigned char i) {
(0035)
(0036) unsigned char a, b;
(0037) for (a = 1; a < i; a++) {
0080 E041 LDI R20,1
0081 C006 RJMP 0x0088
(0038) for (b = 1; b; b++) {
0082 E061 LDI R22,1
0083 C001 RJMP 0x0085
0084 9563 INC R22
0085 2366 TST R22
0086 F7E9 BNE 0x0084
0087 9543 INC R20
0088 1740 CP R20,R16
0089 F3C0 BCS 0x0082
008A 940E013D CALL pop_gset2
008C 9508 RET
_LCD_write_com:
com --> R20
008D 940E014B CALL push_gset1
008F 2F40 MOV R20,R16
(0039) ;
(0040) }
(0041) }
(0042) }
(0043)
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046)
(0047) RS_CLR;
0090 98AA CBI 0x15,2
(0048) RW_CLR;
0091 98AB CBI 0x15,3
(0049) EN_SET;
0092 9AAC SBI 0x15,4
(0050) PORTA = com;
0093 BB4B OUT 0x1B,R20
(0051) delay_us(5);
0094 E005 LDI R16,5
0095 E010 LDI R17,0
0096 DFDC RCALL _delay_us
(0052) EN_CLR;
0097 98AC CBI 0x15,4
0098 940E014E CALL pop_gset1
009A 9508 RET
_LCD_write_data:
data --> R20
009B 940E014B CALL push_gset1
009D 2F40 MOV R20,R16
(0053) }
(0054)
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057)
(0058) RS_SET;
009E 9AAA SBI 0x15,2
(0059) RW_CLR;
009F 98AB CBI 0x15,3
(0060) EN_SET;
00A0 9AAC SBI 0x15,4
(0061) PORTA = data;
00A1 BB4B OUT 0x1B,R20
(0062) delay_us(5);
00A2 E005 LDI R16,5
00A3 E010 LDI R17,0
00A4 DFCE RCALL _delay_us
(0063) EN_CLR;
00A5 98AC CBI 0x15,4
00A6 940E014E CALL pop_gset1
00A8 9508 RET
(0064) }
(0065)
(0066) /*显示屏清空显示*/
(0067) void LCD_clear(void) {
(0068)
(0069) LCD_write_com(0x01);
_LCD_clear:
00A9 E001 LDI R16,1
00AA DFE2 RCALL _LCD_write_com
(0070) delay_ms(5);
00AB E005 LDI R16,5
00AC DFD1 RCALL _delay_ms
00AD 9508 RET
_LCD_write_str:
s --> R20
y --> R10
x --> R22
00AE 940E0147 CALL push_gset3
00B0 2EA2 MOV R10,R18
00B1 2F60 MOV R22,R16
00B2 814E LDD R20,Y+6
00B3 815F LDD R21,Y+7
(0071) }
(0072)
(0073) /*显示屏字符串写入函数*/
(0074) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0075)
(0076) if (y == 0) {
00B4 20AA TST R10
00B5 F421 BNE 0x00BA
(0077) LCD_write_com(0x80 + x);
00B6 2F06 MOV R16,R22
00B7 5800 SUBI R16,0x80
00B8 DFD4 RCALL _LCD_write_com
(0078) }
00B9 C009 RJMP 0x00C3
(0079) else {
(0080) LCD_write_com(0xC0 + x);
00BA 2F06 MOV R16,R22
00BB 5400 SUBI R16,0x40
00BC DFD0 RCALL _LCD_write_com
(0081) }
00BD C005 RJMP 0x00C3
(0082)
(0083) while (*s) {
(0084) LCD_write_data( *s);
00BE 01FA MOVW R30,R20
00BF 8100 LDD R16,Z+0
00C0 DFDA RCALL _LCD_write_data
(0085) s ++;
00C1 5F4F SUBI R20,0xFF
00C2 4F5F SBCI R21,0xFF
00C3 01FA MOVW R30,R20
00C4 8020 LDD R2,Z+0
00C5 2022 TST R2
00C6 F7B9 BNE 0x00BE
00C7 940E0140 CALL pop_gset3
00C9 9508 RET
_LCD_write_char:
data --> Y+4
y --> R22
x --> R20
00CA 940E0149 CALL push_gset2
00CC 2F62 MOV R22,R18
00CD 2F40 MOV R20,R16
(0086) }
(0087) }
(0088)
(0089) /*显示屏单字符写入函数*/
(0090) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0091)
(0092) if (y == 0) {
00CE 2366 TST R22
00CF F421 BNE 0x00D4
(0093) LCD_write_com(0x80 + x);
00D0 2F04 MOV R16,R20
00D1 5800 SUBI R16,0x80
00D2 DFBA RCALL _LCD_write_com
(0094) }
00D3 C003 RJMP 0x00D7
(0095) else {
(0096) LCD_write_com(0xC0 + x);
00D4 2F04 MOV R16,R20
00D5 5400 SUBI R16,0x40
00D6 DFB6 RCALL _LCD_write_com
(0097) }
(0098)
(0099) LCD_write_data( data);
00D7 810C LDD R16,Y+4
00D8 DFC2 RCALL _LCD_write_data
00D9 940E013D CALL pop_gset2
00DB 9508 RET
(0100) }
(0101)
(0102) /*显示屏初始化函数*/
(0103) void LCD_init(void) {
(0104)
(0105) DDRA = 0xFF; /*I/O口方向设置*/
_LCD_init:
00DC EF8F LDI R24,0xFF
00DD BB8A OUT 0x1A,R24
(0106) DDRC = 0xFF;
00DE BB84 OUT 0x14,R24
(0107) LCD_write_com(0x38); /*显示模式设置*/
00DF E308 LDI R16,0x38
00E0 DFAC RCALL _LCD_write_com
(0108) delay_ms(5);
00E1 E005 LDI R16,5
00E2 DF9B RCALL _delay_ms
(0109) LCD_write_com(0x38);
00E3 E308 LDI R16,0x38
00E4 DFA8 RCALL _LCD_write_com
(0110) delay_ms(5);
00E5 E005 LDI R16,5
00E6 DF97 RCALL _delay_ms
(0111) LCD_write_com(0x38);
00E7 E308 LDI R16,0x38
00E8 DFA4 RCALL _LCD_write_com
(0112) delay_ms(5);
00E9 E005 LDI R16,5
00EA DF93 RCALL _delay_ms
(0113) LCD_write_com(0x38);
00EB E308 LDI R16,0x38
00EC DFA0 RCALL _LCD_write_com
(0114)
(0115) LCD_write_com(0x08); /*显示关闭*/
00ED E008 LDI R16,0x8
00EE DF9E RCALL _LCD_write_com
(0116) LCD_write_com(0x01); /*显示清屏*/
00EF E001 LDI R16,1
00F0 DF9C RCALL _LCD_write_com
(0117) LCD_write_com(0x06); /*显示光标移动设置*/
00F1 E006 LDI R16,6
00F2 DF9A RCALL _LCD_write_com
(0118) delay_ms(5);
00F3 E005 LDI R16,5
00F4 DF89 RCALL _delay_ms
(0119) LCD_write_com(0x0C); /*显示开及光标设置*/
00F5 E00C LDI R16,0xC
00F6 DF96 RCALL _LCD_write_com
00F7 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\017-LCD1602\main.c
(0001) /*
(0002) 实验十七:
(0003) LCD1602显示实验。
(0004) 1、LCD1602显示实验。显示欢迎及网址信息。
(0005) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 3、此实验可以让你学会LCD1602的使用方法。
(0007)
(0008) AVR mega16学习板
(0009) www.iccavr.com
(0010) 23:03 2007-4-13
(0011) */
(0012)
(0013) #include <iom128v.h>
(0014) #include "lcd1602.h"
(0015)
(0016) /*IO口初始化函数*/
(0017) void io_init(void) {
(0018)
(0019) DDRA = 0xFF; /*方向输出*/
_io_init:
00F8 EF8F LDI R24,0xFF
00F9 BB8A OUT 0x1A,R24
(0020) PORTA = 0xFF; /*高电平*/
00FA BB8B OUT 0x1B,R24
(0021) DDRB = 0x00; /*方向输入*/
00FB 2422 CLR R2
00FC BA27 OUT 0x17,R2
(0022) PORTB = 0xFF; /*打开上拉*/
00FD BB88 OUT 0x18,R24
(0023) DDRC = 0xFF; /*不用的IO口建议设置为输入带上拉*/
00FE BB84 OUT 0x14,R24
(0024) PORTC = 0x00;
00FF BA25 OUT 0x15,R2
(0025) DDRD = 0x00;
0100 BA21 OUT 0x11,R2
(0026) PORTD = 0xFF;
0101 BB82 OUT 0x12,R24
(0027) DDRE = 0x00;
0102 B822 OUT 0x02,R2
(0028) PORTE = 0xFF;
0103 B983 OUT 0x03,R24
(0029) DDRF = 0x00;
0104 92200061 STS 0x61,R2
(0030) PORTF = 0xFF;
0106 93800062 STS 0x62,R24
(0031) DDRG = 0x00;
0108 92200064 STS 0x64,R2
(0032) PORTG = 0xFF;
010A 93800065 STS 0x65,R24
010C 9508 RET
_main:
i --> R20
p --> R22
010D 9722 SBIW R28,2
(0033) }
(0034)
(0035) void main(void) {
(0036)
(0037) unsigned char i;
(0038) unsigned char *p;
(0039)
(0040) io_init(); /*初始化IO口*/
010E DFE9 RCALL _io_init
(0041) delay_ms(100);
010F E604 LDI R16,0x64
0110 940E007E CALL _delay_ms
(0042) LCD_init(); /*显示初始化*/
0112 940E00DC CALL _LCD_init
0114 C025 RJMP 0x013A
(0043)
(0044) while (1) {
(0045) i = 1;
0115 E041 LDI R20,1
(0046) p = "www.iccavr.com"; /*定义字符串指针*/
0116 E068 LDI R22,0x8
0117 E071 LDI R23,1
(0047) LCD_clear(); /*清除显示屏内容*/
0118 940E00A9 CALL _LCD_clear
(0048) LCD_write_str(5,0,"Welcome"); /*在指定位置显示欢迎信息*/
011A E080 LDI R24,0
011B E091 LDI R25,1
011C 8399 STD Y+1,R25
011D 8388 STD Y+0,R24
011E 2722 CLR R18
011F E005 LDI R16,5
0120 940E00AE CALL _LCD_write_str
(0049) delay_ms(250);
0122 EF0A LDI R16,0xFA
0123 940E007E CALL _delay_ms
0125 C00D RJMP 0x0133
(0050)
(0051) while (*p) {
(0052) LCD_write_char(i,1,*p); /*按位显示网址信息*/
0126 01FB MOVW R30,R22
0127 8020 LDD R2,Z+0
0128 8228 STD Y+0,R2
0129 E021 LDI R18,1
012A 2F04 MOV R16,R20
012B 940E00CA CALL _LCD_write_char
(0053) i ++;
012D 9543 INC R20
(0054) p ++;
012E 5F6F SUBI R22,0xFF
012F 4F7F SBCI R23,0xFF
(0055) delay_ms(250);
0130 EF0A LDI R16,0xFA
0131 940E007E CALL _delay_ms
0133 01FB MOVW R30,R22
0134 8020 LDD R2,Z+0
0135 2022 TST R2
0136 F779 BNE 0x0126
(0056) }
(0057) delay_ms(250);
FILE: <library>
0137 EF0A LDI R16,0xFA
0138 940E007E CALL _delay_ms
013A CFDA RJMP 0x0115
013B 9622 ADIW R28,2
013C 9508 RET
pop_gset2:
013D E0E2 LDI R30,2
013E 940C014F JMP pop
pop_gset3:
0140 E0E4 LDI R30,4
0141 940C014F JMP pop
push_gset5:
0143 92FA ST R15,-Y
0144 92EA ST R14,-Y
push_gset4:
0145 92DA ST R13,-Y
0146 92CA ST R12,-Y
push_gset3:
0147 92BA ST R11,-Y
0148 92AA ST R10,-Y
push_gset2:
0149 937A ST R23,-Y
014A 936A ST R22,-Y
push_gset1:
014B 935A ST R21,-Y
014C 934A ST R20,-Y
014D 9508 RET
pop_gset1:
014E E0E1 LDI R30,1
pop:
014F 9149 LD R20,Y+
0150 9159 LD R21,Y+
0151 FDE0 SBRC R30,0
0152 9508 RET
0153 9169 LD R22,Y+
0154 9179 LD R23,Y+
0155 FDE1 SBRC R30,1
0156 9508 RET
0157 90A9 LD R10,Y+
0158 90B9 LD R11,Y+
0159 FDE2 SBRC R30,2
015A 9508 RET
015B 90C9 LD R12,Y+
015C 90D9 LD R13,Y+
015D FDE3 SBRC R30,3
015E 9508 RET
015F 90E9 LD R14,Y+
0160 90F9 LD R15,Y+
0161 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -