📄 test.lst
字号:
(0116)
(0117) re_exit://出错退出
(0118) Stop();
128 E984 LDI R24,0x94
129 BF86 OUT 0x36,R24
(0119) _SEI();
12A 9478 BSET 7
(0120) return 0;
12B 2700 CLR R16
12C 9622 ADIW R28,2
12D 90A9 LD R10,Y+
12E 9508 RET
FILE: D:\iccavr\mega16\11\24CXX\lcd1602.h
(0001) /*-------------------------------------------
(0002) RS----------PC2
(0003) RW----------GND
(0004) EN----------PC3
(0005) D4-D7-------PC4-PC7
(0006) ---------------------------------------------*/
(0007) //定义MCU与LCD的接口
(0008) #define LCD_EN_PORT PORTC
(0009) #define LCD_EN_DDR DDRC
(0010) #define LCD_RS_PORT PORTC
(0011) #define LCD_RS_DDR DDRC
(0012) #define LCD_DATA_PORT PORTC
(0013) #define LCD_DATA_DDR DDRC
(0014) #define LCD_DATA_PIN PINC
(0015) #define LCD_EN 0x08 //portc3 out
(0016) #define LCD_RS 0x04 //portc2 out
(0017) #define LCD_DATA 0xf0 //portc4/5/6/7 out
(0018)
(0019) /*----------------------------------------------------------
(0020) Public function prototypes
(0021) ----------------------------------------------------------*/
(0022) void LCD_init(void);
(0023) void LCD_en_write(void);
(0024) void clear(void);
(0025) void LCD_write_char(unsigned command,unsigned data);
(0026) void LCD_set_xy(unsigned char x, unsigned char y);
(0027) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0028) void LCD_write_data(unsigned char X,unsigned char Y,int dat);
(0029)
(0030) /*------------------------------------------------------------
(0031) 函数: lcd1602口线初始化和液晶初始化
(0032) -------------------------------------------------------------*/
(0033) void LCD_init(void) //液晶初始化
(0034) {
(0035) LCD_DATA_DDR|=LCD_DATA;
_LCD_init:
12F B384 IN R24,0x14
130 6F80 ORI R24,0xF0
131 BB84 OUT 0x14,R24
(0036) LCD_EN_DDR|=LCD_EN;
132 9AA3 SBI 0x14,3
(0037) LCD_RS_DDR|=LCD_RS;
133 9AA2 SBI 0x14,2
(0038) delay_ms(15);
134 E00F LDI R16,0xF
135 E010 LDI R17,0
136 DF6B RCALL _delay_ms
(0039) LCD_write_char(0x28,0); //4位显示
137 2722 CLR R18
138 2733 CLR R19
139 E208 LDI R16,0x28
13A E010 LDI R17,0
13B D028 RCALL _LCD_write_char
(0040) delay_ms(15);
13C E00F LDI R16,0xF
13D E010 LDI R17,0
13E DF63 RCALL _delay_ms
(0041) LCD_write_char(0x0c,0); //显示开
13F 2722 CLR R18
140 2733 CLR R19
141 E00C LDI R16,0xC
142 E010 LDI R17,0
143 D020 RCALL _LCD_write_char
(0042) delay_ms(15);
144 E00F LDI R16,0xF
145 E010 LDI R17,0
146 DF5B RCALL _delay_ms
(0043) LCD_write_char(0x01,0); //清屏
147 2722 CLR R18
148 2733 CLR R19
149 E001 LDI R16,1
14A E010 LDI R17,0
14B D018 RCALL _LCD_write_char
(0044) clear();
14C D04E RCALL _clear
14D 9508 RET
_LCD_set_xy:
address0 --> R20
y --> R10
x --> R22
14E D141 RCALL push_xgsetF00C
14F 2EA2 MOV R10,R18
150 2F60 MOV R22,R16
(0045) }
(0046)
(0047) /*------------------------------------------------------------
(0048) 函数: 设置显示地址
(0049) para: x---the display address of a line limit: 0---15
(0050) y---the display line limit 0 or 1
(0051) --------------------------------------------------------------*/
(0052) void LCD_set_xy(unsigned char x, unsigned char y) //写地址函数
(0053) {
(0054) unsigned char address;
(0055) if(y ==0)
151 20AA TST R10
152 F419 BNE 0x0156
(0056) address=0x80+x; //the first line
153 2F46 MOV R20,R22
154 5840 SUBI R20,0x80
155 C002 RJMP 0x0158
(0057) else
(0058) address=0xc0+x; //the second line
156 2F46 MOV R20,R22
157 5440 SUBI R20,0x40
(0059) LCD_write_char(address,0);
158 2722 CLR R18
159 2733 CLR R19
15A 2F04 MOV R16,R20
15B 2711 CLR R17
15C D007 RCALL _LCD_write_char
15D C137 RJMP pop_xgsetF00C
(0060) }
(0061) /*-------------------------------------------------------------
(0062) 函数: lcd1602使能
(0063) *--------------------------------------------------------------*/
(0064) void LCD_en_write(void) //液晶使能
(0065) {
(0066) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
15E 9AAB SBI 0x15,3
(0067) delay_us(5);
15F E005 LDI R16,5
160 E010 LDI R17,0
161 DF27 RCALL _delay_us
(0068) LCD_EN_PORT&=~LCD_EN;
162 98AB CBI 0x15,3
163 9508 RET
_LCD_write_char:
data_temp0 --> R22
command_temp0 --> R20
data --> R12
command --> R10
164 D143 RCALL push_xgsetF03C
165 0169 MOVW R12,R18
166 0158 MOVW R10,R16
(0069) }
(0070) /*------------------------------------------------------------
(0071) 函数: 写命令或数据到lcd1602
(0072) 参数:command: 0---写数据, 1---写命令
(0073) data: 所要写的命令或数据
(0074) *-------------------------------------------------------------*/
(0075) void LCD_write_char(unsigned command,unsigned data)
(0076) {
(0077) unsigned command_temp,data_temp;
(0078) command_temp=command;
167 01A5 MOVW R20,R10
(0079) data_temp=data;
168 01B6 MOVW R22,R12
(0080) delay_us(25);
169 E109 LDI R16,0x19
16A E010 LDI R17,0
16B DF1D RCALL _delay_us
(0081) if(command==0)
16C 3040 CPI R20,0
16D 0745 CPC R20,R21
16E F4C1 BNE 0x0187
(0082) {
(0083) LCD_RS_PORT|=LCD_RS; //RS=1
16F 9AAA SBI 0x15,2
(0084) LCD_DATA_PORT&=0X0f;
170 B385 IN R24,0x15
171 708F ANDI R24,0xF
172 BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
173 01CB MOVW R24,R22
174 940E 02D6 CALL 0x02D6
(0086) LCD_en_write();
176 DFE7 RCALL _LCD_en_write
(0087) data_temp=data_temp<<4;
177 0F66 LSL R22
178 1F77 ROL R23
179 0F66 LSL R22
17A 1F77 ROL R23
17B 0F66 LSL R22
17C 1F77 ROL R23
17D 0F66 LSL R22
17E 1F77 ROL R23
(0088) LCD_DATA_PORT&=0X0f;
17F B385 IN R24,0x15
180 708F ANDI R24,0xF
181 BB85 OUT 0x15,R24
(0089) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
182 01CB MOVW R24,R22
183 940E 02D6 CALL 0x02D6
(0090) LCD_en_write();
185 DFD8 RCALL _LCD_en_write
(0091) }
186 C013 RJMP 0x019A
(0092) else
(0093) {
(0094) LCD_RS_PORT&=~LCD_RS; //RS=0
187 98AA CBI 0x15,2
(0095) LCD_DATA_PORT&=0X0f;
188 B385 IN R24,0x15
189 708F ANDI R24,0xF
18A BB85 OUT 0x15,R24
(0096) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
18B 01CA MOVW R24,R20
18C 940E 02D6 CALL 0x02D6
(0097) LCD_en_write();
18E DFCF RCALL _LCD_en_write
18F 940E 02ED CALL 0x02ED
191 940E 02ED CALL 0x02ED
(0098) command_temp=command_temp<<4;
(0099) LCD_DATA_PORT&=0x0f;
193 B385 IN R24,0x15
194 708F ANDI R24,0xF
195 BB85 OUT 0x15,R24
(0100) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
196 01CA MOVW R24,R20
197 940E 02D6 CALL 0x02D6
(0101) LCD_en_write();
199 DFC4 RCALL _LCD_en_write
(0102) }
19A C114 RJMP pop_xgsetF03C
_clear:
i2 --> R20
i0 --> R20
19B 934A ST R20,-Y
(0103) }
(0104) /*-------------------------------------------------------------
(0105) 函数: 清屏lcd1602
(0106) ---------------------------------------------------------------*/
(0107) void clear(void)
(0108) {
(0109) unsigned char i;
(0110) LCD_set_xy(0,0);
19C 2722 CLR R18
19D 2700 CLR R16
19E DFAF RCALL _LCD_set_xy
(0111) for(i=0;i<16;i++)
19F 2744 CLR R20
1A0 C004 RJMP 0x01A5
(0112) LCD_write_char(0,' ');
1A1 940E 0301 CALL 0x0301
1A3 DFC0 RCALL _LCD_write_char
1A4 9543 INC R20
1A5 3140 CPI R20,0x10
1A6 F3D0 BCS 0x01A1
(0113) LCD_set_xy(0,1);
1A7 E021 LDI R18,1
1A8 2700 CLR R16
1A9 DFA4 RCALL _LCD_set_xy
(0114) for(i=0;i<16;i++)
1AA 2744 CLR R20
1AB C004 RJMP 0x01B0
(0115) LCD_write_char(0,' ');
1AC 940E 0301 CALL 0x0301
1AE DFB5 RCALL _LCD_write_char
1AF 9543 INC R20
1B0 3140 CPI R20,0x10
1B1 F3D0 BCS 0x01AC
1B2 9149 LD R20,Y+
1B3 9508 RET
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
1B4 D0E7 RCALL push_xgset303C
1B5 2EC2 MOV R12,R18
1B6 2EA0 MOV R10,R16
1B7 814E LDD R20,Y+6
1B8 815F LDD R21,Y+7
(0116) }
(0117) /*-------------------------------------------------------------
(0118) 函数: 写字符串
(0119) 参数:列---X=0~15,行---Y=0~1 写地址
(0120) s为所要写的字符串
(0121) ---------------------------------------------------------------*/
(0122) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0123) {
(0124) LCD_set_xy(X,Y);
1B9 2D2C MOV R18,R12
1BA 2D0A MOV R16,R10
1BB DF92 RCALL _LCD_set_xy
1BC C006 RJMP 0x01C3
(0125) while(*s)
(0126) {
(0127) LCD_write_char(0,*s);
1BD 01FA MOVW R30,R20
1BE 940E 02FC CALL 0x02FC
1C0 DFA3 RCALL _LCD_write_char
(0128) s++;
1C1 5F4F SUBI R20,0xFF
1C2 4F5F SBCI R21,0xFF
1C3 01FA MOVW R30,R20
1C4 8020 LDD R2,Z+0
1C5 2022 TST R2
1C6 F7B1 BNE 0x01BD
1C7 C0DB RJMP pop_xgset303C
_LCD_write_data:
data --> Y,+0
i0 --> R20
Y --> R12
X --> R10
1C8 D0BE RCALL push_xgset30FC
1C9 2EC2 MOV R12,R18
1CA 2EA0 MOV R10,R16
1CB 9724 SBIW R28,4
1CC 84EC LDD R14,Y+12
1CD 84FD LDD R15,Y+13
(0129) }
(0130) }
(0131)
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135) dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139) //unsigned char fuhao;
(0140) unsigned char data[4];
(0141) unsigned char i;
(0142)
(0143) /*if(dat<0)
(0144) {
(0145) fuhao='-';
(0146) dat=0-dat;
(0147) }
(0148) else
(0149) fuhao=' ';
(0150) data[0]=fuhao;*/
(0151) data[0]=dat/1000+0x30; dat%=1000;
1CE EE28 LDI R18,0xE8
1CF E033 LDI R19,3
1D0 0187 MOVW R16,R14
1D1 D078 RCALL div16s
1D2 01C8 MOVW R24,R16
1D3 96C0 ADIW R24,0x30
1D4 8388 STD Y+0,R24
1D5 EE28 LDI R18,0xE8
1D6 E033 LDI R19,3
1D7 0187 MOVW R16,R14
1D8 D06D RCALL mod16s
1D9 0178 MOVW R14,R16
(0152) data[1]=dat/100+0x30; dat%=100;
1DA E624 LDI R18,0x64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -