📄 iic.s
字号:
.module iic.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\fengzm.POWERMAXTECH\桌面\MCU2\iic.c
.dbfunc e twi_init _twi_init fV
.even
_twi_init::
.dbline -1
.dbline 10
;
; #include "IIC.h"
; #include "common.h"
;
;
; // TWI initialize
; // bit rate:32,prescal:1,rate:100Khz;
; //SCL frequency = CPU Clock frequence / (16 + 2(TWBR)(PrescalerValue))
; void twi_init(void)
; {
.dbline 11
; TWCR = 0x00; //disable twi
clr R2
sts 188,R2
.dbline 12
; TWBR = 0x20; //set bit rate equal 32
ldi R24,32
sts 184,R24
.dbline 13
; TWSR = 0x00; //set prescale clock/1
sts 185,R2
.dbline 14
; TWAR = 0x00; //set slave address
sts 186,R2
.dbline 15
; TWCR = 0x85; //enable twi
ldi R24,133
sts 188,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 48
rjmp _twi_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\fengzm.POWERMAXTECH\桌面\MCU2\iic.c
.dbfunc e twi_isr _twi_isr fV
; ucIIC_TWSR -> R16
.even
_twi_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 20
; }
;
; #pragma interrupt_handler twi_isr:25
; void twi_isr(void)
; {
.dbline 23
; uchar ucIIC_TWSR;
;
; ucIIC_TWSR = TWSR & 0xF8;
lds R16,185
andi R16,248
.dbline 24
; if(ucIIC_TWSR == 0x08)
cpi R16,8
brne L3
.dbline 25
; {
.dbline 26
; TWDR = g_ucIICAdress;
lds R2,_g_ucIICAdress
sts 187,R2
.dbline 27
; ZHONGTU_START_IIC();
ldi R24,133
sts 188,R24
.dbline 28
; }
rjmp L4
L3:
.dbline 29
; else if((ucIIC_TWSR == 0x18) || (ucIIC_TWSR == 0x20))
cpi R16,24
breq L7
cpi R16,32
brne L5
L7:
.dbline 30
; {
.dbline 31
; TWDR = *g_ucIICDataBuf;
lds R30,_g_ucIICDataBuf
lds R31,_g_ucIICDataBuf+1
ldd R2,z+0
sts 187,R2
.dbline 32
; g_ucIICDataNum--;
lds R24,_g_ucIICDataNum
subi R24,1
sts _g_ucIICDataNum,R24
.dbline 33
; ZHONGTU_START_IIC();
ldi R24,133
sts 188,R24
.dbline 34
; }
rjmp L6
L5:
.dbline 35
; else if((ucIIC_TWSR == 0x28) || (ucIIC_TWSR == 0x30))
cpi R16,40
breq L10
cpi R16,48
brne L8
L10:
.dbline 36
; {
.dbline 37
; if(g_ucIICDataNum > 0)
clr R2
lds R3,_g_ucIICDataNum
cp R2,R3
brsh L11
.dbline 38
; {
.dbline 39
; TWDR = *(++g_ucIICDataBuf);
lds R24,_g_ucIICDataBuf
lds R25,_g_ucIICDataBuf+1
adiw R24,1
sts _g_ucIICDataBuf+1,R25
sts _g_ucIICDataBuf,R24
movw R30,R24
ldd R2,z+0
sts 187,R2
.dbline 40
; g_ucIICDataNum--;
mov R24,R3
subi R24,1
sts _g_ucIICDataNum,R24
.dbline 41
; ZHONGTU_START_IIC();
ldi R24,133
sts 188,R24
.dbline 42
; }
rjmp L9
L11:
.dbline 44
; else
; {
.dbline 45
; g_ucIICEnd = 1;
ldi R24,1
sts _g_ucIICEnd,R24
.dbline 46
; STOP_IIC();
ldi R24,149
sts 188,R24
.dbline 47
; }
.dbline 48
; }
rjmp L9
L8:
.dbline 50
; else
; {
.dbline 51
; STOP_IIC();
ldi R24,149
sts 188,R24
.dbline 52
; g_ucIICState = IIC_BUSY;
ldi R24,16
sts _g_ucIICState,R24
.dbline 53
; g_ucIICEnd = 1;
ldi R24,1
sts _g_ucIICEnd,R24
.dbline 54
; }
L9:
L6:
L4:
.dbline -2
L2:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r ucIIC_TWSR 16 c
.dbend
.dbfunc e IICSendStr _IICSendStr fi
; ucIICDataNum -> y+0
; s -> R18,R19
; ucIICAdress -> R16
.even
_IICSendStr::
.dbline -1
.dbline 59
; }
;
; //ucIICAdress为子地址;*s为要传送的数据组,ucIICDataNum为要传送数据的个数
; uint IICSendStr(uchar ucIICAdress, uchar *s, uchar ucIICDataNum)
; {
.dbline 60
; g_ucIICAdress = ucIICAdress;
sts _g_ucIICAdress,R16
.dbline 61
; g_ucIICDataBuf = s;
sts _g_ucIICDataBuf+1,R19
sts _g_ucIICDataBuf,R18
.dbline 62
; g_ucIICDataNum = ucIICDataNum;
ldd R0,y+0
sts _g_ucIICDataNum,R0
.dbline 63
; g_ucIICEnd = 0;
clr R2
sts _g_ucIICEnd,R2
.dbline 64
; START_IIC();
ldi R24,165
sts 188,R24
L14:
.dbline 66
.dbline 66
L15:
.dbline 65
; while(g_ucIICEnd == 0)
lds R2,_g_ucIICEnd
tst R2
breq L14
.dbline 68
; {}
;
; if(g_ucIICEnd == 1)
mov R24,R2
cpi R24,1
brne L17
.dbline 69
; return(1);
ldi R16,1
ldi R17,0
rjmp L13
L17:
.dbline 71
; else
; return(0);
clr R16
clr R17
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbsym l ucIICDataNum 0 c
.dbsym r s 18 pc
.dbsym r ucIICAdress 16 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -