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

📄 24c01.lst

📁 一个基于ATMEGA128的TWI(I2C)EEPROM-24c01的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0046 EFCF      LDI	R28,0xFF
    0047 E1D0      LDI	R29,0x10
    0048 BFCD      OUT	0x3D,R28
    0049 BFDE      OUT	0x3E,R29
    004A 51C0      SUBI	R28,0x10
    004B 40D0      SBCI	R29,0
    004C EA0A      LDI	R16,0xAA
    004D 8308      STD	Y+0,R16
    004E 2400      CLR	R0
    004F E0E0      LDI	R30,0
    0050 E0F1      LDI	R31,1
    0051 E011      LDI	R17,1
    0052 38E1      CPI	R30,0x81
    0053 07F1      CPC	R31,R17
    0054 F011      BEQ	0x0057
    0055 9201      ST	R0,Z+
    0056 CFFB      RJMP	0x0052
    0057 8300      STD	Z+0,R16
    0058 E8EC      LDI	R30,0x8C
    0059 E0F0      LDI	R31,0
    005A E0A0      LDI	R26,0
    005B E0B1      LDI	R27,1
    005C E010      LDI	R17,0
    005D 38EC      CPI	R30,0x8C
    005E 07F1      CPC	R31,R17
    005F F021      BEQ	0x0064
    0060 95C8      LPM
    0061 9631      ADIW	R30,1
    0062 920D      ST	R0,X+
    0063 CFF9      RJMP	0x005D
    0064 940E0067  CALL	_main
_exit:
    0066 CFFF      RJMP	_exit
_main:
  w                    --> R12
  r                    --> R22
  y                    --> R10
  x                    --> Y+2
  b                    --> R14
  a                    --> R20
  i                    --> R4
    0067 9724      SBIW	R28,4
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_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) unsigned char write_buff[64],read_buff[64];
(0013) 
(0014) void main(void)
(0015) {
(0016)      unsigned int i,a,b,x,y;	
(0017)      unsigned char *r,*w;
(0018) 	 delay_nms(100);
    0068 E604      LDI	R16,0x64
    0069 E010      LDI	R17,0
    006A 940E01E3  CALL	_delay_nms
(0019)      twi_init();	//初始化cpu
    006C 940E00BF  CALL	_twi_init
(0020) 
(0021) 	 for(i=0;i<64;i++)	read_buff[i]=write_buff[i]=0;//清主机读和写缓存区
    006E 2444      CLR	R4
    006F 2455      CLR	R5
    0070 C010      RJMP	0x0081
    0071 E480      LDI	R24,0x40
    0072 E091      LDI	R25,1
    0073 01F2      MOVW	R30,R4
    0074 0FE8      ADD	R30,R24
    0075 1FF9      ADC	R31,R25
    0076 2422      CLR	R2
    0077 8220      STD	Z+0,R2
    0078 E080      LDI	R24,0
    0079 E091      LDI	R25,1
    007A 01F2      MOVW	R30,R4
    007B 0FE8      ADD	R30,R24
    007C 1FF9      ADC	R31,R25
    007D 8220      STD	Z+0,R2
    007E 01C2      MOVW	R24,R4
    007F 9601      ADIW	R24,1
    0080 012C      MOVW	R4,R24
    0081 01C2      MOVW	R24,R4
    0082 3480      CPI	R24,0x40
    0083 E0E0      LDI	R30,0
    0084 079E      CPC	R25,R30
    0085 F358      BCS	0x0071
(0022) 	 for(i=0;i<64;i++)	write_buff[i]=i;//写缓存区赋初值
    0086 2444      CLR	R4
    0087 2455      CLR	R5
    0088 C00A      RJMP	0x0093
    0089 E480      LDI	R24,0x40
    008A E091      LDI	R25,1
    008B 01F2      MOVW	R30,R4
    008C 0FE8      ADD	R30,R24
    008D 1FF9      ADC	R31,R25
    008E 2C24      MOV	R2,R4
    008F 8220      STD	Z+0,R2
    0090 01C2      MOVW	R24,R4
    0091 9601      ADIW	R24,1
    0092 012C      MOVW	R4,R24
    0093 01C2      MOVW	R24,R4
    0094 3480      CPI	R24,0x40
    0095 E0E0      LDI	R30,0
    0096 079E      CPC	R25,R30
    0097 F388      BCS	0x0089
(0023) 
(0024)      r=read_buff;	//读参数
    0098 E060      LDI	R22,0
    0099 E071      LDI	R23,1
(0025)      b=0x00;
    009A 24EE      CLR	R14
    009B 24FF      CLR	R15
(0026)      a=64;
    009C E440      LDI	R20,0x40
    009D E050      LDI	R21,0
(0027) 
(0028)      w=write_buff;	//写参数
    009E E480      LDI	R24,0x40
    009F E091      LDI	R25,1
    00A0 016C      MOVW	R12,R24
(0029)      x=0x00;
    00A1 2400      CLR	R0
    00A2 2411      CLR	R1
    00A3 821B      STD	Y+3,R1
    00A4 820A      STD	Y+2,R0
(0030)      y=64;
    00A5 E480      LDI	R24,0x40
    00A6 E090      LDI	R25,0
    00A7 015C      MOVW	R10,R24
(0031) 
(0032)      wt24c(w,x,y);	//写
    00A8 82B9      STD	Y+1,R11
    00A9 82A8      STD	Y+0,R10
    00AA 0190      MOVW	R18,R0
    00AB 0186      MOVW	R16,R12
    00AC 924F      PUSH	R4
    00AD 925F      PUSH	R5
    00AE 940E011F  CALL	_wt24c
    00B0 905F      POP	R5
    00B1 904F      POP	R4
(0033)      rd24c(r,b,a);	//读
    00B2 8359      STD	Y+1,R21
    00B3 8348      STD	Y+0,R20
    00B4 0197      MOVW	R18,R14
    00B5 018B      MOVW	R16,R22
    00B6 924F      PUSH	R4
    00B7 925F      PUSH	R5
    00B8 940E0197  CALL	_rd24c
    00BA 905F      POP	R5
    00BB 904F      POP	R4
(0034) 	      
(0035)      while(1);
    00BC CFFF      RJMP	0x00BC
    00BD 9624      ADIW	R28,4
    00BE 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_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:
    00BF 2422      CLR	R2
    00C0 92200074  STS	0x74,R2
(0023)  TWBR= (1<<6) | (1<<5) | (1<<2); //set bit rate
    00C2 E684      LDI	R24,0x64
    00C3 93800070  STS	0x70,R24
(0024)  TWSR= 0x00; //set prescale
    00C5 92200071  STS	0x71,R2
(0025)  TWAR= 0x00; //set slave address
    00C7 92200072  STS	0x72,R2
(0026)  TWCR= (1<<TWEN); //enable twi
    00C9 E084      LDI	R24,4
    00CA 93800074  STS	0x74,R24
    00CC 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:
    00CD EA84      LDI	R24,0xA4
    00CE 93800074  STS	0x74,R24
(0041)    	while (!(TWCR & (1<<TWINT)));
    00D0 90200074  LDS	R2,0x74
    00D2 FE27      SBRS	R2,7
    00D3 CFFC      RJMP	0x00D0
    00D4 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
    00D5 93000073  STS	0x73,R16
(0056)    	TWCR = (1<<TWINT) | (1<<TWEN);
    00D7 E884      LDI	R24,0x84
    00D8 93800074  STS	0x74,R24
(0057)    	while (!(TWCR & (1<<TWINT)));
    00DA 90200074  LDS	R2,0x74
    00DC FE27      SBRS	R2,7
    00DD CFFC      RJMP	0x00DA
(0058)    	_NOP();
    00DE 0000      NOP
(0059)    	return(TWSR&0b11111000);
    00DF 91000071  LDS	R16,0x71
    00E1 7F08      ANDI	R16,0xF8
    00E2 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:
    00E3 EC84      LDI	R24,0xC4
    00E4 93800074  STS	0x74,R24
(0074)    	while (!(TWCR & (1<<TWINT)));
    00E6 90200074  LDS	R2,0x74
    00E8 FE27      SBRS	R2,7
    00E9 CFFC      RJMP	0x00E6
(0075)    	return(TWDR);
    00EA 91000073  LDS	R16,0x73
    00EC 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:
    00ED E984      LDI	R24,0x94
    00EE 93800074  STS	0x74,R24
    00F0 9508      RET
_wt24c_fc:
  t                    --> R12
  n                    --> R22
  ad                   --> R10
  p                    --> R20
    00F1 940E0232  CALL	push_gset4
    00F3 0159      MOVW	R10,R18
    00F4 01A8      MOVW	R20,R16
    00F5 8568      LDD	R22,Y+8
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_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;
    00F6 24CC      CLR	R12
(0024) 
(0025) 	#if e2prom<32
(0026) 	t=ad>>8;
    00F7 0165      MOVW	R12,R10
    00F8 2CCD      MOV	R12,R13
    00F9 24DD      CLR	R13
(0027) 	t<<=1;
    00FA 0CCC      LSL	R12
(0028) 	#endif
(0029) 	
(0030) 	i2cstart();					//发送起始信号
    00FB 940E00CD  CALL	_i2cstart
(0031) 		
(0032) 	if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
    00FD 2D0C      MOV	R16,R12
    00FE 5600      SUBI	R16,0x60
    00FF 940E00D5  CALL	_i2cwt
    0101 3108      CPI	R16,0x18
    0102 F479      BNE	0x0112
(0033) 	{	
(0034) 		#if e2prom>16
(0035) 		i2cwt(ad>>8);			//ad_dst的高位到器件
(0036) 		#endif
(0037) 		i2cwt(ad);				//ad_dst的低位到器件
    0103 2D0A      MOV	R16,R10
    0104 940E00D5  CALL	_i2cwt
(0038) 			
(0039) 		for(;n>0;n--)			//发送要写入的数据
    0106 C007      RJMP	0x010E
(0040) 		{
(0041) 		    i2cwt(*p);
    0107 01FA      MOVW	R30,R20
    0108 8100      LDD	R16,Z+0
    0109 940E00D5  CALL	_i2cwt
(0042) 			p++;
    010B 5F4F      SUBI	R20,0xFF
    010C 4F5F      SBCI	R21,0xFF
    010D 956A      DEC	R22
    010E 2422      CLR	R2
    010F 1626      CP	R2,R22
    0110 F3B0      BCS	0x0107
(0043) 		}
(0044) 	}
    0111 C003      RJMP	0x0115
(0045) 	else syserr=ERR_SLAW;		//写字节命令及器件地址错
    0112 E081      LDI	R24,1
    0113 93800180  STS	syserr,R24
(0046) 	
(0047) 	i2cstop();
    0115 940E00ED  CALL	_i2cstop
(0048)     delay_nms(6);						//延时6ms
    0117 E006      LDI	R16,6
    0118 E010      LDI	R17,0
    0119 940E01E3  CALL	_delay_nms
(0049) 	
(0050) 	return(p);
    011B 018A      MOVW	R16,R20
    011C 940E022A  CALL	pop_gset4
    011E 9508      RET
_wt24c:
  n                    --> R10
  num                  --> R12
  ad_dst               --> R14
  p_rsc                --> Y+11
    011F 940E01F2  CALL	push_arg4
    0121 940E0230  CALL	push_gset5
    0123 0179      MOVW	R14,R18
    0124 9721      SBIW	R28,1
    0125 84CF      LDD	R12,Y+15
    0126 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) 
(0066)     n=ad_dst/PAGE_SIZE;		//确定地址与块地址的差
    0127 0157      MOVW	R10,R14
    0128 94B6      LSR	R11
    0129 94A7      ROR	R10
    012A 94B6      LSR	R11
    012B 94A7      ROR	R10
    012C 94B6      LSR	R11
    012D 94A7      ROR	R10
(0067) 	if(n) n=(unsigned long)PAGE_SIZE*(n+1)-ad_dst;
    012E 20AA      TST	R10
    012F F411      BNE	0x0132
    0130 20BB      TST	R11
    0131 F0E1      BEQ	0x014E
    0132 01C5      MOVW	R24,R10
    0133 9601      ADIW	R24,1
    0134 011C      MOVW	R2,R24

⌨️ 快捷键说明

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