📄 24cxx.lis
字号:
013C L19:
013C .dbline 134
013C ;
013C ; i2cstop();
013C 41D0 xcall _i2cstop
013E .dbline -2
013E L17:
013E 0E940000 xcall pop_gset4
0142 .dbline 0 ; func end
0142 0895 ret
0144 .dbsym r t 10 c
0144 .dbsym r num 22 i
0144 .dbsym r ad_rsc 12 i
0144 .dbsym r p_dst 20 pc
0144 .dbend
0144 .dbfunc e wt24c_fc _wt24c_fc fpc
0144 ; t -> R12
0144 ; n -> R22
0144 ; ad -> R10,R11
0144 ; p -> R20,R21
.even
0144 _wt24c_fc::
0144 0E940000 xcall push_gset4
0148 5901 movw R10,R18
014A A801 movw R20,R16
014C 6885 ldd R22,y+8
014E .dbline -1
014E .dbline 143
014E ;
014E ; }
014E ;
014E ;
014E ;
014E ; //向24Cxx写入数据wt24c_h()所要调用的函数
014E ; //返回写入n个字节后的主机内存指针
014E ; uchar * wt24c_fc(uchar *p, uint ad, uchar n)
014E ; { uchar t=0;
014E .dbline 143
014E CC24 clr R12
0150 .dbline 146
0150 ;
0150 ; #if e2prom<32
0150 ; t=ad>>8;
0150 6501 movw R12,R10
0152 CD2C mov R12,R13
0154 DD24 clr R13
0156 .dbline 147
0156 ; t<<=1;
0156 CC0C lsl R12
0158 .dbline 150
0158 ; #endif
0158 ;
0158 ; i2cstart(); //发送起始信号
0158 1CD0 xcall _i2cstart
015A .dbline 152
015A ;
015A ; if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
015A 0C2D mov R16,R12
015C 0056 subi R16,96 ; addi 160
015E 1FD0 xcall _i2cwt
0160 0831 cpi R16,24
0162 69F4 brne L25
0164 .dbline 153
0164 ; {
0164 .dbline 157
0164 ; #if e2prom>16
0164 ; i2cwt(ad>>8); //ad_dst的高位到器件
0164 ; #endif
0164 ; i2cwt(ad); //ad_dst的低位到器件
0164 0A2D mov R16,R10
0166 1BD0 xcall _i2cwt
0168 .dbline 159
0168 ;
0168 ; for(;n>0;n--) //发送要写入的数据
0168 06C0 xjmp L30
016A L27:
016A .dbline 160
016A .dbline 160
016A FA01 movw R30,R20
016C 0081 ldd R16,z+0
016E 17D0 xcall _i2cwt
0170 .dbline 161
0170 4F5F subi R20,255 ; offset = 1
0172 5F4F sbci R21,255
0174 .dbline 162
0174 L28:
0174 .dbline 159
0174 6A95 dec R22
0176 L30:
0176 .dbline 159
0176 2224 clr R2
0178 2616 cp R2,R22
017A B8F3 brlo L27
017C .dbline 163
017C ; { i2cwt(*p);
017C ; p++;
017C ; }
017C ; }
017C 03C0 xjmp L26
017E L25:
017E .dbline 164
017E ; else syserr=ERR_SLAW; //写字节命令及器件地址错
017E 8AE0 ldi R24,10
0180 80930000 sts _syserr,R24
0184 L26:
0184 .dbline 166
0184 ;
0184 ; i2cstop();
0184 1DD0 xcall _i2cstop
0186 .dbline 167
0186 ; tms(6); //延时6ms
0186 06E0 ldi R16,6
0188 2DD0 xcall _tms
018A .dbline 169
018A ;
018A ; return(p);
018A 8A01 movw R16,R20
018C .dbline -2
018C L24:
018C 0E940000 xcall pop_gset4
0190 .dbline 0 ; func end
0190 0895 ret
0192 .dbsym r t 12 c
0192 .dbsym r n 22 c
0192 .dbsym r ad 10 i
0192 .dbsym r p 20 pc
0192 .dbend
0192 .dbfunc e i2cstart _i2cstart fV
.even
0192 _i2cstart::
0192 .dbline -1
0192 .dbline 178
0192 ; }
0192 ;
0192 ;
0192 ;
0192 ; //-------------------------------以下为其它I2总线器件可调用的函数--------------------------
0192 ;
0192 ; //总线上起动开始条件
0192 ; void i2cstart(void)
0192 ; {
0192 .dbline 179
0192 ; TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
0192 84EA ldi R24,164
0194 86BF out 0x36,R24
0196 L32:
0196 .dbline 180
0196 L33:
0196 .dbline 180
0196 ; while (!(TWCR & BIT(TWINT)));
0196 26B6 in R2,0x36
0198 27FE sbrs R2,7
019A FDCF rjmp L32
019C .dbline -2
019C L31:
019C .dbline 0 ; func end
019C 0895 ret
019E .dbend
019E .dbfunc e i2cwt _i2cwt fc
019E ; a -> R16
.even
019E _i2cwt::
019E .dbline -1
019E .dbline 185
019E ; }
019E ;
019E ; //把一个字节数据输入器件, 返回TWI状态
019E ; uchar i2cwt(uchar a)
019E ; {
019E .dbline 186
019E ; TWDR = a;
019E 03B9 out 0x3,R16
01A0 .dbline 187
01A0 ; TWCR = BIT(TWINT) | BIT(TWEN);
01A0 84E8 ldi R24,132
01A2 86BF out 0x36,R24
01A4 L36:
01A4 .dbline 188
01A4 L37:
01A4 .dbline 188
01A4 ; while (!(TWCR & BIT(TWINT)));
01A4 26B6 in R2,0x36
01A6 27FE sbrs R2,7
01A8 FDCF rjmp L36
01AA .dbline 189
01AA ; _NOP();
01AA 0000 nop
01AC .dbline 190
01AC ; return(TWSR&0b11111000);
01AC 01B1 in R16,0x1
01AE 087F andi R16,248
01B0 .dbline -2
01B0 L35:
01B0 .dbline 0 ; func end
01B0 0895 ret
01B2 .dbsym r a 16 c
01B2 .dbend
01B2 .dbfunc e i2crd _i2crd fc
.even
01B2 _i2crd::
01B2 .dbline -1
01B2 .dbline 196
01B2 ; }
01B2 ;
01B2 ; //i2c读要调用的函数
01B2 ; //从器件读出一个字节
01B2 ; uchar i2crd(void)
01B2 ; {
01B2 .dbline 197
01B2 ; TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN);
01B2 84EC ldi R24,196
01B4 86BF out 0x36,R24
01B6 L40:
01B6 .dbline 198
01B6 L41:
01B6 .dbline 198
01B6 ; while (!(TWCR & BIT(TWINT)));
01B6 26B6 in R2,0x36
01B8 27FE sbrs R2,7
01BA FDCF rjmp L40
01BC .dbline 199
01BC ; return(TWDR);
01BC 03B1 in R16,0x3
01BE .dbline -2
01BE L39:
01BE .dbline 0 ; func end
01BE 0895 ret
01C0 .dbend
01C0 .dbfunc e i2cstop _i2cstop fV
.even
01C0 _i2cstop::
01C0 .dbline -1
01C0 .dbline 205
01C0 ; }
01C0 ;
01C0 ;
01C0 ; //总线上起动停止条件
01C0 ; void i2cstop(void)
01C0 ; {
01C0 .dbline 206
01C0 ; TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
01C0 84E9 ldi R24,148
01C2 86BF out 0x36,R24
01C4 .dbline -2
01C4 L43:
01C4 .dbline 0 ; func end
01C4 0895 ret
01C6 .dbend
01C6 .dbfunc e Delay100us _Delay100us fV
01C6 ; i -> R20
01C6 ; x -> R16
.even
01C6 _Delay100us::
01C6 0E940000 xcall push_gset1
01CA .dbline -1
01CA .dbline 211
01CA ; }
01CA ; //************************************************************************/
01CA ; //延时函数 古欣添加
01CA ; void Delay100us(uchar x)
01CA ; {
01CA .dbline 213
01CA ; uchar i; //4clock
01CA ; for(i=147;x!=0;x--)
01CA 43E9 ldi R20,147
01CC 06C0 xjmp L48
01CE L49:
01CE .dbline 214
01CE L50:
01CE .dbline 214
01CE 842F mov R24,R20
01D0 8150 subi R24,1
01D2 482F mov R20,R24
01D4 8823 tst R24
01D6 D9F7 brne L49
01D8 L46:
01D8 .dbline 213
01D8 0A95 dec R16
01DA L48:
01DA .dbline 213
01DA 0023 tst R16
01DC C1F7 brne L50
01DE .dbline -2
01DE L44:
01DE 0E940000 xcall pop_gset1
01E2 .dbline 0 ; func end
01E2 0895 ret
01E4 .dbsym r i 20 c
01E4 .dbsym r x 16 c
01E4 .dbend
01E4 .dbfunc e tms _tms fV
01E4 ; n -> R20
.even
01E4 _tms::
01E4 0E940000 xcall push_gset1
01E8 402F mov R20,R16
01EA .dbline -1
01EA .dbline 217
01EA ; while(--i); //5 * i clock
01EA ; }
01EA ; void tms(uchar n)
01EA ; {
01EA .dbline 218
01EA 03C0 xjmp L56
01EC L53:
01EC .dbline 218
01EC .dbline 219
01EC 0AE0 ldi R16,10
01EE EBDF xcall _Delay100us
01F0 .dbline 220
01F0 L54:
01F0 .dbline 218
01F0 4A95 dec R20
01F2 L56:
01F2 .dbline 218
01F2 ; for (;n!=0;n--){
01F2 4423 tst R20
01F4 D9F7 brne L53
01F6 .dbline -2
01F6 L52:
01F6 0E940000 xcall pop_gset1
01FA .dbline 0 ; func end
01FA 0895 ret
01FC .dbsym r n 20 c
01FC .dbend
01FC .dbfunc e Delay1s _Delay1s fV
01FC ; m -> R20,R21
.even
01FC _Delay1s::
01FC 0E940000 xcall push_gset1
0200 A801 movw R20,R16
0202 .dbline -1
0202 .dbline 223
0202 ; Delay100us(10);
0202 ; }
0202 ; }
0202 ; void Delay1s(uint m) // m <= 6 ,when m==7, it is 1.
0202 ; {
0202 .dbline 224
0202 ; m=m*40;
0202 08E2 ldi R16,40
0204 10E0 ldi R17,0
0206 9A01 movw R18,R20
0208 0E940000 xcall empy16s
020C A801 movw R20,R16
020E .dbline 225
020E 04C0 xjmp L61
0210 L58:
0210 .dbline 225
0210 .dbline 226
0210 0AEF ldi R16,250
0212 D9DF xcall _Delay100us
0214 .dbline 227
0214 L59:
0214 .dbline 225
0214 4150 subi R20,1
0216 5040 sbci R21,0
0218 L61:
0218 .dbline 225
0218 ; for (;m!=0;m--){
0218 4030 cpi R20,0
021A 4507 cpc R20,R21
021C C9F7 brne L58
021E X5:
021E .dbline -2
021E L57:
021E 0E940000 xcall pop_gset1
0222 .dbline 0 ; func end
0222 0895 ret
0224 .dbsym r m 20 i
0224 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -