📄 iic.s
字号:
.module IIC.C
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\IIC\IIC.C
.dbfunc e twi_init _twi_init fV
.even
_twi_init::
.dbline -1
.dbline 32
; /*****************************************************************
; * 文件名: IIC.c
; * 版本号:
; * 创作日期: 2005.7.7
; * 作者: fengzm
; * 功能说明: IIC数据传输
; * 其它说明: 使用AVR单片机Atmega48, 晶振:8Mhz
; 注意:发送START信号之后软件不要清零TWCR的"TWSTA"位。
; *****************************************************************/
;
;
; /*****************************************************************
;
; * 修改日期: 2005.7.8
; * 修改人: wangzq
; * 修改原因: 格式调整
;
; 说明:
; FirstData = 0; IicData = 待发数据;START_IIC();开始发送数据。
; FirstData == 0xff 表示发送结束。
; *******************************************************************/
;
;
; //包含文件
; #include "IIC.h"
;
;
;
; // TWI initialize
; // bit rate:32,prescal:1,rate:100Khz;
; void twi_init(void)
; {
.dbline 33
; TWCR = 0x00; //disable twi
clr R2
ldi R30,188
ldi R31,0
std z+0,R2
.dbline 34
; TWBR = 0x20; //set bit rate equal 32
ldi R24,32
ldi R30,184
std z+0,R24
.dbline 35
; TWSR = 0x00; //set prescale clock/1
ldi R30,185
std z+0,R2
.dbline 36
; TWAR = 0x00; //set slave address
ldi R30,186
std z+0,R2
.dbline 37
; TWCR = 0x85; //enable twi
ldi R24,133
ldi R30,188
std z+0,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\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\IIC\IIC.C
.dbfunc e twi_isr _twi_isr fV
; IicTwsr -> R16
.even
_twi_isr::
st -y,R2
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 42
; }
;
; #pragma interrupt_handler twi_isr:25
; void twi_isr(void)
; {
.dbline 45
; byte IicTwsr;
;
; IicTwsr = TWSR & 0xF8;
ldi R30,185
ldi R31,0
ldd R16,z+0
andi R16,248
.dbline 46
; switch (IicTwsr)
clr R17
cpi R16,32
ldi R30,0
cpc R17,R30
breq L7
ldi R24,32
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L16
L15:
cpi R16,8
ldi R30,0
cpc R17,R30
breq L6
cpi R16,8
ldi R30,0
cpc R17,R30
brge X1
rjmp L3
X1:
L17:
cpi R16,24
ldi R30,0
cpc R17,R30
breq L7
rjmp L3
L16:
cpi R16,40
ldi R30,0
cpc R17,R30
breq L10
cpi R16,40
ldi R30,0
cpc R17,R30
brge X2
rjmp L3
X2:
L18:
cpi R16,48
ldi R30,0
cpc R17,R30
breq L10
rjmp L3
X0:
.dbline 47
; {
L6:
.dbline 49
; case 0x08:
; TWDR = 0x58; //发送命令;
ldi R24,88
ldi R30,187
ldi R31,0
std z+0,R24
.dbline 50
; START_IIC(); //开始发送
ldi R24,133
ldi R30,188
std z+0,R24
.dbline 51
; g_FirstData = 0;
clr R2
sts _g_FirstData,R2
.dbline 52
; break;
rjmp L4
L7:
.dbline 56
;
; case 0x18:
; case 0x20:
; if (g_FirstData == 0)
lds R2,_g_FirstData
tst R2
breq X3
rjmp L4
X3:
.dbline 57
; {
.dbline 58
; TWDR=0x00; //发送命令;
clr R2
ldi R30,187
ldi R31,0
std z+0,R2
.dbline 59
; START_IIC(); //开始发送
ldi R24,133
ldi R30,188
std z+0,R24
.dbline 60
; g_FirstData = 1;
ldi R24,1
sts _g_FirstData,R24
.dbline 61
; }
.dbline 62
; break;
rjmp L4
L10:
.dbline 66
;
; case 0x28:
; case 0x30:
; if (g_FirstData == 2)
lds R24,_g_FirstData
cpi R24,2
brne L11
.dbline 67
; {
.dbline 68
; TWCR |= 0x10; //发出停止位,停止发送;
lds R24,188
ori R24,16
sts 188,R24
.dbline 69
; g_FirstData = 0xff; //发送完成;
ldi R24,255
sts _g_FirstData,R24
.dbline 70
; }
L11:
.dbline 71
; if (g_FirstData == 1)
lds R24,_g_FirstData
cpi R24,1
brne L4
.dbline 72
; {
.dbline 73
; TWDR = g_IicData; //发送数据;
lds R2,_g_IicData
ldi R30,187
ldi R31,0
std z+0,R2
.dbline 74
; START_IIC(); //开始发送
ldi R24,133
ldi R30,188
std z+0,R24
.dbline 75
; g_FirstData = 2;
ldi R24,2
sts _g_FirstData,R24
.dbline 76
; }
.dbline 77
; break;
rjmp L4
L3:
.dbline 80
lds R24,188
ori R24,16
sts 188,R24
.dbline 81
ldi R24,255
sts _g_FirstData,R24
.dbline 82
L4:
.dbline -2
L2:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r IicTwsr 16 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -