📄 i2c.lis
字号:
.module I2c.c
.area text(rom, con, rel)
0000 .dbfile D:\avrmcu\AT980\I2C\I2c.c
0000 .dbfunc s I2C_delay _I2C_delay fI
; i -> R16
.even
0000 _I2C_delay::
0000 .dbline -1
0000 .dbline 22
; /***********************************************************************/
;
;
;
;
; #include <iom163.h>
;
; #include "..\io.h"
; #define TRUE 1
; #define FALSE 0
;
; #define I2C_MAX_WAIT 110 /* in microseconds */
;
; #define HOLDING_TIME 10
;
; /*
; * These local functions wait for the other end the set the bit to a
; * certain level.
; */
;
; void I2C_delay(void)
; {
0000 .dbline 24
; unsigned char i;
; for(i=0;i<80;i++)
0000 0027 clr R16
0002 01C0 xjmp L5
0004 L2:
0004 .dbline 25
0004 .dbline 26
0004 L3:
0004 .dbline 24
0004 0395 inc R16
0006 L5:
0006 .dbline 24
0006 0035 cpi R16,80
0008 E8F3 brlo L2
000A .dbline -2
000A .dbline 27
; {
; }
; }
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbsym r i 16 c
000C .dbfunc s I2C_delay1 _I2C_delay1 fI
; i -> R20
; viod -> R16,R17
.even
000C _I2C_delay1::
000C 0E940000 xcall push_gset1
0010 .dbline -1
0010 .dbline 29
; void I2C_delay1(viod)
; {
0010 .dbline 31
; unsigned char i;
; for(i=0;i<200;i++)
0010 4427 clr R20
0012 01C0 xjmp L10
0014 L7:
0014 .dbline 32
0014 .dbline 33
0014 L8:
0014 .dbline 31
0014 4395 inc R20
0016 L10:
0016 .dbline 31
0016 483C cpi R20,200
0018 E8F3 brlo L7
001A .dbline 33
; {
; };
001A .dbline -2
001A .dbline 34
; }
001A L6:
001A 0E940000 xcall pop_gset1
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbsym r i 20 c
0020 .dbsym r viod 16 I
0020 .dbfunc s wait_sda_hi _wait_sda_hi fI
; i -> R20
.even
0020 _wait_sda_hi:
0020 0E940000 xcall push_gset1
0024 .dbline -1
0024 .dbline 48
; /*static unsigned char wait_sda_lo(void)
; {
; int i = I2C_MAX_WAIT/5;
; sda_set_input();
; while(i && is_sda_hi()) {
; i--;
; I2C_delay();
; }
; sda_set_output();
; return i?TRUE:FALSE;
; }*/
;
; static unsigned char wait_sda_hi(void)
; {
0024 .dbline 49
; unsigned char i = I2C_MAX_WAIT;
0024 4EE6 ldi R20,110
0026 .dbline 50
; sda_set_input();
0026 A198 CBI 0x14,1
0028 08C0 xjmp L13
002A L12:
002A .dbline 52
; while(i)
; {
002A .dbline 53
; if(is_sda_hi())
002A 999B sbis 0x13,1
002C 04C0 rjmp L15
002E .dbline 54
; {
002E .dbline 55
; sda_set_output();
002E A19A SBI 0x14,1
0030 .dbline 56
; return TRUE;
0030 01E0 ldi R16,1
0032 10E0 ldi R17,0
0034 07C0 xjmp L11
0036 L15:
0036 .dbline 58
0036 4A95 dec R20
0038 .dbline 59
0038 E9DF xcall _I2C_delay1
003A .dbline 60
003A L13:
003A .dbline 51
003A 4423 tst R20
003C B1F7 brne L12
003E .dbline 61
; }
; i--;
; I2C_delay1();
; }
; sda_set_output();
003E A19A SBI 0x14,1
0040 .dbline 62
; return FALSE;
0040 0027 clr R16
0042 1127 clr R17
0044 .dbline -2
0044 L11:
0044 0E940000 xcall pop_gset1
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbsym r i 20 c
004A .dbfunc s wait_scl_hi _wait_scl_hi fI
; i -> R20
.even
004A _wait_scl_hi:
004A 0E940000 xcall push_gset1
004E .dbline -1
004E .dbline 66
; }
;
; static unsigned char wait_scl_hi(void)
; {
004E .dbline 67
; unsigned char i = I2C_MAX_WAIT;
004E 4EE6 ldi R20,110
0050 .dbline 69
;
; scl_set_input();
0050 A098 CBI 0x14,0
0052 08C0 xjmp L19
0054 L18:
0054 .dbline 71
; while(i)
; {
0054 .dbline 72
; if(is_scl_hi())
0054 989B sbis 0x13,0
0056 04C0 rjmp L21
0058 .dbline 73
; {
0058 .dbline 74
; scl_set_output();
0058 A09A SBI 0x14,0
005A .dbline 75
; return TRUE;
005A 01E0 ldi R16,1
005C 10E0 ldi R17,0
005E 07C0 xjmp L17
0060 L21:
0060 .dbline 77
0060 4A95 dec R20
0062 .dbline 78
0062 D4DF xcall _I2C_delay1
0064 .dbline 79
0064 L19:
0064 .dbline 70
0064 4423 tst R20
0066 B1F7 brne L18
0068 .dbline 80
; }
; i--;
; I2C_delay1();
; }
; scl_set_output();
0068 A09A SBI 0x14,0
006A .dbline 81
; return FALSE;
006A 0027 clr R16
006C 1127 clr R17
006E .dbline -2
006E L17:
006E 0E940000 xcall pop_gset1
0072 .dbline 0 ; func end
0072 0895 ret
0074 .dbsym r i 20 c
0074 .dbfunc s i2c_start _i2c_start fI
.even
0074 _i2c_start::
0074 .dbline -1
0074 .dbline 92
; }
;
; /*
; * This function is called before an I2C transfer is started. A start
; * condition is signified with a high-to-low transition of SDA while SCL
; * is high.
; */
;
;
; unsigned char i2c_start(void)
; {
0074 .dbline 94
;
; scl_set_output();
0074 A09A SBI 0x14,0
0076 .dbline 95
; scl_hi();
0076 A89A SBI 0x15,0
0078 .dbline 97
; // SEC LEE0216
; I2C_delay();//HOLDING_TIME*3);
0078 C3DF xcall _I2C_delay
007A .dbline 98
; sda_set_output();
007A A19A SBI 0x14,1
007C .dbline 99
; sda_hi();
007C A99A SBI 0x15,1
007E .dbline 100
; I2C_delay();//HOLDING_TIME*3);
007E C0DF xcall _I2C_delay
0080 .dbline 101
; scl_hi(); // SEC LEE0216
0080 A89A SBI 0x15,0
0082 .dbline 102
; if (!wait_scl_hi())
0082 E3DF xcall _wait_scl_hi
0084 1801 movw R2,R16
0086 2220 tst R2
0088 19F4 brne L24
008A .dbline 103
; return FALSE;
008A 0027 clr R16
008C 1127 clr R17
008E 06C0 xjmp L23
0090 L24:
0090 .dbline 105
;
; sda_lo(); /* this triggers the start */
0090 A998 CBI 0x15,1
0092 .dbline 106
; I2C_delay();//HOLDING_TIME*3);
0092 B6DF xcall _I2C_delay
0094 .dbline 107
; scl_lo();
0094 A898 CBI 0x15,0
0096 .dbline 108
; I2C_delay();//HOLDING_TIME*3);
0096 B4DF xcall _I2C_delay
0098 .dbline 109
; return TRUE;
0098 01E0 ldi R16,1
009A 10E0 ldi R17,0
009C .dbline -2
009C L23:
009C .dbline 0 ; func end
009C 0895 ret
009E .dbfunc s i2c_stop _i2c_stop fI
.even
009E _i2c_stop::
009E .dbline -1
009E .dbline 118
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -