📄 24cxx.lis
字号:
012C ; //TWI initialize
012C ; // bit rate:100
012C ; void twi_init(void)
012C ; {
012C .dbline 133
012C ; TWCR= 0x00; //disable twi
012C 2224 clr R2
012E 26BE out 0x36,R2
0130 .dbline 134
0130 ; TWBR= 0x20; //set bit rate
0130 80E2 ldi R24,32
0132 80B9 out 0x0,R24
0134 .dbline 135
0134 ; TWSR= 0x00; //set prescale
0134 21B8 out 0x1,R2
0136 .dbline 136
0136 ; TWAR= 0x00; //set slave address
0136 22B8 out 0x2,R2
0138 .dbline 137
0138 ; TWCR= 0x04; //enable twi
0138 84E0 ldi R24,4
013A 86BF out 0x36,R24
013C .dbline -2
013C L27:
013C .dbline 0 ; func end
013C 0895 ret
013E .dbend
013E .dbfunc e rd24c _rd24c fV
013E ; t -> R10
013E ; num -> R22,R23
013E ; ad_rsc -> R12,R13
013E ; p_dst -> R20,R21
.even
013E _rd24c::
013E 0E940000 xcall push_gset4
0142 6901 movw R12,R18
0144 A801 movw R20,R16
0146 6885 ldd R22,y+8
0148 7985 ldd R23,y+9
014A .dbline -1
014A .dbline 140
014A ; }
014A ; void rd24c(uchar *p_dst, uint ad_rsc, uint num)
014A ; {
014A .dbline 141
014A ; uchar t=0;
014A AA24 clr R10
014C .dbline 146
014C ; #if e2prom<32
014C ; t=ad_rsc>>8;
014C ; t<<=1;
014C ; #endif
014C ; i2cstart(); //发送起始信号
014C 49D0 xcall _i2cstart
014E .dbline 147
014E ; if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
014E 0A2D mov R16,R10
0150 0056 subi R16,96 ; addi 160
0152 4CD0 xcall _i2cwt
0154 0831 cpi R16,24
0156 B1F4 brne L29
0158 .dbline 148
0158 ; {
0158 .dbline 150
0158 ; #if e2prom>=32
0158 ; i2cwt(ad_rsc>>8); //ad_rsc的高位, 发送要读出数据的地址
0158 8601 movw R16,R12
015A 012F mov R16,R17
015C 1127 clr R17
015E 46D0 xcall _i2cwt
0160 .dbline 152
0160 ; #endif
0160 ; i2cwt(ad_rsc); //ad_rsc的低位
0160 0C2D mov R16,R12
0162 44D0 xcall _i2cwt
0164 .dbline 154
0164 ;
0164 ; i2cstart(); //再发送起始信号
0164 3DD0 xcall _i2cstart
0166 .dbline 155
0166 ; i2cwt(R_ADD_COM+t); //发送SLA_R, 读命令字节及器件地址
0166 0A2D mov R16,R10
0168 0F55 subi R16,95 ; addi 161
016A 40D0 xcall _i2cwt
016C .dbline 157
016C ;
016C ; for(;num>0;num--)
016C 07C0 xjmp L34
016E L31:
016E .dbline 158
016E .dbline 159
016E 48D0 xcall _i2crd
0170 FA01 movw R30,R20
0172 0083 std z+0,R16
0174 .dbline 160
0174 4F5F subi R20,255 ; offset = 1
0176 5F4F sbci R21,255
0178 .dbline 161
0178 L32:
0178 .dbline 157
0178 6150 subi R22,1
017A 7040 sbci R23,0
017C L34:
017C .dbline 157
017C 6030 cpi R22,0
017E 6707 cpc R22,R23
0180 B1F7 brne L31
0182 X4:
0182 .dbline 162
0182 ; {
0182 ; *p_dst=i2crd(); //从器件读出一个字节
0182 ; p_dst++;
0182 ; }
0182 ; }
0182 03C0 xjmp L30
0184 L29:
0184 .dbline 164
0184 ; else
0184 ; syserr=ERR_SLAW; //写字节命令及器件地址错或对方无应答
0184 8AE0 ldi R24,10
0186 80930000 sts _syserr,R24
018A L30:
018A .dbline 166
018A ;
018A ; i2cstop();
018A 41D0 xcall _i2cstop
018C .dbline -2
018C L28:
018C 0E940000 xcall pop_gset4
0190 .dbline 0 ; func end
0190 0895 ret
0192 .dbsym r t 10 c
0192 .dbsym r num 22 i
0192 .dbsym r ad_rsc 12 i
0192 .dbsym r p_dst 20 pc
0192 .dbend
0192 .dbfunc e wt24c_fc _wt24c_fc fpc
0192 ; t -> R12
0192 ; n -> R22
0192 ; ad -> R10,R11
0192 ; p -> R20,R21
.even
0192 _wt24c_fc::
0192 0E940000 xcall push_gset4
0196 5901 movw R10,R18
0198 A801 movw R20,R16
019A 6885 ldd R22,y+8
019C .dbline -1
019C .dbline 173
019C ;
019C ; }
019C ; //向24Cxx写入数据wt24c_h()所要调用的函数
019C ; //返回写入n个字节后的主机内存指针
019C ;
019C ; uchar * wt24c_fc(uchar *p, uint ad, uchar n)
019C ; {
019C .dbline 174
019C ; uchar t=0;
019C CC24 clr R12
019E .dbline 179
019E ; #if e2prom<32
019E ; t=ad>>8;
019E ; t<<=1;
019E ; #endif
019E ; i2cstart(); //发送起始信号
019E 20D0 xcall _i2cstart
01A0 .dbline 180
01A0 ; if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
01A0 0C2D mov R16,R12
01A2 0056 subi R16,96 ; addi 160
01A4 23D0 xcall _i2cwt
01A6 0831 cpi R16,24
01A8 89F4 brne L36
01AA .dbline 181
01AA ; {
01AA .dbline 183
01AA ; #if e2prom>=32
01AA ; i2cwt(ad>>8); //ad_dst的高位到器件
01AA 8501 movw R16,R10
01AC 012F mov R16,R17
01AE 1127 clr R17
01B0 1DD0 xcall _i2cwt
01B2 .dbline 185
01B2 ; #endif
01B2 ; i2cwt(ad); //ad_dst的低位到器件
01B2 0A2D mov R16,R10
01B4 1BD0 xcall _i2cwt
01B6 .dbline 187
01B6 ;
01B6 ; for(;n>0;n--) //发送要写入的数据
01B6 06C0 xjmp L41
01B8 L38:
01B8 .dbline 188
01B8 .dbline 188
01B8 FA01 movw R30,R20
01BA 0081 ldd R16,z+0
01BC 17D0 xcall _i2cwt
01BE .dbline 189
01BE 4F5F subi R20,255 ; offset = 1
01C0 5F4F sbci R21,255
01C2 .dbline 190
01C2 L39:
01C2 .dbline 187
01C2 6A95 dec R22
01C4 L41:
01C4 .dbline 187
01C4 2224 clr R2
01C6 2616 cp R2,R22
01C8 B8F3 brlo L38
01CA .dbline 191
01CA ; { i2cwt(*p);
01CA ; p++;
01CA ; }
01CA ; }
01CA 03C0 xjmp L37
01CC L36:
01CC .dbline 192
01CC ; else syserr=ERR_SLAW; //写字节命令及器件地址错
01CC 8AE0 ldi R24,10
01CE 80930000 sts _syserr,R24
01D2 L37:
01D2 .dbline 194
01D2 ;
01D2 ; i2cstop();
01D2 1DD0 xcall _i2cstop
01D4 .dbline 195
01D4 ; delay_EEPROM(10); //延时6ms
01D4 0AE0 ldi R16,10
01D6 14DF xcall _delay_EEPROM
01D8 .dbline 197
01D8 ;
01D8 ; return(p);
01D8 8A01 movw R16,R20
01DA .dbline -2
01DA L35:
01DA 0E940000 xcall pop_gset4
01DE .dbline 0 ; func end
01DE 0895 ret
01E0 .dbsym r t 12 c
01E0 .dbsym r n 22 c
01E0 .dbsym r ad 10 i
01E0 .dbsym r p 20 pc
01E0 .dbend
01E0 .dbfunc e i2cstart _i2cstart fV
.even
01E0 _i2cstart::
01E0 .dbline -1
01E0 .dbline 206
01E0 ; }
01E0 ;
01E0 ;
01E0 ;
01E0 ; //-------------------------------以下为其它I2总线器件可调用的函数--------------------------
01E0 ;
01E0 ; //总线上起动开始条件
01E0 ; void i2cstart(void)
01E0 ; {
01E0 .dbline 207
01E0 ; TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
01E0 84EA ldi R24,164
01E2 86BF out 0x36,R24
01E4 L43:
01E4 .dbline 208
01E4 L44:
01E4 .dbline 208
01E4 ; while (!(TWCR & BIT(TWINT)));
01E4 26B6 in R2,0x36
01E6 27FE sbrs R2,7
01E8 FDCF rjmp L43
01EA .dbline -2
01EA L42:
01EA .dbline 0 ; func end
01EA 0895 ret
01EC .dbend
01EC .dbfunc e i2cwt _i2cwt fc
01EC ; a -> R16
.even
01EC _i2cwt::
01EC .dbline -1
01EC .dbline 213
01EC ; }
01EC ;
01EC ; //把一个字节数据输入器件, 返回TWI状态
01EC ; uchar i2cwt(uchar a)
01EC ; {
01EC .dbline 214
01EC ; TWDR = a;
01EC 03B9 out 0x3,R16
01EE .dbline 215
01EE ; TWCR = BIT(TWINT) | BIT(TWEN);
01EE 84E8 ldi R24,132
01F0 86BF out 0x36,R24
01F2 L47:
01F2 .dbline 216
01F2 L48:
01F2 .dbline 216
01F2 ; while (!(TWCR & BIT(TWINT)));
01F2 26B6 in R2,0x36
01F4 27FE sbrs R2,7
01F6 FDCF rjmp L47
01F8 .dbline 217
01F8 ; _NOP();
01F8 0000 nop
01FA .dbline 218
01FA ; return(TWSR&0b11111000);
01FA 01B1 in R16,0x1
01FC 087F andi R16,248
01FE .dbline -2
01FE L46:
01FE .dbline 0 ; func end
01FE 0895 ret
0200 .dbsym r a 16 c
0200 .dbend
0200 .dbfunc e i2crd _i2crd fc
.even
0200 _i2crd::
0200 .dbline -1
0200 .dbline 224
0200 ; }
0200 ;
0200 ; //i2c读要调用的函数
0200 ; //从器件读出一个字节
0200 ; uchar i2crd(void)
0200 ; {
0200 .dbline 225
0200 ; TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN);
0200 84EC ldi R24,196
0202 86BF out 0x36,R24
0204 L51:
0204 .dbline 226
0204 L52:
0204 .dbline 226
0204 ; while (!(TWCR & BIT(TWINT)));
0204 26B6 in R2,0x36
0206 27FE sbrs R2,7
0208 FDCF rjmp L51
020A .dbline 227
020A ; return(TWDR);
020A 03B1 in R16,0x3
020C .dbline -2
020C L50:
020C .dbline 0 ; func end
020C 0895 ret
020E .dbend
020E .dbfunc e i2cstop _i2cstop fV
.even
020E _i2cstop::
020E .dbline -1
020E .dbline 234
020E ;
020E ; }
020E ;
020E ;
020E ; //总线上起动停止条件
020E ; void i2cstop(void)
020E ; {
020E .dbline 235
020E ; TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
020E 84E9 ldi R24,148
0210 86BF out 0x36,R24
0212 .dbline -2
0212 L54:
0212 .dbline 0 ; func end
0212 0895 ret
0214 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\学习专区\AVR专区\个人创作区\AVR单片机开发平台\EEPROM读写演示程序\24Cxx.C
0000 _syserr::
0000 .blkb 1
0001 .dbsym e syserr _syserr c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -