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

📄 24c01.lst

📁 一个基于ATMEGA128的TWI(I2C)EEPROM-24c01的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
    0135 2444      CLR	R4
    0136 2455      CLR	R5
    0137 E048      LDI	R20,0x8
    0138 E050      LDI	R21,0
    0139 E060      LDI	R22,0
    013A E070      LDI	R23,0
    013B 925A      ST	R5,-Y
    013C 924A      ST	R4,-Y
    013D 923A      ST	R3,-Y
    013E 922A      ST	R2,-Y
    013F 018A      MOVW	R16,R20
    0140 019B      MOVW	R18,R22
    0141 940E01F7  CALL	empy32s
    0143 0118      MOVW	R2,R16
    0144 0129      MOVW	R4,R18
    0145 0137      MOVW	R6,R14
    0146 2488      CLR	R8
    0147 2499      CLR	R9
    0148 1826      SUB	R2,R6
    0149 0837      SBC	R3,R7
    014A 0848      SBC	R4,R8
    014B 0859      SBC	R5,R9
    014C 0151      MOVW	R10,R2
    014D C005      RJMP	0x0153
(0068) 	else n=PAGE_SIZE-ad_dst;
    014E E088      LDI	R24,0x8
    014F E090      LDI	R25,0
    0150 015C      MOVW	R10,R24
    0151 18AE      SUB	R10,R14
    0152 08BF      SBC	R11,R15
(0069) 	
(0070)     if(n>=num)		//如果ad_dst所在的数据块的末尾地址 >= ad_dst + num, 就直接写入num个数据
    0153 14AC      CP	R10,R12
    0154 04BD      CPC	R11,R13
    0155 F058      BCS	0x0161
(0071)     {
(0072) 	 	wt24c_fc(p_rsc, ad_dst, num);
    0156 82C8      STD	Y+0,R12
    0157 0197      MOVW	R18,R14
    0158 850B      LDD	R16,Y+11
    0159 851C      LDD	R17,Y+12
    015A DF96      RCALL	_wt24c_fc
(0073)     	if(syserr!=0) return;
    015B 90200180  LDS	R2,syserr
    015D 2022      TST	R2
    015E F409      BNE	0x0160
    015F C032      RJMP	0x0192
    0160 C031      RJMP	0x0192
(0074)     }
(0075)     else			//如果ad_dst所在的数据块末尾地址 < ad_dst + num, 就先写入ad_dst所在的数据块末尾地址与 ad_dst 之差个数据
(0076)     {
(0077) 	    p_rsc=wt24c_fc(p_rsc, ad_dst, n);
    0161 82A8      STD	Y+0,R10
    0162 0197      MOVW	R18,R14
    0163 850B      LDD	R16,Y+11
    0164 851C      LDD	R17,Y+12
    0165 DF8B      RCALL	_wt24c_fc
    0166 871C      STD	Y+12,R17
    0167 870B      STD	Y+11,R16
(0078)     	if(syserr!=0) return;
    0168 90200180  LDS	R2,syserr
    016A 2022      TST	R2
    016B F009      BEQ	0x016D
    016C C025      RJMP	0x0192
(0079) 		
(0080) 		num-=n;     //更新剩下数据个数
    016D 18CA      SUB	R12,R10
    016E 08DB      SBC	R13,R11
(0081)         ad_dst+=n;	//更新剩下数据的起始地址
    016F 0CEA      ADD	R14,R10
    0170 1CFB      ADC	R15,R11
    0171 C013      RJMP	0x0185
(0082) 
(0083)         //把剩下数据写入器件
(0084)         while(num>=PAGE_SIZE)	//先按PAGE_SIZE为长度一页一页的写入
(0085)         {
(0086) 		 	p_rsc=wt24c_fc(p_rsc, ad_dst, PAGE_SIZE);
    0172 E088      LDI	R24,0x8
    0173 8388      STD	Y+0,R24
    0174 0197      MOVW	R18,R14
    0175 850B      LDD	R16,Y+11
    0176 851C      LDD	R17,Y+12
    0177 DF79      RCALL	_wt24c_fc
    0178 871C      STD	Y+12,R17
    0179 870B      STD	Y+11,R16
(0087)         	if(syserr!=0) return;
    017A 90200180  LDS	R2,syserr
    017C 2022      TST	R2
    017D F009      BEQ	0x017F
    017E C013      RJMP	0x0192
(0088)         	
(0089)             num-=PAGE_SIZE;		//更新剩余数据个数
    017F 01C6      MOVW	R24,R12
    0180 9708      SBIW	R24,0x8
    0181 016C      MOVW	R12,R24
(0090)         	ad_dst+=PAGE_SIZE;	//更新剩下数据的起始地址
    0182 01C7      MOVW	R24,R14
    0183 9608      ADIW	R24,0x8
    0184 017C      MOVW	R14,R24
    0185 01C6      MOVW	R24,R12
    0186 3088      CPI	R24,0x8
    0187 E0E0      LDI	R30,0
    0188 079E      CPC	R25,R30
    0189 F740      BCC	0x0172
(0091) 		}
(0092)         
(0093) 		if(num)			//把最后剩下的小于一个PAGE_SIZE长度的数据写入器件
    018A 3080      CPI	R24,0
    018B 0789      CPC	R24,R25
    018C F029      BEQ	0x0192
(0094) 			wt24c_fc(p_rsc, ad_dst, num);
    018D 82C8      STD	Y+0,R12
    018E 0197      MOVW	R18,R14
    018F 850B      LDD	R16,Y+11
    0190 851C      LDD	R17,Y+12
    0191 DF5F      RCALL	_wt24c_fc
(0095)     }
    0192 9621      ADIW	R28,1
    0193 940E022D  CALL	pop_gset5
    0195 9624      ADIW	R28,4
    0196 9508      RET
_rd24c:
  t                    --> R10
  num                  --> R22
  ad_rsc               --> R12
  p_dst                --> R20
    0197 940E0232  CALL	push_gset4
    0199 0169      MOVW	R12,R18
    019A 01A8      MOVW	R20,R16
    019B 8568      LDD	R22,Y+8
    019C 8579      LDD	R23,Y+9
(0096) }
(0097) /*************************************************************************
(0098) ** 函数名称: 
(0099) ** 功能描述: 从24cxx读出数据
(0100) ** 输 入: *p_dst要读入数据的主机内存地址指针; ad_rsc要输出数据的i2c的地址(整形); num数据个数(整形)
(0101) ** 输出	 : 
(0102) ** 全局变量: 无
(0103) ** 调用模块: 
(0104) ** 说明:ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
(0105) ** 注意:
(0106) **************************************************************************/
(0107) void rd24c(unsigned char *p_dst, unsigned int ad_rsc, unsigned int num)
(0108) {
(0109)     unsigned char t=0;
    019D 24AA      CLR	R10
(0110) 
(0111) 	#if e2prom<32
(0112) 	t=ad_rsc>>8;
    019E 0156      MOVW	R10,R12
    019F 2CAB      MOV	R10,R11
    01A0 24BB      CLR	R11
(0113) 	t<<=1;
    01A1 0CAA      LSL	R10
(0114) 	#endif
(0115) 	
(0116) 	i2cstart();					//发送起始信号
    01A2 940E00CD  CALL	_i2cstart
(0117) 		
(0118) 	if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
    01A4 2D0A      MOV	R16,R10
    01A5 5600      SUBI	R16,0x60
    01A6 940E00D5  CALL	_i2cwt
    01A8 3108      CPI	R16,0x18
    01A9 F4B1      BNE	0x01C0
(0119) 	{	
(0120) 		#if e2prom>16
(0121) 		i2cwt(ad_rsc>>8);		//ad_rsc的高位,  发送要读出数据的地址
(0122) 		#endif
(0123) 		i2cwt(ad_rsc);			//ad_rsc的低位
    01AA 2D0C      MOV	R16,R12
    01AB 940E00D5  CALL	_i2cwt
(0124) 				
(0125) 		i2cstart();				//再发送起始信号
    01AD 940E00CD  CALL	_i2cstart
(0126) 		i2cwt(R_ADD_COM+t);		//发送SLA_R, 读命令字节及器件地址
    01AF 2D0A      MOV	R16,R10
    01B0 550F      SUBI	R16,0x5F
    01B1 940E00D5  CALL	_i2cwt
(0127) 				
(0128) 		for(;num>0;num--)
    01B3 C008      RJMP	0x01BC
(0129) 		{
(0130) 		    *p_dst=i2crd();		//从器件读出一个字节
    01B4 940E00E3  CALL	_i2crd
    01B6 01FA      MOVW	R30,R20
    01B7 8300      STD	Z+0,R16
(0131) 			p_dst++;
    01B8 5F4F      SUBI	R20,0xFF
    01B9 4F5F      SBCI	R21,0xFF
    01BA 5061      SUBI	R22,1
    01BB 4070      SBCI	R23,0
    01BC 3060      CPI	R22,0
    01BD 0767      CPC	R22,R23
    01BE F7A9      BNE	0x01B4
(0132) 		}
(0133) 	}
    01BF C003      RJMP	0x01C3
(0134) 	else syserr=ERR_SLAW;		//写字节命令及器件地址错或对方无应答
    01C0 E081      LDI	R24,1
    01C1 93800180  STS	syserr,R24
(0135) 		
(0136) 	i2cstop();
    01C3 940E00ED  CALL	_i2cstop
    01C5 940E022A  CALL	pop_gset4
    01C7 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_24C01\source\lib\delay.c
(0001) /************************************************
(0002) 文件:delay.c
(0003) 用途:延时函数
(0004) 注意:系统时钟8M
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) 
(0010) void delay_1us(void)                 //1us延时函数
(0011)   {
(0012)    asm("nop");
_delay_1us:
    01C8 0000      NOP
    01C9 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    01CA 940E0236  CALL	push_gset2
    01CC 01B8      MOVW	R22,R16
(0013)   }
(0014) 
(0015) void delay_nus(unsigned int n)       //N us延时函数
(0016)   {
(0017)    unsigned int i=0;
    01CD 2744      CLR	R20
    01CE 2755      CLR	R21
(0018)    for (i=0;i<n;i++)
    01CF C003      RJMP	0x01D3
(0019)    delay_1us();
    01D0 DFF7      RCALL	_delay_1us
    01D1 5F4F      SUBI	R20,0xFF
    01D2 4F5F      SBCI	R21,0xFF
    01D3 1746      CP	R20,R22
    01D4 0757      CPC	R21,R23
    01D5 F3D0      BCS	0x01D0
    01D6 940E0227  CALL	pop_gset2
    01D8 9508      RET
(0020)   }
(0021)   
(0022) void delay_1ms(void)                 //1ms延时函数
(0023)   {
(0024)    unsigned int i;
(0025)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    01D9 2700      CLR	R16
    01DA 2711      CLR	R17
    01DB C002      RJMP	0x01DE
    01DC 5F0F      SUBI	R16,0xFF
    01DD 4F1F      SBCI	R17,0xFF
    01DE 3704      CPI	R16,0x74
    01DF E0E4      LDI	R30,4
    01E0 071E      CPC	R17,R30
    01E1 F3D0      BCS	0x01DC
    01E2 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    01E3 940E0236  CALL	push_gset2
    01E5 01B8      MOVW	R22,R16
(0026)   }
(0027)   
(0028) void delay_nms(unsigned int n)       //N ms延时函数
(0029)   {
(0030)    unsigned int i=0;
    01E6 2744      CLR	R20
    01E7 2755      CLR	R21
(0031)    for (i=0;i<n;i++)
    01E8 C003      RJMP	0x01EC
(0032)    delay_1ms();
FILE: <library>
    01E9 DFEF      RCALL	_delay_1ms
    01EA 5F4F      SUBI	R20,0xFF
    01EB 4F5F      SBCI	R21,0xFF
    01EC 1746      CP	R20,R22
    01ED 0757      CPC	R21,R23
    01EE F3D0      BCS	0x01E9
    01EF 940E0227  CALL	pop_gset2
    01F1 9508      RET
push_arg4:
    01F2 933A      ST	R19,-Y
    01F3 932A      ST	R18,-Y
push_arg2:
    01F4 931A      ST	R17,-Y
    01F5 930A      ST	R16,-Y
    01F6 9508      RET
empy32s:
empy32u:
    01F7 940E024F  CALL	long_prolog
    01F9 927F      PUSH	R7
    01FA 940E0268  CALL	tstzero1
    01FC F139      BEQ	0x0224
    01FD 2477      CLR	R7
    01FE 940E026E  CALL	tstzero2
    0200 F419      BNE	0x0204
    0201 018C      MOVW	R16,R24
    0202 019D      MOVW	R18,R26
    0203 C020      RJMP	0x0224
    0204 9F08      MUL	R16,R24
    0205 2CB0      MOV	R11,R0
    0206 2CA1      MOV	R10,R1
    0207 9F28      MUL	R18,R24
    0208 2C90      MOV	R9,R0
    0209 2C81      MOV	R8,R1
    020A 9F18      MUL	R17,R24
    020B 0CA0      ADD	R10,R0
    020C 1C91      ADC	R9,R1
    020D 1C87      ADC	R8,R7
    020E 9F09      MUL	R16,R25
    020F 0CA0      ADD	R10,R0
    0210 1C91      ADC	R9,R1
    0211 1C87      ADC	R8,R7
    0212 9F19      MUL	R17,R25
    0213 0C90      ADD	R9,R0
    0214 1C81      ADC	R8,R1
    0215 9F0A      MUL	R16,R26
    0216 0C90      ADD	R9,R0
    0217 1C81      ADC	R8,R1
    0218 9F38      MUL	R19,R24
    0219 0C80      ADD	R8,R0
    021A 9F29      MUL	R18,R25
    021B 0C80      ADD	R8,R0
    021C 9F1A      MUL	R17,R26
    021D 0C80      ADD	R8,R0
    021E 9F0B      MUL	R16,R27
    021F 0C80      ADD	R8,R0
    0220 2D0B      MOV	R16,R11
    0221 2D1A      MOV	R17,R10
    0222 2D29      MOV	R18,R9
    0223 2D38      MOV	R19,R8
    0224 907F      POP	R7
    0225 940C025D  JMP	long_epilog
pop_gset2:
    0227 E0E2      LDI	R30,2
    0228 940C023C  JMP	pop
pop_gset4:
    022A E0E8      LDI	R30,0x8
    022B 940C023C  JMP	pop
pop_gset5:
    022D 27EE      CLR	R30
    022E 940C023C  JMP	pop
push_gset5:
    0230 92FA      ST	R15,-Y
    0231 92EA      ST	R14,-Y
push_gset4:
    0232 92DA      ST	R13,-Y
    0233 92CA      ST	R12,-Y
push_gset3:
    0234 92BA      ST	R11,-Y
    0235 92AA      ST	R10,-Y
push_gset2:
    0236 937A      ST	R23,-Y
    0237 936A      ST	R22,-Y
push_gset1:
    0238 935A      ST	R21,-Y
    0239 934A      ST	R20,-Y
    023A 9508      RET
pop_gset1:
    023B E0E1      LDI	R30,1
pop:
    023C 9149      LD	R20,Y+
    023D 9159      LD	R21,Y+
    023E FDE0      SBRC	R30,0
    023F 9508      RET
    0240 9169      LD	R22,Y+
    0241 9179      LD	R23,Y+
    0242 FDE1      SBRC	R30,1
    0243 9508      RET
    0244 90A9      LD	R10,Y+
    0245 90B9      LD	R11,Y+
    0246 FDE2      SBRC	R30,2
    0247 9508      RET
    0248 90C9      LD	R12,Y+
    0249 90D9      LD	R13,Y+
    024A FDE3      SBRC	R30,3
    024B 9508      RET
    024C 90E9      LD	R14,Y+
    024D 90F9      LD	R15,Y+
    024E 9508      RET
long_prolog:
    024F 928A      ST	R8,-Y
    0250 929A      ST	R9,-Y
    0251 92AA      ST	R10,-Y
    0252 92BA      ST	R11,-Y
    0253 93EA      ST	R30,-Y
    0254 938A      ST	R24,-Y
    0255 939A      ST	R25,-Y
    0256 93AA      ST	R26,-Y
    0257 93BA      ST	R27,-Y
    0258 8589      LDD	R24,Y+9
    0259 859A      LDD	R25,Y+10
    025A 85AB      LDD	R26,Y+11
    025B 85BC      LDD	R27,Y+12
    025C 9508      RET
long_epilog:
    025D 91B9      LD	R27,Y+
    025E 91A9      LD	R26,Y+
    025F 9199      LD	R25,Y+
    0260 9189      LD	R24,Y+
    0261 91E9      LD	R30,Y+
    0262 90B9      LD	R11,Y+
    0263 90A9      LD	R10,Y+
    0264 9099      LD	R9,Y+
    0265 9089      LD	R8,Y+
    0266 9624      ADIW	R28,4
    0267 9508      RET
tstzero1:
    0268 27EE      CLR	R30
    0269 2BE0      OR	R30,R16
    026A 2BE1      OR	R30,R17
    026B 2BE2      OR	R30,R18
    026C 2BE3      OR	R30,R19
    026D 9508      RET
tstzero2:
    026E 27EE      CLR	R30
    026F 2BE8      OR	R30,R24
    0270 2BE9      OR	R30,R25
    0271 2BEA      OR	R30,R26
    0272 2BEB      OR	R30,R27
    0273 9508      RET

⌨️ 快捷键说明

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