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

📄 i2c.lis

📁 AVR单片机C语言程序设计实例精粹
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0094                   .dbline 122
 0094           ;       I2C_Set_SCL(0);
 0094 0027              clr R16
 0096 C4DF              xcall _I2C_Set_SCL
 0098                   .dbline 123
 0098           ;       DIR_REG_I2C |= (1 << SDA_BIT_I2C);
 0098 B99A              sbi 0x17,1
 009A                   .dbline 124
 009A           ;       Delayms(100);
 009A 04E6              ldi R16,100
 009C 10E0              ldi R17,0
 009E B0DF              xcall _Delayms
 00A0                   .dbline -2
 00A0                   .dbline 125
 00A0           ; }
 00A0           L13:
 00A0 0E940000          xcall pop_gset2
 00A4                   .dbline 0 ; func end
 00A4 0895              ret
 00A6                   .dbsym r cnt 20 c
 00A6                   .dbsym r data 22 c
 00A6                   .dbend
 00A6                   .dbfunc e I2C_Receive_Byte _I2C_Receive_Byte fc
 00A6           ;            cnt -> R20
 00A6           ;           data -> R22
                        .even
 00A6           _I2C_Receive_Byte::
 00A6 0E940000          xcall push_gset2
 00AA                   .dbline -1
 00AA                   .dbline 134
 00AA           ; 
 00AA           ; //***************************************************************
 00AA           ; // Function    : I2C_Receive_Byte
 00AA           ; // Input       : none
 00AA           ; // Output      : Receive a byte from I2C Bus
 00AA           ; // Description : Receive a byte on I2C Bus with the MSB first.
 00AA           ; //***************************************************************
 00AA           ; INT8U I2C_Receive_Byte(void)
 00AA           ; {
 00AA                   .dbline 135
 00AA           ;       INT8U data = 0;
 00AA 6627              clr R22
 00AC                   .dbline 136
 00AC           ;       INT8U cnt = 0;
 00AC 4427              clr R20
 00AE                   .dbline 137
 00AE           ;       DIR_REG_I2C &= ~(1 << SDA_BIT_I2C);
 00AE B998              cbi 0x17,1
 00B0                   .dbline 138
 00B0           ;       PORT_REG_I2C |= (1 << SDA_BIT_I2C);
 00B0 C19A              sbi 0x18,1
 00B2                   .dbline 139
 00B2           ;       for(cnt = 0; cnt < 8;cnt++)
 00B2 09C0              xjmp L26
 00B4           L23:
 00B4                   .dbline 140
 00B4           ;       {
 00B4                   .dbline 141
 00B4           ;         I2C_Set_SCL(0);
 00B4 0027              clr R16
 00B6 B4DF              xcall _I2C_Set_SCL
 00B8                   .dbline 142
 00B8           ;         I2C_Set_SCL(1);
 00B8 01E0              ldi R16,1
 00BA B2DF              xcall _I2C_Set_SCL
 00BC                   .dbline 143
 00BC           ;         data = data << 1;
 00BC 660F              lsl R22
 00BE                   .dbline 144
 00BE           ;               if(PIN_REG_I2C & (1 << SDA_BIT_I2C))
 00BE B19B              sbis 0x16,1
 00C0 01C0              rjmp L27
 00C2                   .dbline 145
 00C2           ;               {
 00C2                   .dbline 146
 00C2           ;                       data |= 0x01;
 00C2 6160              ori R22,1
 00C4                   .dbline 147
 00C4           ;               }
 00C4           L27:
 00C4                   .dbline 148
 00C4           L24:
 00C4                   .dbline 139
 00C4 4395              inc R20
 00C6           L26:
 00C6                   .dbline 139
 00C6 4830              cpi R20,8
 00C8 A8F3              brlo L23
 00CA                   .dbline 149
 00CA           ;       }
 00CA           ;       I2C_Set_SCL(0);
 00CA 0027              clr R16
 00CC A9DF              xcall _I2C_Set_SCL
 00CE                   .dbline 150
 00CE           ;       DIR_REG_I2C |= (1 << SDA_BIT_I2C);
 00CE B99A              sbi 0x17,1
 00D0                   .dbline 151
 00D0           ;       return(data);
 00D0 062F              mov R16,R22
 00D2                   .dbline -2
 00D2           L22:
 00D2 0E940000          xcall pop_gset2
 00D6                   .dbline 0 ; func end
 00D6 0895              ret
 00D8                   .dbsym r cnt 20 c
 00D8                   .dbsym r data 22 c
 00D8                   .dbend
 00D8                   .dbfunc e I2C_Ack _I2C_Ack fV
 00D8           ;            ack -> R20
                        .even
 00D8           _I2C_Ack::
 00D8 0E940000          xcall push_gset1
 00DC 402F              mov R20,R16
 00DE                   .dbline -1
 00DE                   .dbline 161
 00DE           ; }
 00DE           ; 
 00DE           ; //***************************************************************
 00DE           ; // Function    : I2C_Ack
 00DE           ; // Input       : ack - Whether to ACK the transmitter
 00DE           ; // Output      : none
 00DE           ; // Description : Acknowledge the transmitter with 0 or 1
 00DE           ; //***************************************************************
 00DE           ; void I2C_Ack(INT8U ack)
 00DE           ; {
 00DE                   .dbline 162
 00DE           ;       if(ack == 0)
 00DE 4423              tst R20
 00E0 19F4              brne L30
 00E2                   .dbline 163
 00E2           ;       {
 00E2                   .dbline 164
 00E2           ;               I2C_Set_SDA(0);
 00E2 0027              clr R16
 00E4 97DF              xcall _I2C_Set_SDA
 00E6                   .dbline 165
 00E6           ;       }
 00E6 02C0              xjmp L31
 00E8           L30:
 00E8                   .dbline 167
 00E8           ;       else
 00E8           ;       {
 00E8                   .dbline 168
 00E8           ;               I2C_Set_SDA(1);
 00E8 01E0              ldi R16,1
 00EA 94DF              xcall _I2C_Set_SDA
 00EC                   .dbline 169
 00EC           ;       }
 00EC           L31:
 00EC                   .dbline 170
 00EC           ;       I2C_Set_SCL(1);
 00EC 01E0              ldi R16,1
 00EE 98DF              xcall _I2C_Set_SCL
 00F0                   .dbline 171
 00F0           ;       I2C_Set_SCL(0);
 00F0 0027              clr R16
 00F2 96DF              xcall _I2C_Set_SCL
 00F4                   .dbline -2
 00F4                   .dbline 172
 00F4           ; }
 00F4           L29:
 00F4 0E940000          xcall pop_gset1
 00F8                   .dbline 0 ; func end
 00F8 0895              ret
 00FA                   .dbsym r ack 20 c
 00FA                   .dbend
 00FA                   .dbfunc e I2C_Send_Data_without_SubAddress _I2C_Send_Data_without_SubAddress fc
 00FA           ;          bData -> R20
 00FA           ;        bDevice -> R22
                        .even
 00FA           _I2C_Send_Data_without_SubAddress::
 00FA 0E940000          xcall push_gset2
 00FE 422F              mov R20,R18
 0100 602F              mov R22,R16
 0102                   .dbline -1
 0102                   .dbline 182
 0102           ; 
 0102           ; //***************************************************************
 0102           ; // Function    : I2C_Send_Data_without_SubAddress
 0102           ; // Input       : bDevice - Slave Device with a I2C Address,
 0102           ; //               bData   - Data to be transmitted 
 0102           ; // Output      : I2C Operation Status - Success(1)/Fail(0)
 0102           ; // Description : Transmit a data to Slave without SubAddress
 0102           ; //***************************************************************
 0102           ; INT8U I2C_Send_Data_without_SubAddress(INT8U bDevice,INT8U bData)
 0102           ; {
 0102                   .dbline 183
 0102           ;       I2C_Start_Condition();
 0102 94DF              xcall _I2C_Start_Condition
 0104                   .dbline 184
 0104           ;       I2C_Send_Byte(bDevice);
 0104 062F              mov R16,R22
 0106 A0DF              xcall _I2C_Send_Byte
 0108                   .dbline 185
 0108           ;       if(bI2C_Ack == 0)
 0108 20900000          lds R2,_bI2C_Ack
 010C 2220              tst R2
 010E 11F4              brne L33
 0110                   .dbline 186
 0110           ;       {
 0110                   .dbline 187
 0110           ;               return(0);
 0110 0027              clr R16
 0112 0AC0              xjmp L32
 0114           L33:
 0114                   .dbline 189
 0114           ;       }
 0114           ;       I2C_Send_Byte(bData);
 0114 042F              mov R16,R20
 0116 98DF              xcall _I2C_Send_Byte
 0118                   .dbline 190
 0118           ;       if(bI2C_Ack == 0)
 0118 20900000          lds R2,_bI2C_Ack
 011C 2220              tst R2
 011E 11F4              brne L35
 0120                   .dbline 191
 0120           ;       {
 0120                   .dbline 192
 0120           ;               return(0);
 0120 0027              clr R16
 0122 02C0              xjmp L32
 0124           L35:
 0124                   .dbline 194
 0124           ;       }
 0124           ;       I2C_Stop_Condition();
 0124 8BDF              xcall _I2C_Stop_Condition
 0126                   .dbline 195
 0126           ;       return(1);
 0126 01E0              ldi R16,1
 0128                   .dbline -2
 0128           L32:
 0128 0E940000          xcall pop_gset2
 012C                   .dbline 0 ; func end
 012C 0895              ret
 012E                   .dbsym r bData 20 c
 012E                   .dbsym r bDevice 22 c
 012E                   .dbend
 012E                   .dbfunc e I2C_Send_Data_with_SubAddress _I2C_Send_Data_with_SubAddress fc
 012E           ;          bData -> y+4
 012E           ;       bAddress -> R20
 012E           ;        bDevice -> R22
                        .even
 012E           _I2C_Send_Data_with_SubAddress::
 012E 0E940000          xcall push_gset2
 0132 422F              mov R20,R18
 0134 602F              mov R22,R16
 0136                   .dbline -1
 0136                   .dbline 207
 0136           ; }
 0136           ; 
 0136           ; //***************************************************************
 0136           ; // Function    : I2C_Send_Data_with_SubAddress
 0136           ; // Input       : bDevice  - Slave Device with a I2C Address,
 0136           ; //               bAddress - SubAddress of the Slave,
 0136           ; //               bData    - Data to be transmitted 
 0136           ; // Output      : I2C Operation Status - Success(1)/Fail(0)
 0136           ; // Description : Transmit a data to Slave with SubAddress
 0136           ; //***************************************************************
 0136           ; INT8U I2C_Send_Data_with_SubAddress(INT8U bDevice,INT8U bAddress,INT8U bData)
 0136           ; {
 0136                   .dbline 208
 0136           ;       I2C_Start_Condition();
 0136 7ADF              xcall _I2C_Start_Condition
 0138                   .dbline 209
 0138           ;       I2C_Send_Byte(bDevice);
 0138 062F              mov R16,R22
 013A 86DF              xcall _I2C_Send_Byte
 013C                   .dbline 210
 013C           ;       if(bI2C_Ack == 0)
 013C 20900000          lds R2,_bI2C_Ack
 0140 2220              tst R2
 0142 11F4              brne L38
 0144                   .dbline 211
 0144           ;       {
 0144                   .dbline 212
 0144           ;               return(0);
 0144 0027              clr R16
 0146 12C0              xjmp L37
 0148           L38:
 0148                   .dbline 214
 0148           ;       }
 0148           ;       I2C_Send_Byte(bAddress);
 0148 042F              mov R16,R20
 014A 7EDF              xcall _I2C_Send_Byte
 014C                   .dbline 215
 014C           ;     if(bI2C_Ack == 0)
 014C 20900000          lds R2,_bI2C_Ack
 0150 2220              tst R2
 0152 11F4              brne L40
 0154                   .dbline 216
 0154           ;     {
 0154                   .dbline 217
 0154           ;       return(0);
 0154 0027              clr R16
 0156 0AC0              xjmp L37
 0158           L40:
 0158                   .dbline 219
 0158           ;     }
 0158           ;     I2C_Send_Byte(bData);
 0158 0C81              ldd R16,y+4
 015A 76DF              xcall _I2C_Send_Byte
 015C                   .dbline 220
 015C           ;     if(bI2C_Ack == 0)
 015C 20900000          lds R2,_bI2C_Ack
 0160 2220              tst R2
 0162 11F4              brne L42
 0164                   .dbline 221
 0164           ;     {
 0164                   .dbline 222
 0164           ;       return(0);
 0164 0027              clr R16
 0166 02C0              xjmp L37
 0168           L42:
 0168                   .dbline 224
 0168           ;     }
 0168           ;       I2C_Stop_Condition();
 0168 69DF              xcall _I2C_Stop_Condition
 016A                   .dbline 225
 016A           ;       return(1);
 016A 01E0              ldi R16,1
 016C                   .dbline -2
 016C           L37:
 016C 0E940000          xcall pop_gset2
 0170                   .dbline 0 ; func end
 0170 0895              ret
 0172                   .dbsym l bData 4 c
 0172                   .dbsym r bAddress 20 c
 0172                   .dbsym r bDevice 22 c
 0172                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -