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

📄 i2c.lis

📁 AVR单片机C语言程序设计实例精粹
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module I2C.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\I2C总线应用设计\I2C.C
 0000                   .dbfunc e Delayms _Delayms fV
 0000           ;           time -> R16,R17
                        .even
 0000           _Delayms::
 0000                   .dbline -1
 0000                   .dbline 12
 0000           ; //***************************************************************
 0000           ; // File Name : I2C.C
 0000           ; // Author    : Steaven
 0000           ; // Created   : 2008-06-09
 0000           ; // Modified  : 
 0000           ; // Revision  : V0.0
 0000           ; //***************************************************************
 0000           ; 
 0000           ; #include "includes.h" 
 0000           ; 
 0000           ; void Delayms(INT16U time)
 0000           ; {
 0000 01C0              xjmp L3
 0002           L2:
 0002                   .dbline 13
 0002 0000              nop
 0004           L3:
 0004                   .dbline 13
 0004           ;       while(time--) NOP();
 0004 1801              movw R2,R16
 0006 0150              subi R16,1
 0008 1040              sbci R17,0
 000A 2220              tst R2
 000C D1F7              brne L2
 000E 3320              tst R3
 0010 C1F7              brne L2
 0012           X0:
 0012                   .dbline -2
 0012                   .dbline 14
 0012           ; }
 0012           L1:
 0012                   .dbline 0 ; func end
 0012 0895              ret
 0014                   .dbsym r time 16 i
 0014                   .dbend
                        .area data(ram, con, rel)
 0000                   .dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\I2C总线应用设计\I2C.C
 0000           _bI2C_Ack::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\I2C总线应用设计\I2C.C
 0001                   .dbsym e bI2C_Ack _bI2C_Ack c
                        .area text(rom, con, rel)
 0014                   .dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\I2C总线应用设计\I2C.C
 0014                   .dbfunc e I2C_Set_SDA _I2C_Set_SDA fV
 0014           ;           data -> R16
                        .even
 0014           _I2C_Set_SDA::
 0014                   .dbline -1
 0014                   .dbline 33
 0014           ; 
 0014           ; //I2C操作状态位,反映操作是否成功
 0014           ; INT8U bI2C_Ack = 0;
 0014           ; 
 0014           ; //引脚属性定义,便于移植
 0014           ; #define DIR_REG_I2C  DDRB
 0014           ; #define PORT_REG_I2C PORTB
 0014           ; #define PIN_REG_I2C  PINB
 0014           ; #define SCL_BIT_I2C  0
 0014           ; #define SDA_BIT_I2C  1
 0014           ; 
 0014           ; //***************************************************************
 0014           ; // Function    : I2C_Set_SDA
 0014           ; // Input       : data - SDA Pin Level
 0014           ; // Output      : none
 0014           ; // Description : Set SDA Pin Level.
 0014           ; //***************************************************************
 0014           ; void I2C_Set_SDA(INT8U data)
 0014           ; {
 0014                   .dbline 34
 0014           ;       if(data == 0)
 0014 0023              tst R16
 0016 11F4              brne L6
 0018                   .dbline 35
 0018           ;       {
 0018                   .dbline 36
 0018           ;               PORT_REG_I2C &= ~(1 << SDA_BIT_I2C);
 0018 C198              cbi 0x18,1
 001A                   .dbline 37
 001A           ;       }
 001A 01C0              xjmp L7
 001C           L6:
 001C                   .dbline 39
 001C                   .dbline 40
 001C C19A              sbi 0x18,1
 001E                   .dbline 41
 001E           L7:
 001E                   .dbline -2
 001E                   .dbline 42
 001E           ;       else
 001E           ;       {
 001E           ;               PORT_REG_I2C |= (1 << SDA_BIT_I2C);
 001E           ;       }
 001E           ; }
 001E           L5:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbsym r data 16 c
 0020                   .dbend
 0020                   .dbfunc e I2C_Set_SCL _I2C_Set_SCL fV
 0020           ;           data -> R16
                        .even
 0020           _I2C_Set_SCL::
 0020                   .dbline -1
 0020                   .dbline 51
 0020           ; 
 0020           ; //***************************************************************
 0020           ; // Function    : I2C_Set_SCL
 0020           ; // Input       : data - SCL Pin Level
 0020           ; // Output      : none
 0020           ; // Description : Set SCL Pin Level.
 0020           ; //***************************************************************
 0020           ; void I2C_Set_SCL(INT8U data)
 0020           ; {
 0020                   .dbline 52
 0020           ;       if(data == 0)
 0020 0023              tst R16
 0022 11F4              brne L9
 0024                   .dbline 53
 0024           ;       {
 0024                   .dbline 54
 0024           ;               PORT_REG_I2C &= ~(1 << SCL_BIT_I2C);
 0024 C098              cbi 0x18,0
 0026                   .dbline 55
 0026           ;       }
 0026 01C0              xjmp L10
 0028           L9:
 0028                   .dbline 57
 0028                   .dbline 58
 0028 C09A              sbi 0x18,0
 002A                   .dbline 59
 002A           L10:
 002A                   .dbline -2
 002A                   .dbline 60
 002A           ;       else
 002A           ;       {
 002A           ;               PORT_REG_I2C |= (1 << SCL_BIT_I2C);
 002A           ;       }
 002A           ; }
 002A           L8:
 002A                   .dbline 0 ; func end
 002A 0895              ret
 002C                   .dbsym r data 16 c
 002C                   .dbend
 002C                   .dbfunc e I2C_Start_Condition _I2C_Start_Condition fV
                        .even
 002C           _I2C_Start_Condition::
 002C                   .dbline -1
 002C                   .dbline 69
 002C           ; 
 002C           ; //***************************************************************
 002C           ; // Function    : I2C_Start_Condition
 002C           ; // Input       : none
 002C           ; // Output      : none
 002C           ; // Description : Generate a START Condition.
 002C           ; //***************************************************************
 002C           ; void I2C_Start_Condition(void)
 002C           ; {
 002C                   .dbline 70
 002C           ;       I2C_Set_SDA(1);
 002C 01E0              ldi R16,1
 002E F2DF              xcall _I2C_Set_SDA
 0030                   .dbline 71
 0030           ;       I2C_Set_SCL(1);
 0030 01E0              ldi R16,1
 0032 F6DF              xcall _I2C_Set_SCL
 0034                   .dbline 72
 0034           ;       I2C_Set_SDA(0);
 0034 0027              clr R16
 0036 EEDF              xcall _I2C_Set_SDA
 0038                   .dbline 73
 0038           ;       I2C_Set_SCL(0);
 0038 0027              clr R16
 003A                   .dbline -2
 003A                   .dbline 74
 003A           ; }
 003A           L11:
 003A                   .dbline 0 ; func end
 003A F2CF              xjmp _I2C_Set_SCL
 003C                   .dbend
 003C                   .dbfunc e I2C_Stop_Condition _I2C_Stop_Condition fV
                        .even
 003C           _I2C_Stop_Condition::
 003C                   .dbline -1
 003C                   .dbline 83
 003C           ; 
 003C           ; //***************************************************************
 003C           ; // Function    : I2C_Stop_Condition
 003C           ; // Input       : none
 003C           ; // Output      : none
 003C           ; // Description : Generate a STOP Condition.
 003C           ; //***************************************************************
 003C           ; void I2C_Stop_Condition(void)
 003C           ; {
 003C                   .dbline 84
 003C           ;       I2C_Set_SDA(0);
 003C 0027              clr R16
 003E EADF              xcall _I2C_Set_SDA
 0040                   .dbline 85
 0040           ;       I2C_Set_SCL(1);
 0040 01E0              ldi R16,1
 0042 EEDF              xcall _I2C_Set_SCL
 0044                   .dbline 86
 0044           ;       I2C_Set_SDA(1);
 0044 01E0              ldi R16,1
 0046                   .dbline -2
 0046                   .dbline 87
 0046           ; }
 0046           L12:
 0046                   .dbline 0 ; func end
 0046 E6CF              xjmp _I2C_Set_SDA
 0048                   .dbend
 0048                   .dbfunc e I2C_Send_Byte _I2C_Send_Byte fV
 0048           ;            cnt -> R20
 0048           ;           data -> R22
                        .even
 0048           _I2C_Send_Byte::
 0048 0E940000          xcall push_gset2
 004C 602F              mov R22,R16
 004E                   .dbline -1
 004E                   .dbline 96
 004E           ; 
 004E           ; //***************************************************************
 004E           ; // Function    : I2C_Send_Byte
 004E           ; // Input       : data - data to be transmitted
 004E           ; // Output      : none
 004E           ; // Description : Send a byte on I2C Bus with the MSB first.
 004E           ; //***************************************************************
 004E           ; void I2C_Send_Byte(INT8U data)
 004E           ; {
 004E                   .dbline 98
 004E           ;       INT8U cnt;
 004E           ;       for(cnt = 0;cnt < 8;cnt++)
 004E 4427              clr R20
 0050 11C0              xjmp L17
 0052           L14:
 0052                   .dbline 99
 0052           ;       {
 0052                   .dbline 100
 0052           ;               if((data << cnt) & 0x80)
 0052 062F              mov R16,R22
 0054 142F              mov R17,R20
 0056 0E940000          xcall lsl8
 005A 802F              mov R24,R16
 005C 8078              andi R24,128
 005E 19F0              breq L18
 0060                   .dbline 101
 0060           ;               {
 0060                   .dbline 102
 0060           ;                       I2C_Set_SDA(1);
 0060 01E0              ldi R16,1
 0062 D8DF              xcall _I2C_Set_SDA
 0064                   .dbline 103
 0064           ;               }
 0064 02C0              xjmp L19
 0066           L18:
 0066                   .dbline 105
 0066           ;               else
 0066           ;               {
 0066                   .dbline 106
 0066           ;                       I2C_Set_SDA(0);
 0066 0027              clr R16
 0068 D5DF              xcall _I2C_Set_SDA
 006A                   .dbline 107
 006A           ;               }
 006A           L19:
 006A                   .dbline 108
 006A 01E0              ldi R16,1
 006C D9DF              xcall _I2C_Set_SCL
 006E                   .dbline 109
 006E 0027              clr R16
 0070 D7DF              xcall _I2C_Set_SCL
 0072                   .dbline 110
 0072           L15:
 0072                   .dbline 98
 0072 4395              inc R20
 0074           L17:
 0074                   .dbline 98
 0074 4830              cpi R20,8
 0076 68F3              brlo L14
 0078                   .dbline 111
 0078           ;               I2C_Set_SCL(1);
 0078           ;               I2C_Set_SCL(0);
 0078           ;       }
 0078           ;       I2C_Set_SDA(1);
 0078 01E0              ldi R16,1
 007A CCDF              xcall _I2C_Set_SDA
 007C                   .dbline 112
 007C           ;     I2C_Set_SCL(1);
 007C 01E0              ldi R16,1
 007E D0DF              xcall _I2C_Set_SCL
 0080                   .dbline 113
 0080           ;       DIR_REG_I2C &= ~(1 << SDA_BIT_I2C);
 0080 B998              cbi 0x17,1
 0082                   .dbline 114
 0082           ;       if(PIN_REG_I2C & (1 << SDA_BIT_I2C))
 0082 B19B              sbis 0x16,1
 0084 04C0              rjmp L20
 0086                   .dbline 115
 0086           ;       {
 0086                   .dbline 116
 0086           ;               bI2C_Ack = 0;
 0086 2224              clr R2
 0088 20920000          sts _bI2C_Ack,R2
 008C                   .dbline 117
 008C           ;       }
 008C 03C0              xjmp L21
 008E           L20:
 008E                   .dbline 119
 008E           ;       else
 008E           ;       { 
 008E                   .dbline 120
 008E           ;               bI2C_Ack = 1;
 008E 81E0              ldi R24,1
 0090 80930000          sts _bI2C_Ack,R24
 0094                   .dbline 121
 0094           ;       }
 0094           L21:

⌨️ 快捷键说明

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