📄 i2c.lis
字号:
0100 .dbline 89
0100 .dbline 89
0100 .dbline 90
0100 ; SDA_1;
0100 .dbline 90
0100 A99A sbi 0x15,1
0102 .dbline 90
0102 02E0 ldi R16,2
0104 10E0 ldi R17,0
0106 0E940000 xcall _Delay_us
010A .dbline 90
010A .dbline 90
010A .dbline -2
010A L11:
010A .dbline 0 ; func end
010A 0895 ret
010C .dbend
010C .dbfunc e IICNoAck _IICNoAck fV
.even
010C _IICNoAck::
010C .dbline -1
010C .dbline 95
010C ; }
010C ; //=======================================================================
010C ; //不对IIC总线产生应答。读I2C设备时,如果下一步不需要读则产生1应答(即不应答)。
010C ; void IICNoAck(void)
010C ; {
010C .dbline 96
010C ; SDA_1;
010C .dbline 96
010C A99A sbi 0x15,1
010E .dbline 96
010E 02E0 ldi R16,2
0110 10E0 ldi R17,0
0112 0E940000 xcall _Delay_us
0116 .dbline 96
0116 .dbline 96
0116 .dbline 97
0116 ; SCL_1;
0116 .dbline 97
0116 A89A sbi 0x15,0
0118 .dbline 97
0118 02E0 ldi R16,2
011A 10E0 ldi R17,0
011C 0E940000 xcall _Delay_us
0120 .dbline 97
0120 .dbline 97
0120 .dbline 98
0120 ; SCL_0;
0120 .dbline 98
0120 A898 cbi 0x15,0
0122 .dbline 98
0122 02E0 ldi R16,2
0124 10E0 ldi R17,0
0126 0E940000 xcall _Delay_us
012A .dbline 98
012A .dbline 98
012A .dbline -2
012A L12:
012A .dbline 0 ; func end
012A 0895 ret
012C .dbend
012C .dbfunc e IICSendByte _IICSendByte fV
012C ; j -> R20
012C ; sendbyte -> R22
.even
012C _IICSendByte::
012C 0E940000 xcall push_gset2
0130 602F mov R22,R16
0132 .dbline -1
0132 .dbline 103
0132 ; }
0132 ; //=======================================================================
0132 ; //向IIC总线写数据。SCL=0时SDA的数据可改变,SCL=1时需保持SDA数据稳定。
0132 ; void IICSendByte(unsigned char sendbyte)
0132 ; {
0132 .dbline 104
0132 ; uint8 j=8;
0132 48E0 ldi R20,8
0134 .dbline 105
0134 ; for(;j>0;j--)
0134 19C0 xjmp L17
0136 L14:
0136 .dbline 106
0136 ; {
0136 .dbline 107
0136 ; SCL_0;
0136 .dbline 107
0136 A898 cbi 0x15,0
0138 .dbline 107
0138 02E0 ldi R16,2
013A 10E0 ldi R17,0
013C 0E940000 xcall _Delay_us
0140 .dbline 107
0140 .dbline 107
0140 .dbline 109
0140 ;
0140 ; if(sendbyte&0x80) SDA_1 //SCL=0时写数据到SDA
0140 67FF sbrs R22,7
0142 06C0 rjmp L18
0144 .dbline 109
0144 .dbline 109
0144 A99A sbi 0x15,1
0146 .dbline 109
0146 02E0 ldi R16,2
0148 10E0 ldi R17,0
014A 0E940000 xcall _Delay_us
014E .dbline 109
014E 05C0 xjmp L19
0150 L18:
0150 .dbline 110
0150 ; else SDA_0
0150 .dbline 110
0150 A998 cbi 0x15,1
0152 .dbline 110
0152 02E0 ldi R16,2
0154 10E0 ldi R17,0
0156 0E940000 xcall _Delay_us
015A .dbline 110
015A L19:
015A .dbline 112
015A 660F lsl R22
015C .dbline 114
015C .dbline 114
015C A89A sbi 0x15,0
015E .dbline 114
015E 02E0 ldi R16,2
0160 10E0 ldi R17,0
0162 0E940000 xcall _Delay_us
0166 .dbline 114
0166 .dbline 114
0166 .dbline 115
0166 L15:
0166 .dbline 105
0166 4A95 dec R20
0168 L17:
0168 .dbline 105
0168 2224 clr R2
016A 2416 cp R2,R20
016C 20F3 brlo L14
016E .dbline 116
016E ;
016E ; sendbyte<<=1;
016E ;
016E ; SCL_1;
016E ; }
016E ; SCL_0;
016E .dbline 116
016E A898 cbi 0x15,0
0170 .dbline 116
0170 02E0 ldi R16,2
0172 10E0 ldi R17,0
0174 0E940000 xcall _Delay_us
0178 .dbline 116
0178 .dbline 116
0178 .dbline -2
0178 L13:
0178 0E940000 xcall pop_gset2
017C .dbline 0 ; func end
017C 0895 ret
017E .dbsym r j 20 c
017E .dbsym r sendbyte 22 c
017E .dbend
017E .dbfunc e sta_ReadDevice _sta_ReadDevice fc
017E ; ErrorCount -> R22
017E ; data -> R20
017E ; device -> R10
017E ; subAddr -> R12
.even
017E _sta_ReadDevice::
017E 0E940000 xcall push_gset4
0182 A22E mov R10,R18
0184 C02E mov R12,R16
0186 .dbline -1
0186 .dbline 122
0186 ; }
0186 ;
0186 ; //=======================================================================
0186 ; //通过I2C读STA013
0186 ; unsigned char sta_ReadDevice(unsigned char subAddr,uint8 device)
0186 ; {
0186 .dbline 123
0186 ; uint8 data,ErrorCount=10;
0186 6AE0 ldi R22,10
0188 19C0 xjmp L22
018A L21:
018A .dbline 127
018A ; //Delay_us(1200);
018A ;
018A ; while(ErrorCount--)
018A ; {
018A .dbline 128
018A ; IICStart();
018A 3DDF xcall _IICStart
018C .dbline 129
018C ; IICSendByte(device);
018C 0A2D mov R16,R10
018E CEDF xcall _IICSendByte
0190 .dbline 131
0190 ;
0190 ; if(IICRecAck()) continue; //如果为非0应答,重复写
0190 69DF xcall _IICRecAck
0192 0023 tst R16
0194 09F0 breq L24
0196 .dbline 131
0196 12C0 xjmp L22
0198 L24:
0198 .dbline 133
0198 ;
0198 ; IICSendByte(subAddr);
0198 0C2D mov R16,R12
019A C8DF xcall _IICSendByte
019C .dbline 134
019C ; if(IICRecAck()) continue; //如果为非0应答,重复写
019C 63DF xcall _IICRecAck
019E 0023 tst R16
01A0 09F0 breq L26
01A2 .dbline 134
01A2 0CC0 xjmp L22
01A4 L26:
01A4 .dbline 135
01A4 ; IICStart();
01A4 30DF xcall _IICStart
01A6 .dbline 136
01A6 ; IICSendByte(device | 0x01);
01A6 0A2D mov R16,R10
01A8 0160 ori R16,1
01AA C0DF xcall _IICSendByte
01AC .dbline 137
01AC ; if(IICRecAck()) continue;
01AC 5BDF xcall _IICRecAck
01AE 0023 tst R16
01B0 09F0 breq L28
01B2 .dbline 137
01B2 04C0 xjmp L22
01B4 L28:
01B4 .dbline 140
01B4 76DF xcall _IICReceiveByte
01B6 402F mov R20,R16
01B8 .dbline 141
01B8 A9DF xcall _IICNoAck
01BA .dbline 142
01BA 05C0 xjmp L23
01BC L22:
01BC .dbline 126
01BC 262E mov R2,R22
01BE 3324 clr R3
01C0 6150 subi R22,1
01C2 2220 tst R2
01C4 11F7 brne L21
01C6 L23:
01C6 .dbline 144
01C6 ;
01C6 ;
01C6 ; data=IICReceiveByte(); //读数据,并发出1应答,表示不再读。
01C6 ; IICNoAck();
01C6 ; break;
01C6 ; }
01C6 ; IICStop();
01C6 39DF xcall _IICStop
01C8 .dbline 145
01C8 ; return data;
01C8 042F mov R16,R20
01CA .dbline -2
01CA L20:
01CA 0E940000 xcall pop_gset4
01CE .dbline 0 ; func end
01CE 0895 ret
01D0 .dbsym r ErrorCount 22 c
01D0 .dbsym r data 20 c
01D0 .dbsym r device 10 c
01D0 .dbsym r subAddr 12 c
01D0 .dbend
01D0 .dbfunc e i2c_Write _i2c_Write fV
01D0 ; ErrorCount -> R20
01D0 ; data -> R22
01D0 ; device -> R10
01D0 ; subAddr -> R12
.even
01D0 _i2c_Write::
01D0 0E940000 xcall push_gset4
01D4 A22E mov R10,R18
01D6 C02E mov R12,R16
01D8 6885 ldd R22,y+8
01DA .dbline -1
01DA .dbline 151
01DA ; }
01DA ;
01DA ; //=======================================================================
01DA ; //通过I2C向STA013发送数据
01DA ; void i2c_Write(unsigned char subAddr,unsigned char device,unsigned char data)
01DA ; {
01DA .dbline 152
01DA ; uint8 ErrorCount=10;
01DA 4AE0 ldi R20,10
01DC 11C0 xjmp L32
01DE L31:
01DE .dbline 155
01DE ;
01DE ; while(ErrorCount--)
01DE ; {
01DE .dbline 156
01DE ; IICStart();
01DE 13DF xcall _IICStart
01E0 .dbline 157
01E0 ; IICSendByte(device);
01E0 0A2D mov R16,R10
01E2 A4DF xcall _IICSendByte
01E4 .dbline 158
01E4 ; if(IICRecAck()) continue; //如果为非0应答,重复写
01E4 3FDF xcall _IICRecAck
01E6 0023 tst R16
01E8 09F0 breq L34
01EA .dbline 158
01EA 0AC0 xjmp L32
01EC L34:
01EC .dbline 159
01EC ; IICSendByte(subAddr);
01EC 0C2D mov R16,R12
01EE 9EDF xcall _IICSendByte
01F0 .dbline 160
01F0 ; if(IICRecAck()) continue; //如果为非0应答,重复写
01F0 39DF xcall _IICRecAck
01F2 0023 tst R16
01F4 09F0 breq L36
01F6 .dbline 160
01F6 04C0 xjmp L32
01F8 L36:
01F8 .dbline 162
01F8 062F mov R16,R22
01FA 98DF xcall _IICSendByte
01FC .dbline 163
01FC 72DF xcall _IICACK
01FE .dbline 165
01FE 05C0 xjmp L33
0200 L32:
0200 .dbline 154
0200 242E mov R2,R20
0202 3324 clr R3
0204 4150 subi R20,1
0206 2220 tst R2
0208 51F7 brne L31
020A L33:
020A .dbline 168
020A ;
020A ; IICSendByte(data);
020A ; IICACK();
020A ;
020A ; break;
020A ; }
020A ;
020A ; IICStop();
020A 17DF xcall _IICStop
020C .dbline -2
020C L30:
020C 0E940000 xcall pop_gset4
0210 .dbline 0 ; func end
0210 0895 ret
0212 .dbsym r ErrorCount 20 c
0212 .dbsym r data 22 c
0212 .dbsym r device 10 c
0212 .dbsym r subAddr 12 c
0212 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -