📄 iic.s
字号:
.module iic.c
.area vector(rom, abs)
.org 34
rjmp _TWI_ISR
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Rooger\桌面\GSM_PHONE\iic.c
.dbfunc e TWI_ISR _TWI_ISR fV
.even
_TWI_ISR::
st -y,R2
st -y,R3
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 22
; /************************************iic.c**************************
; *iic.c负责同上层软件之间的通讯
; *iic在NPI中处于两种工作方式 从机接收模式以及从机发送模式
; *从机接收模式 在通讯过程中 应答主机请求 并将数据保存到相应数组以便主程序判断
; *从机发送模式 通过pwr拉高请求主机接收数据 然后根据主机应答发送数据
; ********************************************************************/
; #include <iom8v.h>
; #include <macros.h>
; #include "iic.h"
; #include "define.h"
;
; extern uchar buf[15]; //pc同i2c交互数据存放处
; extern uchar cmd;//i2c数据缓存
; extern uchar cmd_num;//i2c数据计数
; extern uchar flag; //
; extern uchar *data;
; extern uchar j;
; extern uchar req_flag,start_flag,vision_flag,cmd_flag;
; //*****************************************************************************/
; #pragma interrupt_handler TWI_ISR:18
; void TWI_ISR(void)
; {
.dbline 24
; //TWI被控接收器模式中断处理
; switch (TestAck())
in R16,0x1
clr R17
andi R16,248
andi R17,0
cpi R16,144
ldi R30,0
cpc R17,R30
brne X1
rjmp L27
X1:
ldi R24,144
ldi R25,0
cp R24,R16
cpc R25,R17
brge X2
rjmp L52
X2:
L51:
cpi R16,112
ldi R30,0
cpc R17,R30
brne X3
rjmp L7
X3:
ldi R24,112
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L54
L53:
cpi R16,96
ldi R30,0
cpc R17,R30
brne X4
rjmp L5
X4:
cpi R16,96
ldi R30,0
cpc R17,R30
brge X5
rjmp L2
X5:
L55:
cpi R16,104
ldi R30,0
cpc R17,R30
brne X6
rjmp L6
X6:
rjmp L2
L54:
cpi R16,128
ldi R30,0
cpc R17,R30
brne X7
rjmp L9
X7:
ldi R24,128
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L57
L56:
cpi R16,120
ldi R30,0
cpc R17,R30
brne X8
rjmp L8
X8:
rjmp L2
L57:
cpi R16,136
ldi R30,0
cpc R17,R30
brne X9
rjmp L18
X9:
rjmp L2
L52:
cpi R16,176
ldi R30,0
cpc R17,R30
brne X10
rjmp L46
X10:
ldi R24,176
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L59
L58:
cpi R16,160
ldi R30,0
cpc R17,R30
brne X11
rjmp L50
X11:
ldi R24,160
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L61
L60:
cpi R16,152
ldi R30,0
cpc R17,R30
brne X12
rjmp L36
X12:
rjmp L2
L61:
cpi R16,168
ldi R30,0
cpc R17,R30
brne X13
rjmp L45
X13:
rjmp L2
L59:
cpi R16,192
ldi R30,0
cpc R17,R30
brne X14
rjmp L48
X14:
ldi R24,192
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L63
L62:
cpi R16,184
ldi R30,0
cpc R17,R30
brne X15
rjmp L47
X15:
rjmp L2
L63:
cpi R16,200
ldi R30,0
cpc R17,R30
brne X16
rjmp L49
X16:
rjmp L2
X0:
.dbline 25
; {
L5:
.dbline 28
; //从机接收
; case SR_SLA_ACK: //SR_SLA_ACK=0x60; SLA+W已经被接收ACK 已返回
; {
.dbline 29
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 30
; break;
rjmp L3
L6:
.dbline 33
; }
; case MT_SR_SLA_ACK://MT_SR_SLA_ACK=0x68;SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收,ACK 已返回
; {
.dbline 34
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 35
; break;
rjmp L3
L7:
.dbline 38
; }
; case SR_ALL_ACK://SR_ALL_ACK=0x70;接收到广播地址,ACK 已返回
; {
.dbline 39
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 40
; break;
rjmp L3
L8:
.dbline 43
; }
; case MT_SR_ALL_ACK://MT_SR_ALL_ACK=0x78;SLA+R/W 作为主机的仲裁失败;接收到广播地址,ACK 已返回
; {
.dbline 44
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 45
; break;
rjmp L3
L9:
.dbline 48
; }
; case SR_DATA_ACK://SR_DATA_ACK=0X80;以前以自己的 SLA+W 被寻址;数据已经被接收,ACK 已返回
; {
.dbline 49
; cmd=TWDR;
in R2,0x3
sts _cmd,R2
.dbline 50
; buf[cmd_num]=cmd;
ldi R24,<_buf
ldi R25,>_buf
lds R30,_cmd_num
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 51
; cmd_num++;
lds R24,_cmd_num
subi R24,255 ; addi 1
sts _cmd_num,R24
.dbline 52
; if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
lds R2,_cmd
tst R2
brne L10
cpi R24,2
brne L10
.dbline 53
; {
.dbline 54
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 55
; req_flag=1;
ldi R24,1
sts _req_flag,R24
.dbline 56
; start_flag=0;
clr R2
sts _start_flag,R2
.dbline 57
; vision_flag=0;
sts _vision_flag,R2
.dbline 58
; cmd_flag=0;
sts _cmd_flag,R2
.dbline 59
; cmd_num=0;
sts _cmd_num,R2
.dbline 60
; }
L10:
.dbline 61
; if(cmd==0x0f) //接收到握手结束位 置标记
lds R24,_cmd
cpi R24,15
brne L12
.dbline 62
; {
.dbline 63
; start_flag=1;
ldi R24,1
sts _start_flag,R24
.dbline 64
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 65
; }
L12:
.dbline 66
; if(cmd==0x05 && cmd_num==2)
lds R24,_cmd
cpi R24,5
brne L14
lds R24,_cmd_num
cpi R24,2
brne L14
.dbline 67
; {
.dbline 68
; vision_flag=1;
ldi R24,1
sts _vision_flag,R24
.dbline 69
; }
L14:
.dbline 70
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 71
; if(cmd==0xff) //接受到主机发送数据结束位 置标记
lds R24,_cmd
cpi R24,255
breq X17
rjmp L3
X17:
.dbline 72
; {
.dbline 73
; cmd_flag=1;
ldi R24,1
sts _cmd_flag,R24
.dbline 74
; }
.dbline 75
; break;
rjmp L3
L18:
.dbline 78
; }
; case SR_DATA_NOACK://SR_DATA_NOACK=0x88;以前以自己的 SLA+W 被寻址;数据已经被接收,NOT ACK 已返回
; {
.dbline 79
; cmd=TWDR;
in R2,0x3
sts _cmd,R2
.dbline 80
; buf[cmd_num]=cmd;
ldi R24,<_buf
ldi R25,>_buf
lds R30,_cmd_num
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 81
; cmd_num++;
lds R24,_cmd_num
subi R24,255 ; addi 1
sts _cmd_num,R24
.dbline 82
; if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
lds R2,_cmd
tst R2
brne L19
cpi R24,2
brne L19
.dbline 83
; {
.dbline 84
; req_flag=1;
ldi R24,1
sts _req_flag,R24
.dbline 85
; start_flag=0;
clr R2
sts _start_flag,R2
.dbline 86
; vision_flag=0;
sts _vision_flag,R2
.dbline 87
; cmd_flag=0;
sts _cmd_flag,R2
.dbline 88
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 89
; cmd_num=0;
sts _cmd_num,R2
.dbline 90
; }
L19:
.dbline 91
; if(cmd==0x0f) //接收到握手结束位 置标记
lds R24,_cmd
cpi R24,15
brne L21
.dbline 92
; {
.dbline 93
; start_flag=1;
ldi R24,1
sts _start_flag,R24
.dbline 94
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -