📄 i2c.lis
字号:
0062 .dbend
0062 .dbfunc e Read_I2C_Byte _Read_I2C_Byte fc
0062 ; i -> R20
0062 ; buff -> R22
.even
0062 _Read_I2C_Byte::
0062 00D0 rcall push_gset2
0064 .dbline -1
0064 .dbline 124
0064 ; }
0064 ; }
0064 ;
0064 ;
0064 ;
0064 ;
0064 ;
0064 ; // ********************************************************* //
0064 ; // *** This routine will read a byte from the I2C device *** //
0064 ; // ********************************************************* //
0064 ;
0064 ; unsigned char Read_I2C_Byte(void)
0064 ; {
0064 .dbline 125
0064 ; unsigned char i,buff = 0;
0064 6627 clr R22
0066 .dbline 127
0066 4427 clr R20
0068 0AC0 rjmp L21
006A L18:
006A .dbline 127
006A ;
006A ; for (i = 0; i < 8; i++){
006A .dbline 129
006A ;
006A ; buff = buff << 1;
006A 660F lsl R22
006C .dbline 131
006C ;
006C ; CLEARBIT(I2C_DIR,SDA); // Set SDA to input
006C 3C98 cbi 0x7,4
006E .dbline 133
006E ;
006E ; SETBIT(I2C_PORT,SCL); // Set SCL High,Clock bit out
006E 459A sbi 0x8,5
0070 .dbline 136
0070 ; // NOP();
0070 ; // NOP();
0070 ; NOP();
0070 0000 nop
0072 .dbline 139
0072 ;
0072 ; // Read data on SDA pin
0072 ; if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01;
0072 349B sbis 0x6,4
0074 01C0 rjmp L22
0076 .dbline 139
0076 6160 ori R22,1
0078 L22:
0078 .dbline 141
0078 4598 cbi 0x8,5
007A .dbline 145
007A 0000 nop
007C .dbline 146
007C L19:
007C .dbline 127
007C 4395 inc R20
007E L21:
007E .dbline 127
007E 4830 cpi R20,8
0080 A0F3 brlo L18
0082 .dbline 150
0082 ;
0082 ; CLEARBIT(I2C_PORT,SCL); // Clear SCL
0082 ;
0082 ; // NOP();
0082 ; // NOP();
0082 ; NOP();
0082 ; }
0082 ;
0082 ; // *** No ACK *** //
0082 ;
0082 ; I2C_Clock(); // Clock I2C bit
0082 CEDF rcall _I2C_Clock
0084 .dbline 152
0084 ;
0084 ; return buff; // Return our I2C byte
0084 062F mov R16,R22
0086 .dbline -2
0086 L17:
0086 00D0 rcall pop_gset2
0088 .dbline 0 ; func end
0088 0895 ret
008A .dbsym r i 20 c
008A .dbsym r buff 22 c
008A .dbend
008A .dbfunc e I2C_Ackn _I2C_Ackn fc
008A ; Ackn -> R16
.even
008A _I2C_Ackn::
008A .dbline -1
008A .dbline 163
008A ; }
008A ;
008A ;
008A ;
008A ;
008A ; // *********************************************************************** //
008A ; // *** This routine returns a 0 if the I2C device sends an acknowledge *** //
008A ; // *********************************************************************** //
008A ;
008A ; unsigned char I2C_Ackn(void)
008A ; {
008A .dbline 164
008A ; unsigned char Ackn = 0; // Temp RAM for Ackn flag
008A 0027 clr R16
008C .dbline 166
008C ;
008C ; CLEARBIT(I2C_PORT,SCL);
008C 4598 cbi 0x8,5
008E .dbline 167
008E ; CLEARBIT(I2C_DIR,SDA); // Set SDA to input
008E 3C98 cbi 0x7,4
0090 .dbline 169
0090 ;
0090 ; SETBIT(I2C_PORT,SCL); // Clock the ACK bit
0090 459A sbi 0x8,5
0092 .dbline 171
0092 ;
0092 ; if ( CHECKBIT( I2C_IN,SDA ) ) Ackn = 1; // Check the ACK bit on SDA
0092 349B sbis 0x6,4
0094 01C0 rjmp L25
0096 .dbline 171
0096 01E0 ldi R16,1
0098 L25:
0098 .dbline 173
0098 ;
0098 ; CLEARBIT(I2C_PORT,SCL); // Clear the clock
0098 4598 cbi 0x8,5
009A .dbline 175
009A ;
009A ; return Ackn; // Return our ACK bit
009A .dbline -2
009A L24:
009A .dbline 0 ; func end
009A 0895 ret
009C .dbsym r Ackn 16 c
009C .dbend
009C .dbfunc e I2C_Write _I2C_Write fV
009C ; Data -> R20
009C ; M_ADD -> R22
.even
009C _I2C_Write::
009C 00D0 rcall push_gset2
009E 422F mov R20,R18
00A0 602F mov R22,R16
00A2 .dbline -1
00A2 .dbline 182
00A2 ; }
00A2 ;
00A2 ;
00A2 ;
00A2 ;
00A2 ; void I2C_Write(unsigned char M_ADD, unsigned char Data)
00A2 ; {
00A2 .dbline 183
00A2 ; I2C_Start(); // Set I2C start condition
00A2 B3DF rcall _I2C_Start
00A4 .dbline 185
00A4 ;
00A4 ; Write_I2C_Byte(0x64); // Send the EEPROM internal Address
00A4 04E6 ldi R16,100
00A6 C0DF rcall _Write_I2C_Byte
00A8 .dbline 187
00A8 ;
00A8 ; Write_I2C_Byte(M_ADD); // Send the EEPROM internal Address
00A8 062F mov R16,R22
00AA BEDF rcall _Write_I2C_Byte
00AC .dbline 189
00AC ;
00AC ; Write_I2C_Byte(Data); // Send the EEPROM Data
00AC 042F mov R16,R20
00AE BCDF rcall _Write_I2C_Byte
00B0 .dbline 191
00B0 ;
00B0 ; I2C_Stop(); // Set I2C Stop condition
00B0 B1DF rcall _I2C_Stop
00B2 .dbline -2
00B2 L27:
00B2 00D0 rcall pop_gset2
00B4 .dbline 0 ; func end
00B4 0895 ret
00B6 .dbsym r Data 20 c
00B6 .dbsym r M_ADD 22 c
00B6 .dbend
00B6 .dbfunc e I2C_Read _I2C_Read fc
00B6 ; Temp -> R20
00B6 ; M_ADD -> R20
.even
00B6 _I2C_Read::
00B6 00D0 rcall push_gset1
00B8 402F mov R20,R16
00BA .dbline -1
00BA .dbline 198
00BA ; }
00BA ;
00BA ;
00BA ;
00BA ;
00BA ; ubyte I2C_Read(unsigned char M_ADD)
00BA ; {
00BA .dbline 201
00BA ; ubyte Temp; // Temp RAM for EEPROM Read
00BA ;
00BA ; I2C_Start(); // Set I2C start condition
00BA A7DF rcall _I2C_Start
00BC .dbline 203
00BC ;
00BC ; Write_I2C_Byte(0x64); // Send the EEPROM internal Address
00BC 04E6 ldi R16,100
00BE B4DF rcall _Write_I2C_Byte
00C0 .dbline 205
00C0 ;
00C0 ; Write_I2C_Byte(M_ADD); // Send the EEPROM internal Address
00C0 042F mov R16,R20
00C2 B2DF rcall _Write_I2C_Byte
00C4 .dbline 207
00C4 ;
00C4 ; I2C_Start(); // Set I2C start condition
00C4 A2DF rcall _I2C_Start
00C6 .dbline 209
00C6 ;
00C6 ; Write_I2C_Byte(0x65); // Send the EEPROM internal Address
00C6 05E6 ldi R16,101
00C8 AFDF rcall _Write_I2C_Byte
00CA .dbline 211
00CA ;
00CA ; Temp = Read_I2C_Byte(); // Read data from EEPROM
00CA CBDF rcall _Read_I2C_Byte
00CC 402F mov R20,R16
00CE .dbline 213
00CE ;
00CE ; I2C_Stop(); // Set I2C Stop condition
00CE A2DF rcall _I2C_Stop
00D0 .dbline 215
00D0 ;
00D0 ; return Temp; // Return data from EEPROM
00D0 042F mov R16,R20
00D2 .dbline -2
00D2 L28:
00D2 00D0 rcall pop_gset1
00D4 .dbline 0 ; func end
00D4 0895 ret
00D6 .dbsym r Temp 20 c
00D6 .dbsym r M_ADD 20 c
00D6 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -