📄 i2c.lis
字号:
.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 + -