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