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

📄 24c01.lst

📁 通过MEGA128的串口对I2C芯片24c01的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    0065 EFCF      LDI	R28,0xFF
    0066 E1D0      LDI	R29,0x10
    0067 BFCD      OUT	0x3D,R28
    0068 BFDE      OUT	0x3E,R29
    0069 51C0      SUBI	R28,0x10
    006A 40D0      SBCI	R29,0
    006B EA0A      LDI	R16,0xAA
    006C 8308      STD	Y+0,R16
    006D 2400      CLR	R0
    006E E3ED      LDI	R30,0x3D
    006F E0F1      LDI	R31,1
    0070 E012      LDI	R17,2
    0071 30EE      CPI	R30,0xE
    0072 07F1      CPC	R31,R17
    0073 F011      BEQ	0x0076
    0074 9201      ST	R0,Z+
    0075 CFFB      RJMP	0x0071
    0076 8300      STD	Z+0,R16
    0077 E8EC      LDI	R30,0x8C
    0078 E0F0      LDI	R31,0
    0079 E0A0      LDI	R26,0
    007A E0B1      LDI	R27,1
    007B E010      LDI	R17,0
    007C 3CE9      CPI	R30,0xC9
    007D 07F1      CPC	R31,R17
    007E F021      BEQ	0x0083
    007F 95C8      LPM
    0080 9631      ADIW	R30,1
    0081 920D      ST	R0,X+
    0082 CFF9      RJMP	0x007C
    0083 940E0086  CALL	_main
_exit:
    0085 CFFF      RJMP	_exit
_main:
  i                    --> R10
  W_Buff               --> R22
  R_Buff               --> R20
    0086 9722      SBIW	R28,2
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART_24C01\source\main.c
(0001) /************************************************
(0002) 文件:main.c
(0003) 用途:
(0004) 注意:内部8M晶振
(0005) 创建:2008.4.1
(0006) 修改:2008.4.1
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) 
(0010) #include "config.h"
(0011) 
(0012) void main(void)
(0013) {
(0014)      unsigned char *W_Buff="www.avrvi.com",*R_Buff="0",i=0;
    0087 E26F      LDI	R22,0x2F
    0088 E071      LDI	R23,1
    0089 E24D      LDI	R20,0x2D
    008A E051      LDI	R21,1
    008B 24AA      CLR	R10
(0015) 	 
(0016) 	 CLI();
    008C 94F8      BCLR	7
(0017) 	 Com_init();
    008D 940E0205  CALL	_Com_init
(0018) 	 twi_init();
    008F 940E00D2  CALL	_twi_init
(0019) 	 SEI();	 
    0091 9478      BSET	7
(0020) 	  		 Com_putstring ("24C01 Write: www.avrvi.com\n\n",28,&RTbuf_UART0);
    0092 E38E      LDI	R24,0x3E
    0093 E091      LDI	R25,1
    0094 8399      STD	Y+1,R25
    0095 8388      STD	Y+0,R24
    0096 E12C      LDI	R18,0x1C
    0097 E100      LDI	R16,0x10
    0098 E011      LDI	R17,1
    0099 940E0257  CALL	_Com_putstring
(0021)  	  		 wt24c(W_Buff,0x00,13);
    009B E08D      LDI	R24,0xD
    009C E090      LDI	R25,0
    009D 8399      STD	Y+1,R25
    009E 8388      STD	Y+0,R24
    009F 2722      CLR	R18
    00A0 2733      CLR	R19
    00A1 018B      MOVW	R16,R22
    00A2 940E0132  CALL	_wt24c
(0022)  	  		 delay_nms(500);
    00A4 EF04      LDI	R16,0xF4
    00A5 E011      LDI	R17,1
    00A6 940E01F6  CALL	_delay_nms
(0023)  	  		 Com_putstring ("24C01 Read: ",12,&RTbuf_UART0);
    00A8 E38E      LDI	R24,0x3E
    00A9 E091      LDI	R25,1
    00AA 8399      STD	Y+1,R25
    00AB 8388      STD	Y+0,R24
    00AC E02C      LDI	R18,0xC
    00AD E003      LDI	R16,3
    00AE E011      LDI	R17,1
    00AF 940E0257  CALL	_Com_putstring
(0024)  	  		 rd24c(R_Buff,0x00,13);
    00B1 E08D      LDI	R24,0xD
    00B2 E090      LDI	R25,0
    00B3 8399      STD	Y+1,R25
    00B4 8388      STD	Y+0,R24
    00B5 2722      CLR	R18
    00B6 2733      CLR	R19
    00B7 018A      MOVW	R16,R20
    00B8 940E01AA  CALL	_rd24c
(0025)  	  		 Com_putstring (R_Buff,13,&RTbuf_UART0);
    00BA E38E      LDI	R24,0x3E
    00BB E091      LDI	R25,1
    00BC 8399      STD	Y+1,R25
    00BD 8388      STD	Y+0,R24
    00BE E02D      LDI	R18,0xD
    00BF 018A      MOVW	R16,R20
    00C0 940E0257  CALL	_Com_putstring
(0026)  	  		 Com_putstring ("\n\n",2,&RTbuf_UART0);
    00C2 E38E      LDI	R24,0x3E
    00C3 E091      LDI	R25,1
    00C4 8399      STD	Y+1,R25
    00C5 8388      STD	Y+0,R24
    00C6 E022      LDI	R18,2
    00C7 E000      LDI	R16,0
    00C8 E011      LDI	R17,1
    00C9 940E0257  CALL	_Com_putstring
(0027)  	  		 delay_nms(500);
    00CB EF04      LDI	R16,0xF4
    00CC E011      LDI	R17,1
    00CD 940E01F6  CALL	_delay_nms
(0028) 	 while(1)
    00CF CFFF      RJMP	0x00CF
    00D0 9622      ADIW	R28,2
    00D1 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART_24C01\source\lib\TWI.c
(0001) /************************************************
(0002) 文件:TWI.c
(0003) 用途:TWI操作函数
(0004) 注意:
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) /*************************************************************************
(0011) ** 函数名称: twi_init(void)
(0012) ** 功能描述: i2c通信初始化
(0013) ** 输 入: 
(0014) ** 输出	 : 
(0015) ** 全局变量: 无
(0016) ** 调用模块: 
(0017) ** 说明:
(0018) ** 注意:
(0019) **************************************************************************/
(0020) void twi_init(void)
(0021) {
(0022)  TWCR= 0x00; //disable twi
_twi_init:
    00D2 2422      CLR	R2
    00D3 92200074  STS	0x74,R2
(0023)  TWBR= (1<<6) | (1<<5) | (1<<2); //set bit rate
    00D5 E684      LDI	R24,0x64
    00D6 93800070  STS	0x70,R24
(0024)  TWSR= 0x00; //set prescale
    00D8 92200071  STS	0x71,R2
(0025)  TWAR= 0x00; //set slave address
    00DA 92200072  STS	0x72,R2
(0026)  TWCR= (1<<TWEN); //enable twi
    00DC E084      LDI	R24,4
    00DD 93800074  STS	0x74,R24
    00DF 9508      RET
(0027) }
(0028) /*************************************************************************
(0029) ** 函数名称: i2cstart(void)
(0030) ** 功能描述: i2c通信开始
(0031) ** 输 入: 
(0032) ** 输出	 : 
(0033) ** 全局变量: 无
(0034) ** 调用模块: 
(0035) ** 说明:
(0036) ** 注意:
(0037) **************************************************************************/
(0038) void i2cstart(void)
(0039) { 
(0040) 	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); 
_i2cstart:
    00E0 EA84      LDI	R24,0xA4
    00E1 93800074  STS	0x74,R24
(0041)    	while (!(TWCR & (1<<TWINT)));
    00E3 90200074  LDS	R2,0x74
    00E5 FE27      SBRS	R2,7
    00E6 CFFC      RJMP	0x00E3
    00E7 9508      RET
(0042) }
(0043) /*************************************************************************
(0044) ** 函数名称: unsigned char i2cwt(unsigned char data)
(0045) ** 功能描述: i2c写数据,返回TWI状态
(0046) ** 输 入: 
(0047) ** 输  出: TWI状态
(0048) ** 全局变量: 无
(0049) ** 调用模块: 
(0050) ** 说明:
(0051) ** 注意:
(0052) **************************************************************************/
(0053) unsigned char i2cwt(unsigned char data)
(0054) { 
(0055) 	TWDR = data;
_i2cwt:
  data                 --> R16
    00E8 93000073  STS	0x73,R16
(0056)    	TWCR = (1<<TWINT) | (1<<TWEN);
    00EA E884      LDI	R24,0x84
    00EB 93800074  STS	0x74,R24
(0057)    	while (!(TWCR & (1<<TWINT)));
    00ED 90200074  LDS	R2,0x74
    00EF FE27      SBRS	R2,7
    00F0 CFFC      RJMP	0x00ED
(0058)    	_NOP();
    00F1 0000      NOP
(0059)    	return(TWSR&0b11111000);
    00F2 91000071  LDS	R16,0x71
    00F4 7F08      ANDI	R16,0xF8
    00F5 9508      RET
(0060) }
(0061) /*************************************************************************
(0062) ** 函数名称: unsigned char i2crd(void)
(0063) ** 功能描述: i2c读数据
(0064) ** 输 入: 
(0065) ** 输出	 : 读取的数据
(0066) ** 全局变量: 无
(0067) ** 调用模块: 
(0068) ** 说明:
(0069) ** 注意:
(0070) **************************************************************************/
(0071) unsigned char i2crd(void)
(0072) {
(0073)    	TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
_i2crd:
    00F6 EC84      LDI	R24,0xC4
    00F7 93800074  STS	0x74,R24
(0074)    	while (!(TWCR & (1<<TWINT)));
    00F9 90200074  LDS	R2,0x74
    00FB FE27      SBRS	R2,7
    00FC CFFC      RJMP	0x00F9
(0075)    	return(TWDR);
    00FD 91000073  LDS	R16,0x73
    00FF 9508      RET
(0076) }
(0077) /*************************************************************************
(0078) ** 函数名称: i2cstop(void)
(0079) ** 功能描述: i2c停止
(0080) ** 输 入: 
(0081) ** 输出	 : 
(0082) ** 全局变量: 无
(0083) ** 调用模块: 
(0084) ** 说明:
(0085) ** 注意:
(0086) **************************************************************************/
(0087) void i2cstop(void)
(0088) { 
(0089)    TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
_i2cstop:
    0100 E984      LDI	R24,0x94
    0101 93800074  STS	0x74,R24
    0103 9508      RET
_wt24c_fc:
  t                    --> R12
  n                    --> R22
  ad                   --> R10
  p                    --> R20
    0104 940E04AA  CALL	push_gset4
    0106 0159      MOVW	R10,R18
    0107 01A8      MOVW	R20,R16
    0108 8568      LDD	R22,Y+8
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART_24C01\source\lib\AT24C01.c
(0001) /************************************************
(0002) 文件:AT24C01.c
(0003) 用途:AT24C01操作函数
(0004) 注意:
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) unsigned char syserr;
(0011) /*************************************************************************
(0012) ** 函数名称: unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
(0013) ** 功能描述: 向24Cxx写入数据wt24c_h()所要调用的函数
(0014) ** 输 入: 
(0015) ** 输出	 : 返回写入n个字节后的主机内存指针
(0016) ** 全局变量: 无
(0017) ** 调用模块: 
(0018) ** 说明:
(0019) ** 注意:
(0020) **************************************************************************/
(0021) unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
(0022) {
(0023) 	unsigned char t=0;
    0109 24CC      CLR	R12
(0024) 
(0025) 	#if e2prom<32
(0026) 	t=ad>>8;
    010A 0165      MOVW	R12,R10
    010B 2CCD      MOV	R12,R13
    010C 24DD      CLR	R13
(0027) 	t<<=1;
    010D 0CCC      LSL	R12
(0028) 	#endif
(0029) 	
(0030) 	i2cstart();					//发送起始信号
    010E 940E00E0  CALL	_i2cstart
(0031) 		
(0032) 	if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
    0110 2D0C      MOV	R16,R12
    0111 5600      SUBI	R16,0x60
    0112 940E00E8  CALL	_i2cwt
    0114 3108      CPI	R16,0x18
    0115 F479      BNE	0x0125
(0033) 	{	
(0034) 		#if e2prom>16
(0035) 		i2cwt(ad>>8);			//ad_dst的高位到器件
(0036) 		#endif
(0037) 		i2cwt(ad);				//ad_dst的低位到器件
    0116 2D0A      MOV	R16,R10
    0117 940E00E8  CALL	_i2cwt
(0038) 			
(0039) 		for(;n>0;n--)			//发送要写入的数据
    0119 C007      RJMP	0x0121
(0040) 		{
(0041) 		    i2cwt(*p);
    011A 01FA      MOVW	R30,R20
    011B 8100      LDD	R16,Z+0
    011C 940E00E8  CALL	_i2cwt
(0042) 			p++;
    011E 5F4F      SUBI	R20,0xFF
    011F 4F5F      SBCI	R21,0xFF
    0120 956A      DEC	R22
    0121 2422      CLR	R2
    0122 1626      CP	R2,R22
    0123 F3B0      BCS	0x011A
(0043) 		}
(0044) 	}
    0124 C003      RJMP	0x0128
(0045) 	else syserr=ERR_SLAW;		//写字节命令及器件地址错
    0125 E081      LDI	R24,1
    0126 9380013D  STS	syserr,R24
(0046) 	
(0047) 	i2cstop();
    0128 940E0100  CALL	_i2cstop
(0048)     delay_nms(6);						//延时6ms
    012A E006      LDI	R16,6
    012B E010      LDI	R17,0
    012C 940E01F6  CALL	_delay_nms
(0049) 	
(0050) 	return(p);
    012E 018A      MOVW	R16,R20
    012F 940E04A2  CALL	pop_gset4
    0131 9508      RET
_wt24c:
  n                    --> R10
  num                  --> R12
  ad_dst               --> R14
  p_rsc                --> Y+11
    0132 940E03DE  CALL	push_arg4
    0134 940E04A8  CALL	push_gset5
    0136 0179      MOVW	R14,R18
    0137 9721      SBIW	R28,1
    0138 84CF      LDD	R12,Y+15
    0139 88D8      LDD	R13,Y+16
(0051) }
(0052) /*************************************************************************
(0053) ** 函数名称: 
(0054) ** 功能描述: 向24Cxx写入数据
(0055) ** 输 入: *p_rsc要输出数据的主机内存地址指针; ad_dst要写入数据的i2c的地址(双字节); num数据个数
(0056) ** 输出	 : 
(0057) ** 全局变量: 无
(0058) ** 调用模块: 
(0059) ** 说明:ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
(0060) ** 注意:
(0061) **************************************************************************/
(0062) void wt24c(unsigned char *p_rsc, unsigned int ad_dst, unsigned int num)
(0063) {
(0064)     unsigned int n;
(0065) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -