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

📄 i2c.lis

📁 LED条屏显示程序,但是对初学者
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -