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

📄 i2c.lis

📁 本人改编和测试过的用于AVR mega128关于I2C总线的应用实例--使用EEPROM的读写方法。采用ICCAVR编译器实验。
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module I2C.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\MyWorks\SOFT\I2C_E2PROM\I2C.c
 0000                   .dbfunc e Init_I2C _Init_I2C fV
                        .even
 0000           _Init_I2C::
 0000                   .dbline -1
 0000                   .dbline 22
 0000           ; // ***************     I2C driver V 1.0    ***************
 0000           ; // ***           Written By P. Fletcher-Jones          ***
 0000           ; // ***                Written on 16/11/01                        ***
 0000           ; // ***                 Last MOD 21/11/01                         ***
 0000           ; // ***       Compiled using ImageCraft C Comiler       ***
 0000           ; // *******************************************************
 0000           ; 
 0000           ; #include <iom1281v.h>
 0000           ; #include <MACROS.h>
 0000           ; 
 0000           ; #include "DC_Defines.h"
 0000           ; 
 0000           ; 
 0000           ; #include "I2C.h"
 0000           ; 
 0000           ; 
 0000           ; // ******************************************** //
 0000           ; // *** This routine will setup the I2C Port *** //
 0000           ; // ******************************************** //
 0000           ; 
 0000           ; void Init_I2C(void)
 0000           ; {
 0000                   .dbline 23
 0000           ;  SETBIT(I2C_DIR,SCL);            // Set SCL to output 
 0000 509A              sbi 0xa,0
 0002                   .dbline 24
 0002           ;  SETBIT(I2C_DIR,SDA );           // Set SDA to output
 0002 519A              sbi 0xa,1
 0004                   .dbline 26
 0004           ;       
 0004           ;  SETBIT(I2C_PORT,SCL);                   // Set SCL high
 0004 589A              sbi 0xb,0
 0006                   .dbline 27
 0006           ;  SETBIT(I2C_PORT,SDA );                  // Set SDA high
 0006 599A              sbi 0xb,1
 0008                   .dbline -2
 0008           L1:
 0008                   .dbline 0 ; func end
 0008 0895              ret
 000A                   .dbend
 000A                   .dbfunc e I2C_Start _I2C_Start fV
                        .even
 000A           _I2C_Start::
 000A                   .dbline -1
 000A                   .dbline 37
 000A           ; }
 000A           ; 
 000A           ; 
 000A           ; 
 000A           ; // ************************************************ //
 000A           ; // *** This routine will send the I2C Start Bit *** //
 000A           ; // ************************************************ //
 000A           ; 
 000A           ; void I2C_Start (void)
 000A           ; {
 000A                   .dbline 38
 000A           ;  SETBIT(I2C_PORT,SCL);                                // Set SCL High
 000A 589A              sbi 0xb,0
 000C                   .dbline 39
 000C           ;  SETBIT(I2C_PORT,SDA);                                // Set SDA High
 000C 599A              sbi 0xb,1
 000E                   .dbline 41
 000E           ;  
 000E           ;  SETBIT(I2C_DIR,SDA);                    // Set SDA to output 
 000E 519A              sbi 0xa,1
 0010                   .dbline 42
 0010           ;  CLEARBIT(I2C_PORT,SDA);                 // Clear SDA
 0010 5998              cbi 0xb,1
 0012                   .dbline -2
 0012           L2:
 0012                   .dbline 0 ; func end
 0012 0895              ret
 0014                   .dbend
 0014                   .dbfunc e I2C_Stop _I2C_Stop fV
                        .even
 0014           _I2C_Stop::
 0014                   .dbline -1
 0014                   .dbline 51
 0014           ; }
 0014           ; 
 0014           ; 
 0014           ; // *********************************************** //
 0014           ; // *** This routine will send the I2C Stop Bit *** //
 0014           ; // *********************************************** //
 0014           ; 
 0014           ; void I2C_Stop (void)
 0014           ; {
 0014                   .dbline 53
 0014           ;  
 0014           ;  SETBIT(I2C_DIR,SDA);                    // Set SDA to output
 0014 519A              sbi 0xa,1
 0016                   .dbline 55
 0016           ;       
 0016           ;  CLEARBIT(I2C_PORT,SCL);                 // Clear SCL
 0016 5898              cbi 0xb,0
 0018                   .dbline 56
 0018           ;  CLEARBIT(I2C_PORT,SDA);                 // Clear SDA
 0018 5998              cbi 0xb,1
 001A                   .dbline 58
 001A           ;  
 001A           ;  SETBIT(I2C_PORT,SCL);                           // Set SCL High
 001A 589A              sbi 0xb,0
 001C                   .dbline 59
 001C           ;  SETBIT(I2C_PORT,SDA);                           // Set SDA High
 001C 599A              sbi 0xb,1
 001E                   .dbline -2
 001E           L3:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbend
 0020                   .dbfunc e I2C_Clock _I2C_Clock fV
                        .even
 0020           _I2C_Clock::
 0020                   .dbline -1
 0020                   .dbline 71
 0020           ; }
 0020           ; 
 0020           ; 
 0020           ; 
 0020           ; 
 0020           ; 
 0020           ; // ************************************************** //
 0020           ; // *** This routine will send the I2C clock pulse *** //
 0020           ; // ************************************************** //
 0020           ; 
 0020           ; void I2C_Clock (void)
 0020           ; {
 0020                   .dbline 72
 0020           ;  SETBIT(I2C_PORT,SCL);                                // Set SCL high
 0020 589A              sbi 0xb,0
 0022                   .dbline 73
 0022           ;  NOP();                                                               // Small Delay
 0022 0000              nop
 0024                   .dbline 74
 0024           ;  CLEARBIT(I2C_PORT,SCL);                      // Set SCL low
 0024 5898              cbi 0xb,0
 0026                   .dbline -2
 0026           L4:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbend
 0028                   .dbfunc e Write_I2C_Byte _Write_I2C_Byte fV
 0028           ;              i -> R20
 0028           ;           byte -> R22
                        .even
 0028           _Write_I2C_Byte::
 0028 4A93              st -y,R20
 002A 6A93              st -y,R22
 002C 602F              mov R22,R16
 002E                   .dbline -1
 002E                   .dbline 85
 002E           ; }
 002E           ; 
 002E           ; 
 002E           ; 
 002E           ; 
 002E           ; // ******************************************************** //
 002E           ; // *** This routine will write a byte to the I2C device *** //
 002E           ; // ******************************************************** //
 002E           ; 
 002E           ; void Write_I2C_Byte(unsigned char byte)
 002E           ; {
 002E                   .dbline 88
 002E           ;  unsigned char i;
 002E           ; 
 002E           ;  SETBIT(I2C_DIR,SDA);                    // Set SDA to output 
 002E 519A              sbi 0xa,1
 0030                   .dbline 89
 0030           ;  CLEARBIT(I2C_PORT,SCL);
 0030 5898              cbi 0xb,0
 0032                   .dbline 91
 0032           ;       
 0032           ;  for (i = 0; i < 8; i++){              // Loop for our 8 bits
 0032 4427              clr R20
 0034 0BC0              xjmp L9
 0036           L6:
 0036                   .dbline 91
 0036                   .dbline 94
 0036           ;  
 0036           ;       // Set or Clear SDA pin
 0036           ;        if((byte & 0x80) == 0x80) SETBIT(I2C_PORT, SDA);       // Set I2C SDA PIN
 0036 862F              mov R24,R22
 0038 8078              andi R24,128
 003A 8038              cpi R24,128
 003C 11F4              brne L10
 003E           X0:
 003E                   .dbline 94
 003E 599A              sbi 0xb,1
 0040 01C0              xjmp L11
 0042           L10:
 0042                   .dbline 95
 0042           ;        else CLEARBIT(I2C_PORT,SDA);                                           // Clear I2C SDA PIN
 0042 5998              cbi 0xb,1
 0044           L11:
 0044                   .dbline 97
 0044           ;        
 0044           ;        SETBIT(I2C_PORT,SCL);                     // Set SCL High, Clock data
 0044 589A              sbi 0xb,0
 0046                   .dbline 99
 0046           ; 
 0046           ;        byte = byte << 1;                                 // Shift data in buffer right one
 0046 660F              lsl R22
 0048                   .dbline 101
 0048           ;       
 0048           ;      CLEARBIT(I2C_PORT,SCL);             // Clear SCL
 0048 5898              cbi 0xb,0
 004A                   .dbline 102
 004A           ;       }
 004A           L7:
 004A                   .dbline 91
 004A 4395              inc R20
 004C           L9:
 004C                   .dbline 91
 004C 4830              cpi R20,8
 004E 98F3              brlo L6
 0050           X1:
 0050           L12:
 0050                   .dbline 105
 0050           ; 
 0050           ;       
 0050           ;  while(I2C_Ackn() );                             // Check for acknowledge from I2C device     
 0050           L13:
 0050                   .dbline 105
 0050 19D0              xcall _I2C_Ackn
 0052 0023              tst R16
 0054 E9F7              brne L12
 0056           X2:
 0056                   .dbline -2
 0056           L5:
 0056                   .dbline 0 ; func end
 0056 6991              ld R22,y+
 0058 4991              ld R20,y+
 005A 0895              ret
 005C                   .dbsym r i 20 c
 005C                   .dbsym r byte 22 c
 005C                   .dbend
 005C                   .dbfunc e Read_I2C_Byte _Read_I2C_Byte fc
 005C           ;              i -> R22
 005C           ;           buff -> R20
                        .even
 005C           _Read_I2C_Byte::
 005C 4A93              st -y,R20
 005E 6A93              st -y,R22
 0060                   .dbline -1
 0060                   .dbline 117
 0060           ; }
 0060           ; 
 0060           ; 
 0060           ; 
 0060           ; 
 0060           ; 
 0060           ; // ********************************************************* //
 0060           ; // *** This routine will read a byte from the I2C device *** //
 0060           ; // ********************************************************* //
 0060           ; 
 0060           ; unsigned char Read_I2C_Byte(void)
 0060           ; {     
 0060                   .dbline 118
 0060           ;  unsigned char i,buff = 0;
 0060 4427              clr R20
 0062                   .dbline 120
 0062           ;       
 0062           ;       for (i = 0; i < 8; i++){
 0062 6627              clr R22
 0064 08C0              xjmp L19
 0066           L16:
 0066                   .dbline 120
 0066                   .dbline 122
 0066           ;       
 0066           ;               buff = buff << 1;
 0066 440F              lsl R20
 0068                   .dbline 124
 0068           ;               
 0068           ;               CLEARBIT(I2C_DIR,SDA);                     // Set SDA to input
 0068 5198              cbi 0xa,1
 006A                   .dbline 126
 006A           ;               
 006A           ;               SETBIT(I2C_PORT,SCL);                      // Set SCL High,Clock bit out
 006A 589A              sbi 0xb,0
 006C                   .dbline 129
 006C           ;       
 006C           ;               // Read data on SDA pin
 006C           ;               if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01;       
 006C 499B              sbis 0x9,1
 006E 01C0              rjmp L20
 0070           X3:
 0070                   .dbline 129
 0070 4160              ori R20,1
 0072           L20:
 0072                   .dbline 131
 0072           ;               
 0072           ;               CLEARBIT(I2C_PORT,SCL);                    // Clear SCL         
 0072 5898              cbi 0xb,0
 0074                   .dbline 132

⌨️ 快捷键说明

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