📄 i2c.lis
字号:
.module I2C.c
.area text(rom, con, rel)
0000 .dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
.area data(ram, con, rel)
0000 .dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
0000 _ack::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
0001 .dbsym e ack _ack c
.area text(rom, con, rel)
0000 .dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; i -> R10
0000 ; count -> R16
.even
0000 _delay_us::
0000 AA92 st -y,R10
0002 .dbline -1
0002 .dbline 14
0002 ; #include "..\inc\main.h"
0002 ;
0002 ; BYTE ack=0;
0002 ;
0002 ; //函数声明
0002 ; void delay_us(BYTE count);
0002 ; void Start_I2C(void);
0002 ; void Stop_I2C(void);
0002 ; void Ack_I2C(BYTE a);
0002 ; void SendByte(BYTE c);
0002 ; BYTE ReceiveByte(void);
0002 ;
0002 ; void delay_us(BYTE count)
0002 ; {
0002 .dbline 16
0002 ; BYTE i;
0002 ; for(i=0;i<count;i++)
0002 AA24 clr R10
0004 0BC0 xjmp L5
0006 L2:
0006 .dbline 17
0006 ; {
0006 .dbline 18
0006 ; asm("nop");
0006 0000 nop
0008 .dbline 19
0008 ; asm("nop");
0008 0000 nop
000A .dbline 20
000A ; asm("nop");
000A 0000 nop
000C .dbline 21
000C ; asm("nop");
000C 0000 nop
000E .dbline 22
000E ; asm("nop");
000E 0000 nop
0010 .dbline 23
0010 ; asm("nop");
0010 0000 nop
0012 .dbline 24
0012 ; asm("nop");
0012 0000 nop
0014 .dbline 25
0014 ; asm("nop");
0014 0000 nop
0016 .dbline 26
0016 ; asm("nop");
0016 0000 nop
0018 .dbline 27
0018 ; asm("nop");
0018 0000 nop
001A .dbline 28
001A ; }
001A L3:
001A .dbline 16
001A A394 inc R10
001C L5:
001C .dbline 16
001C A016 cp R10,R16
001E 98F3 brlo L2
0020 X0:
0020 .dbline -2
0020 L1:
0020 .dbline 0 ; func end
0020 A990 ld R10,y+
0022 0895 ret
0024 .dbsym r i 10 c
0024 .dbsym r count 16 c
0024 .dbend
0024 .dbfunc e Start_I2C _Start_I2C fV
.even
0024 _Start_I2C::
0024 .dbline -1
0024 .dbline 32
0024 ; }
0024 ;
0024 ; void Start_I2C(void)
0024 ; {
0024 .dbline 33
0024 ; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
0024 80EA ldi R24,160
0026 81BB out 0x11,R24
0028 .dbline 34
0028 ; SDA_H; /*发送起始条件的数据信号*/
0028 979A sbi 0x12,7
002A .dbline 35
002A ; delay_us(1);
002A 01E0 ldi R16,1
002C E9DF xcall _delay_us
002E .dbline 36
002E ; SCL_H;
002E 959A sbi 0x12,5
0030 .dbline 37
0030 ; delay_us(5); /*起始条件建立时间大于4.7us,延时*/
0030 05E0 ldi R16,5
0032 E6DF xcall _delay_us
0034 .dbline 38
0034 ; SDA_L; /*发送起始信号*/
0034 9798 cbi 0x12,7
0036 .dbline 39
0036 ; delay_us(4); /*起始条件锁定时间大于4μs*/
0036 04E0 ldi R16,4
0038 E3DF xcall _delay_us
003A .dbline 40
003A ; SCL_L; /*钳住I2C总线,准备发送或接收数据 */
003A 9598 cbi 0x12,5
003C .dbline 41
003C ; delay_us(2);
003C 02E0 ldi R16,2
003E E0DF xcall _delay_us
0040 .dbline -2
0040 L6:
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbend
0042 .dbfunc e Stop_I2C _Stop_I2C fV
.even
0042 _Stop_I2C::
0042 .dbline -1
0042 .dbline 45
0042 ; }
0042 ;
0042 ; void Stop_I2C(void)
0042 ; {
0042 .dbline 46
0042 ; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
0042 80EA ldi R24,160
0044 81BB out 0x11,R24
0046 .dbline 47
0046 ; SDA_L; /*发送结束条件的数据信号*/
0046 9798 cbi 0x12,7
0048 .dbline 48
0048 ; delay_us(1);
0048 01E0 ldi R16,1
004A DADF xcall _delay_us
004C .dbline 49
004C ; SCL_H; /*结束条件建立时间大于4us*/
004C 959A sbi 0x12,5
004E .dbline 50
004E ; delay_us(5);
004E 05E0 ldi R16,5
0050 D7DF xcall _delay_us
0052 .dbline 51
0052 ; SDA_H; /*发送I2C总线结束信号*/
0052 979A sbi 0x12,7
0054 .dbline 52
0054 ; delay_us(4);
0054 04E0 ldi R16,4
0056 D4DF xcall _delay_us
0058 .dbline 53
0058 ; I2C_DDR=~((1<<SDA)|(1<<SCL));
0058 8FE5 ldi R24,-161
005A 9FEF ldi R25,-1
005C 81BB out 0x11,R24
005E .dbline 54
005E ; SDA_H;
005E 979A sbi 0x12,7
0060 .dbline 55
0060 ; SCL_H;
0060 959A sbi 0x12,5
0062 .dbline -2
0062 L7:
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbend
0064 .dbfunc e Ack_I2C _Ack_I2C fV
0064 ; a -> R10
.even
0064 _Ack_I2C::
0064 AA92 st -y,R10
0066 A02E mov R10,R16
0068 .dbline -1
0068 .dbline 59
0068 ; }
0068 ;
0068 ; void Ack_I2C(BYTE a)
0068 ; {
0068 .dbline 60
0068 ; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
0068 80EA ldi R24,160
006A 81BB out 0x11,R24
006C .dbline 61
006C ; if(a==0) /*在此发出应答或非应答信号 */
006C AA20 tst R10
006E 11F4 brne L9
0070 X1:
0070 .dbline 62
0070 ; {
0070 .dbline 63
0070 ; SDA_L;
0070 9798 cbi 0x12,7
0072 .dbline 64
0072 ; }
0072 01C0 xjmp L10
0074 L9:
0074 .dbline 66
0074 ; else
0074 ; {
0074 .dbline 67
0074 ; SDA_H;
0074 979A sbi 0x12,7
0076 .dbline 68
0076 ; }
0076 L10:
0076 .dbline 69
0076 ; delay_us(4);
0076 04E0 ldi R16,4
0078 C3DF xcall _delay_us
007A .dbline 70
007A ; SCL_H;
007A 959A sbi 0x12,5
007C .dbline 71
007C ; delay_us(4); /*时钟低电平周期大于4μs*/
007C 04E0 ldi R16,4
007E C0DF xcall _delay_us
0080 .dbline 72
0080 ; SCL_L; /*清时钟线,钳住I2C总线以便继续接收*/
0080 9598 cbi 0x12,5
0082 .dbline 73
0082 ; delay_us(2);
0082 02E0 ldi R16,2
0084 BDDF xcall _delay_us
0086 .dbline -2
0086 L8:
0086 .dbline 0 ; func end
0086 A990 ld R10,y+
0088 0895 ret
008A .dbsym r a 10 c
008A .dbend
008A .dbfunc e SendByte _SendByte fV
008A ; BitCnt -> R20
008A ; c -> R10
.even
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -