⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.lst

📁 24IIC的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
     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 + -