📄 i2c.s
字号:
.module I2C.c
.area text(rom, con, rel)
.dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
.area data(ram, con, rel)
.dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
_ack::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
.dbsym e ack _ack c
.area text(rom, con, rel)
.dbfile E:\电视接收头\高频头项目\avr\SRC\I2C.c
.dbfunc e delay_us _delay_us fV
; i -> R10
; count -> R16
.even
_delay_us::
st -y,R10
.dbline -1
.dbline 14
; #include "..\inc\main.h"
;
; BYTE ack=0;
;
; //函数声明
; void delay_us(BYTE count);
; void Start_I2C(void);
; void Stop_I2C(void);
; void Ack_I2C(BYTE a);
; void SendByte(BYTE c);
; BYTE ReceiveByte(void);
;
; void delay_us(BYTE count)
; {
.dbline 16
; BYTE i;
; for(i=0;i<count;i++)
clr R10
xjmp L5
L2:
.dbline 17
; {
.dbline 18
; asm("nop");
nop
.dbline 19
; asm("nop");
nop
.dbline 20
; asm("nop");
nop
.dbline 21
; asm("nop");
nop
.dbline 22
; asm("nop");
nop
.dbline 23
; asm("nop");
nop
.dbline 24
; asm("nop");
nop
.dbline 25
; asm("nop");
nop
.dbline 26
; asm("nop");
nop
.dbline 27
; asm("nop");
nop
.dbline 28
; }
L3:
.dbline 16
inc R10
L5:
.dbline 16
cp R10,R16
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r i 10 c
.dbsym r count 16 c
.dbend
.dbfunc e Start_I2C _Start_I2C fV
.even
_Start_I2C::
.dbline -1
.dbline 32
; }
;
; void Start_I2C(void)
; {
.dbline 33
; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
ldi R24,160
out 0x11,R24
.dbline 34
; SDA_H; /*发送起始条件的数据信号*/
sbi 0x12,7
.dbline 35
; delay_us(1);
ldi R16,1
xcall _delay_us
.dbline 36
; SCL_H;
sbi 0x12,5
.dbline 37
; delay_us(5); /*起始条件建立时间大于4.7us,延时*/
ldi R16,5
xcall _delay_us
.dbline 38
; SDA_L; /*发送起始信号*/
cbi 0x12,7
.dbline 39
; delay_us(4); /*起始条件锁定时间大于4μs*/
ldi R16,4
xcall _delay_us
.dbline 40
; SCL_L; /*钳住I2C总线,准备发送或接收数据 */
cbi 0x12,5
.dbline 41
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Stop_I2C _Stop_I2C fV
.even
_Stop_I2C::
.dbline -1
.dbline 45
; }
;
; void Stop_I2C(void)
; {
.dbline 46
; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
ldi R24,160
out 0x11,R24
.dbline 47
; SDA_L; /*发送结束条件的数据信号*/
cbi 0x12,7
.dbline 48
; delay_us(1);
ldi R16,1
xcall _delay_us
.dbline 49
; SCL_H; /*结束条件建立时间大于4us*/
sbi 0x12,5
.dbline 50
; delay_us(5);
ldi R16,5
xcall _delay_us
.dbline 51
; SDA_H; /*发送I2C总线结束信号*/
sbi 0x12,7
.dbline 52
; delay_us(4);
ldi R16,4
xcall _delay_us
.dbline 53
; I2C_DDR=~((1<<SDA)|(1<<SCL));
ldi R24,-161
ldi R25,-1
out 0x11,R24
.dbline 54
; SDA_H;
sbi 0x12,7
.dbline 55
; SCL_H;
sbi 0x12,5
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Ack_I2C _Ack_I2C fV
; a -> R10
.even
_Ack_I2C::
st -y,R10
mov R10,R16
.dbline -1
.dbline 59
; }
;
; void Ack_I2C(BYTE a)
; {
.dbline 60
; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA端口定义为输出*/
ldi R24,160
out 0x11,R24
.dbline 61
; if(a==0) /*在此发出应答或非应答信号 */
tst R10
brne L9
X1:
.dbline 62
; {
.dbline 63
; SDA_L;
cbi 0x12,7
.dbline 64
; }
xjmp L10
L9:
.dbline 66
; else
; {
.dbline 67
; SDA_H;
sbi 0x12,7
.dbline 68
; }
L10:
.dbline 69
; delay_us(4);
ldi R16,4
xcall _delay_us
.dbline 70
; SCL_H;
sbi 0x12,5
.dbline 71
; delay_us(4); /*时钟低电平周期大于4μs*/
ldi R16,4
xcall _delay_us
.dbline 72
; SCL_L; /*清时钟线,钳住I2C总线以便继续接收*/
cbi 0x12,5
.dbline 73
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline -2
L8:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r a 10 c
.dbend
.dbfunc e SendByte _SendByte fV
; BitCnt -> R20
; c -> R10
.even
_SendByte::
st -y,R10
st -y,R20
mov R10,R16
.dbline -1
.dbline 77
; }
;
; void SendByte(BYTE c)
; {
.dbline 79
; BYTE BitCnt;
; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA SCL端口均定义为输出*/
ldi R24,160
out 0x11,R24
.dbline 80
; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
clr R20
xjmp L15
L12:
.dbline 81
; {
.dbline 82
; if((c<<BitCnt)&0x08) /*判断发送位*/
mov R16,R10
mov R17,R20
xcall lsl8
mov R24,R16
andi R24,8
breq L16
X2:
.dbline 83
; {
.dbline 84
; SDA_H;
sbi 0x12,7
.dbline 85
; }
xjmp L17
L16:
.dbline 87
; else
; {
.dbline 88
; SDA_L;
cbi 0x12,7
.dbline 89
; }
L17:
.dbline 90
; delay_us(1);
ldi R16,1
xcall _delay_us
.dbline 91
; SCL_H; /*置时钟线为高,通知被控器开始接收数据位*/
sbi 0x12,5
.dbline 92
; delay_us(5); /*保证时钟高电平周期大于4μs*/
ldi R16,5
xcall _delay_us
.dbline 93
; SCL_L;
cbi 0x12,5
.dbline 94
; }
L13:
.dbline 80
inc R20
L15:
.dbline 80
cpi R20,8
brlo L12
X3:
.dbline 95
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline 96
; I2C_DDR=~(1<<SDA); /*SDA定义为输入,置数据线为输入方式*/
ldi R24,-129
ldi R25,-1
out 0x11,R24
.dbline 97
; SDA_H; /*8位发送完后释放数据线,准备接收应答位,打开内部上拉*/
sbi 0x12,7
.dbline 98
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline 99
; SCL_H;
sbi 0x12,5
.dbline 100
; delay_us(3);
ldi R16,3
xcall _delay_us
.dbline 101
; if(ACK_FAIL) /*判断是否接收到应答信号*/
in R24,0x10
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
andi R24,1
breq L18
X4:
.dbline 102
; {
.dbline 103
; ack=0;
clr R2
sts _ack,R2
.dbline 104
; }
xjmp L19
L18:
.dbline 106
; else
; {
.dbline 107
; ack=1;
ldi R24,1
sts _ack,R24
.dbline 108
; }
L19:
.dbline 109
; SCL_L;
cbi 0x12,5
.dbline 110
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline -2
L11:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r BitCnt 20 c
.dbsym r c 10 c
.dbend
.dbfunc e ReceiveByte _ReceiveByte fc
; retc -> R10
; BitCnt -> R20
.even
_ReceiveByte::
st -y,R10
st -y,R20
.dbline -1
.dbline 114
; }
;
; BYTE ReceiveByte(void)
; {
.dbline 117
; BYTE retc;
; BYTE BitCnt;
; retc=0;
clr R10
.dbline 118
; I2C_DDR=~(1<<SDA);
ldi R24,-129
ldi R25,-1
out 0x11,R24
.dbline 119
; SDA_H; /*SDA定义为输入,置数据线为输入方式*/
sbi 0x12,7
.dbline 120
; for(BitCnt=0;BitCnt<8;BitCnt++)
clr R20
xjmp L24
L21:
.dbline 121
; {
.dbline 122
; delay_us(1);
ldi R16,1
xcall _delay_us
.dbline 123
; SCL_L; /*置时钟线位低,准备接收数据位*/
cbi 0x12,5
.dbline 124
; delay_us(5); /*时钟低电平周期大于4.7μs*/
ldi R16,5
xcall _delay_us
.dbline 125
; SCL_H; /*置时钟线为高,使数据线上数据有效*/
sbi 0x12,5
.dbline 126
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline 127
; retc<<=1;
lsl R10
.dbline 128
; if(SDA_HIGH)
in R24,0x10
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
andi R24,1
breq L25
X5:
.dbline 129
; {
.dbline 130
; retc+=1; /*读数据位,接收的数据位放入retc中*/
inc R10
.dbline 131
; }
L25:
.dbline 132
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline 133
; }
L22:
.dbline 120
inc R20
L24:
.dbline 120
cpi R20,8
brlo L21
X6:
.dbline 134
; SCL_L;
cbi 0x12,5
.dbline 135
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline 136
; return retc;
mov R16,R10
.dbline -2
L20:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r retc 10 c
.dbsym r BitCnt 20 c
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -