📄 24c01.lst
字号:
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 + -