📄 test.lst
字号:
175 DF0D RCALL _delay_ms
(0106) num=i;
176 8EA8 STD Y+24,R10
(0107) P_data=p;
177 8ADF STD Y+23,R13
178 8ACE STD Y+22,R12
(0108) next_page_start_addr+=page_size;
179 802C LDD R2,Y+4
17A 2433 CLR R3
17B 940E 03AF CALL 0x03AF
17D 940E 03B6 CALL 0x03B6
(0109) if(addr==model*128)
17F E800 LDI R16,0x80
180 E010 LDI R17,0
181 8928 LDD R18,Y+16
182 8939 LDD R19,Y+17
183 D1A4 RCALL empy16s
184 880C LDD R0,Y+20
185 881D LDD R1,Y+21
186 1600 CP R0,R16
187 0611 CPC R1,R17
188 F009 BEQ 0x018A
189 CF90 RJMP 0x011A
(0110) {
(0111) addr=0;
18A 2400 CLR R0
18B 2411 CLR R1
18C 8A1D STD Y+21,R1
18D 8A0C STD Y+20,R0
18E 940E 03C8 CALL 0x03C8
(0112) next_page_start_addr=page_size;
190 8228 STD Y+0,R2
191 8239 STD Y+1,R3
192 824A STD Y+2,R4
193 825B STD Y+3,R5
(0113) }
(0114) goto Wagain;
194 CF85 RJMP 0x011A
(0115) }
(0116) return ICerror;
195 810D LDD R16,Y+5
196 9626 ADIW R28,6
197 D1A3 RCALL pop_xgsetF0FC
198 9624 ADIW R28,4
199 9508 RET
_AT24CxxRead:
temp --> R12
ICerror --> R20
p --> R22
num --> R10
P_data --> Y,+17
addr --> Y,+15
DevAddr --> R12
model --> R14
19A D1A5 RCALL push_xgsetF0FC
19B 2EC2 MOV R12,R18
19C 0178 MOVW R14,R16
19D 9725 SBIW R28,5
19E 88AB LDD R10,Y+19
(0117) }
(0118)
(0119) //读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
(0120) unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
(0121) {
(0122) unsigned char temp,*p,ICerror;
(0123) p=P_data;
19F 8969 LDD R22,Y+17
1A0 897A LDD R23,Y+18
(0124) ICerror=AT24CxxWrite(model,DevAddr,addr,0,0);
1A1 2422 CLR R2
1A2 822C STD Y+4,R2
1A3 2433 CLR R3
1A4 823B STD Y+3,R3
1A5 822A STD Y+2,R2
1A6 840F LDD R0,Y+15
1A7 8818 LDD R1,Y+16
1A8 8219 STD Y+1,R1
1A9 8208 STD Y+0,R0
1AA 2D2C MOV R18,R12
1AB 0187 MOVW R16,R14
1AC DF0A RCALL _AT24CxxWrite
1AD 2F40 MOV R20,R16
(0125) temp=0xa0+(DevAddr<<1);
1AE 2D8C MOV R24,R12
1AF 0F88 LSL R24
1B0 5680 SUBI R24,0x60
1B1 2EC8 MOV R12,R24
(0126) if(model<16)
1B2 01C7 MOVW R24,R14
1B3 3180 CPI R24,0x10
1B4 E0E0 LDI R30,0
1B5 079E CPC R25,R30
1B6 F468 BCC 0x01C4
(0127) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
1B7 E027 LDI R18,7
1B8 E030 LDI R19,0
1B9 850F LDD R16,Y+15
1BA 8918 LDD R17,Y+16
1BB D1C1 RCALL lsr16
1BC 01C8 MOVW R24,R16
1BD 708E ANDI R24,0xE
1BE 7090 ANDI R25,0
1BF 2C2C MOV R2,R12
1C0 2433 CLR R3
1C1 0E28 ADD R2,R24
1C2 1E39 ADC R3,R25
1C3 2CC2 MOV R12,R2
(0128) Ragain2:
(0129) if(ICerror<10)
1C4 304A CPI R20,0xA
1C5 F4A0 BCC 0x01DA
(0130) ICerror++;
1C6 9543 INC R20
(0131) else
(0132) goto Rstop;
(0133) twi_start(); //
1C7 DECA RCALL _twi_start
(0134) if(twi_writebyte(temp|1)==0)
1C8 2D0C MOV R16,R12
1C9 6001 ORI R16,1
1CA DECF RCALL _twi_writebyte
1CB 2300 TST R16
1CC F431 BNE 0x01D3
(0135) goto Ragain2;
1CD CFF6 RJMP 0x01C4
(0136) while(num--)
(0137) {
(0138) twi_readbyte(p,num);
1CE 2D2A MOV R18,R10
1CF 018B MOVW R16,R22
1D0 DED5 RCALL _twi_readbyte
(0139) p++;
1D1 5F6F SUBI R22,0xFF
1D2 4F7F SBCI R23,0xFF
1D3 2CCA MOV R12,R10
1D4 24DD CLR R13
1D5 2D8C MOV R24,R12
1D6 5081 SUBI R24,1
1D7 2EA8 MOV R10,R24
1D8 20CC TST R12
1D9 F7A1 BNE 0x01CE
(0140) }
(0141) Rstop:
(0142) Stop();
1DA E984 LDI R24,0x94
1DB BF86 OUT 0x36,R24
(0143) return(ICerror);
1DC 2F04 MOV R16,R20
1DD 9625 ADIW R28,5
1DE C15C RJMP pop_xgsetF0FC
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\24c64\连续读写\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:
1DF B384 IN R24,0x14
1E0 6F80 ORI R24,0xF0
1E1 BB84 OUT 0x14,R24
(0036) LCD_EN_DDR|=LCD_EN;
1E2 9AA3 SBI 0x14,3
(0037) LCD_RS_DDR|=LCD_RS;
1E3 9AA2 SBI 0x14,2
(0038) delay_ms(15);
1E4 E00F LDI R16,0xF
1E5 E010 LDI R17,0
1E6 DE9C RCALL _delay_ms
(0039) LCD_write_char(0x28,0); //4位显示
1E7 2722 CLR R18
1E8 2733 CLR R19
1E9 E208 LDI R16,0x28
1EA E010 LDI R17,0
1EB D028 RCALL _LCD_write_char
(0040) delay_ms(15);
1EC E00F LDI R16,0xF
1ED E010 LDI R17,0
1EE DE94 RCALL _delay_ms
(0041) LCD_write_char(0x0c,0); //显示开
1EF 2722 CLR R18
1F0 2733 CLR R19
1F1 E00C LDI R16,0xC
1F2 E010 LDI R17,0
1F3 D020 RCALL _LCD_write_char
(0042) delay_ms(15);
1F4 E00F LDI R16,0xF
1F5 E010 LDI R17,0
1F6 DE8C RCALL _delay_ms
(0043) LCD_write_char(0x01,0); //清屏
1F7 2722 CLR R18
1F8 2733 CLR R19
1F9 E001 LDI R16,1
1FA E010 LDI R17,0
1FB D018 RCALL _LCD_write_char
(0044) clear();
1FC D04E RCALL _clear
1FD 9508 RET
_LCD_set_xy:
address --> R20
y --> R10
x --> R22
1FE D14C RCALL push_xgsetF00C
1FF 2EA2 MOV R10,R18
200 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)
201 20AA TST R10
202 F419 BNE 0x0206
(0056) address=0x80+x; //the first line
203 2F46 MOV R20,R22
204 5840 SUBI R20,0x80
205 C002 RJMP 0x0208
(0057) else
(0058) address=0xc0+x; //the second line
206 2F46 MOV R20,R22
207 5440 SUBI R20,0x40
(0059) LCD_write_char(address,0);
208 2722 CLR R18
209 2733 CLR R19
20A 2F04 MOV R16,R20
20B 2711 CLR R17
20C D007 RCALL _LCD_write_char
20D C142 RJMP pop_xgsetF00C
(0060) }
(0061) /*-------------------------------------------------------------
(0062) 函数: lcd1602使能
(0063) *--------------------------------------------------------------*/
(0064) void LCD_en_write(void) //液晶使能
(0065) {
(0066) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
20E 9AAB SBI 0x15,3
(0067) delay_us(5);
20F E005 LDI R16,5
210 E010 LDI R17,0
211 DE58 RCALL _delay_us
(0068) LCD_EN_PORT&=~LCD_EN;
212 98AB CBI 0x15,3
213 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
214 D14E RCALL push_xgsetF03C
215 0169 MOVW R12,R18
216 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;
217 01A5 MOVW R20,R10
(0079) data_temp=data;
218 01B6 MOVW R22,R12
(0080) delay_us(25);
219 E109 LDI R16,0x19
21A E010 LDI R17,0
21B DE4E RCALL _delay_us
(0081) if(command==0)
21C 3040 CPI R20,0
21D 0745 CPC R20,R21
21E F4C1 BNE 0x0237
(0082) {
(0083) LCD_RS_PORT|=LCD_RS; //RS=1
21F 9AAA SBI 0x15,2
(0084) LCD_DATA_PORT&=0X0f;
220 B385 IN R24,0x15
221 708F ANDI R24,0xF
222 BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
223 01CB MOVW R24,R22
224 940E 039D CALL <created procedures>
(0086) LCD_en_write();
226 DFE7 RCALL _LCD_en_write
(0087) data_temp=data_temp<<4;
227 0F66 LSL R22
228 1F77 ROL R23
229 0F66 LSL R22
22A 1F77 ROL R23
22B 0F66 LSL R22
22C 1F77 ROL R23
22D 0F66 LSL R22
22E 1F77 ROL R23
(0088) LCD_DATA_PORT&=0X0f;
22F B385 IN R24,0x15
230 708F ANDI R24,0xF
231 BB85 OUT 0x15,R24
(0089) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
232 01CB MOVW R24,R22
233 940E 039D CALL <created procedures>
(0090) LCD_en_write();
235 DFD8 RCALL _LCD_en_write
(0091) }
236 C013 RJMP 0x024A
(0092) else
(0093) {
(0094) LCD_RS_PORT&=~LCD_RS; //RS=0
237 98AA CBI 0x15,2
(0095) LCD_DATA_PORT&=0X0f;
238 B385 IN R24,0x15
239 708F ANDI R24,0xF
23A BB85 OUT 0x15,R24
(0096) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
23B 01CA MOVW R24,R20
23C 940E 039D CALL <created procedures>
(0097) LCD_en_write();
23E DFCF RCALL _LCD_en_write
23F 940E 03DF CALL 0x03DF
241 940E 03DF CALL 0x03DF
(0098) command_temp=command_temp<<4;
(0099) LCD_DATA_PORT&=0x0f;
243 B385 IN R24,0x15
244 708F ANDI R24,0xF
245 BB85 OUT 0x15,R24
(0100) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
246 01CA MOVW R24,R20
247 940E 039D CALL <created procedures>
(0101) LCD_en_write();
249 DFC4 RCALL _LCD_en_write
(0102) }
24A C11F RJMP pop_xgsetF03C
_clear:
i --> R20
24B 934A ST R20,-Y
(0103) }
(0104) /*-------------------------------------------------------------
(0105) 函数: 清屏lcd1602
(0106) ---------------------------------------------------------------*/
(0107) void clear(void)
(0108) {
(0109) unsigned char i;
(0110) LCD_set_xy(0,0);
24C 2722 CLR R18
24D 2700 CLR R16
24E DFAF RCALL _LCD_set_xy
(0111) for(i=0;i<16;i++)
24F 2744 CLR R20
250 C004 RJMP 0x0255
(0112) LCD_write_char(0,' ');
251 940E 03FE CALL 0x03FE
253 DFC0 RCALL _LCD_write_char
254 9543 INC R20
255 3140 CPI R20,0x10
256 F3D0 BCS 0x0251
(0113) LCD_set_xy(0,1);
257 E021 LDI R18,1
258 2700 CLR R16
259 DFA4 RCALL _LCD_set_xy
(0114) for(i=0;i<16;i++)
25A 2744 CLR R20
25B C004 RJMP 0x0260
(0115) LCD_write_char(0,' ');
25C 940E 03FE CALL 0x03FE
25E DFB5 RCALL _LCD_write_char
25F 9543 INC R20
260 3140 CPI R20,0x10
261 F3D0 BCS 0x025C
262 9149 LD R20,Y+
263 9508 RET
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
264 D0F2 RCALL push_xgset303C
265 2EC2 MOV R12,R18
266 2EA0 MOV R10,R16
267 814E LDD R20,Y+6
268 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);
269 2D2C MOV R18,R12
26A 2D0A MOV R16,R10
26B DF92 RCALL _LCD_set_xy
26C C006 RJMP 0x0273
(0125) while(*s)
(0126) {
(0127) LCD_write_char(0,*s);
26D 01FA MOVW R30,R20
26E 940E 0403 CALL 0x0403
270 DFA3 RCALL _LCD_write_char
(0128) s++;
271 5F4F SUBI R20,0xFF
272 4F5F SBCI R21,0xFF
273 01FA MOVW R30,R20
274 8020 LDD R2,Z+0
275 2022 TST R2
276 F7B1 BNE 0x026D
277 C0E6 RJMP pop_xgset303C
_LCD_write_data:
data --> Y,+0
i --> R20
dat --> R14
Y --> R12
X --> R10
278 D0C9 RCALL push_xgset30FC
279 2EC2 MOV R12,R18
27A 2EA0 MOV R10,R16
27B 9724 SBIW R28,4
27C 84EC LDD R14,Y+12
27D 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -