📄 iic.s
字号:
.dbline 95
; }
L21:
.dbline 96
; if(cmd==0x05 && cmd_num==2)
lds R24,_cmd
cpi R24,5
brne L23
lds R24,_cmd_num
cpi R24,2
brne L23
.dbline 97
; {
.dbline 98
; vision_flag=1;
ldi R24,1
sts _vision_flag,R24
.dbline 99
; }
L23:
.dbline 100
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 101
; if(cmd==0xff) //接受到主机发送数据结束位 置标记
lds R24,_cmd
cpi R24,255
breq X18
rjmp L3
X18:
.dbline 102
; {
.dbline 103
; cmd_flag=1;
ldi R24,1
sts _cmd_flag,R24
.dbline 104
; }
.dbline 105
; break;
rjmp L3
L27:
.dbline 108
; }
; case SR_ALL_DATA_ACK://SR_ALL_DATA_ACK=0x90;以前以广播方式被寻址;数据已经被接收,ACK 已返回
; {
.dbline 109
; cmd=TWDR;
in R2,0x3
sts _cmd,R2
.dbline 110
; 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 111
; cmd_num++;
lds R24,_cmd_num
subi R24,255 ; addi 1
sts _cmd_num,R24
.dbline 112
; if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
lds R2,_cmd
tst R2
brne L28
cpi R24,2
brne L28
.dbline 113
; {
.dbline 114
; req_flag=1;
ldi R24,1
sts _req_flag,R24
.dbline 115
; start_flag=0;
clr R2
sts _start_flag,R2
.dbline 116
; vision_flag=0;
sts _vision_flag,R2
.dbline 117
; cmd_flag=0;
sts _cmd_flag,R2
.dbline 118
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 119
; cmd_num=0;
sts _cmd_num,R2
.dbline 120
; }
L28:
.dbline 121
; if(cmd==0x0f) //接收到握手结束位 置标记
lds R24,_cmd
cpi R24,15
brne L30
.dbline 122
; {
.dbline 123
; start_flag=1;
ldi R24,1
sts _start_flag,R24
.dbline 124
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 125
; }
L30:
.dbline 126
; if(cmd==0x05 && cmd_num==2)
lds R24,_cmd
cpi R24,5
brne L32
lds R24,_cmd_num
cpi R24,2
brne L32
.dbline 127
; {
.dbline 128
; vision_flag=1;
ldi R24,1
sts _vision_flag,R24
.dbline 129
; }
L32:
.dbline 130
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 131
; if(cmd==0xff) //接受到主机发送数据结束位 置标记
lds R24,_cmd
cpi R24,255
breq X19
rjmp L3
X19:
.dbline 132
; {
.dbline 133
; cmd_flag=1;
ldi R24,1
sts _cmd_flag,R24
.dbline 134
; }
.dbline 135
; break;
rjmp L3
L36:
.dbline 138
; }
; case SR_ALL_DATA_NOACK://SR_ALL_DATA_NOACK=0x98;以前以广播方式被寻址;数据已经被接收,NOT ACK 已返回
; {
.dbline 139
; cmd=TWDR;
in R2,0x3
sts _cmd,R2
.dbline 140
; 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 141
; cmd_num++;
lds R24,_cmd_num
subi R24,255 ; addi 1
sts _cmd_num,R24
.dbline 142
; if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
lds R2,_cmd
tst R2
brne L37
cpi R24,2
brne L37
.dbline 143
; {
.dbline 144
; req_flag=1;
ldi R24,1
sts _req_flag,R24
.dbline 145
; start_flag=0;
clr R2
sts _start_flag,R2
.dbline 146
; vision_flag=0;
sts _vision_flag,R2
.dbline 147
; cmd_flag=0;
sts _cmd_flag,R2
.dbline 148
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 149
; cmd_num=0;
sts _cmd_num,R2
.dbline 150
; }
L37:
.dbline 151
; if(cmd==0x0f) //接收到握手结束位 置标记
lds R24,_cmd
cpi R24,15
brne L39
.dbline 152
; {
.dbline 153
; start_flag=1;
ldi R24,1
sts _start_flag,R24
.dbline 154
; PWRON;
in R24,0x18
andi R24,223
out 0x18,R24
.dbline 155
; }
L39:
.dbline 156
; if(cmd==0x05 && cmd_num==2)
lds R24,_cmd
cpi R24,5
brne L41
lds R24,_cmd_num
cpi R24,2
brne L41
.dbline 157
; {
.dbline 158
; vision_flag=1;
ldi R24,1
sts _vision_flag,R24
.dbline 159
; }
L41:
.dbline 160
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 161
; if(cmd==0xff) //接受到主机发送数据结束位 置标记
lds R24,_cmd
cpi R24,255
breq X20
rjmp L3
X20:
.dbline 162
; {
.dbline 163
; cmd_flag=1;
ldi R24,1
sts _cmd_flag,R24
.dbline 164
; }
.dbline 165
; break;
rjmp L3
L45:
.dbline 169
; }
; //*****************************从机发送************************/
; case ST_SLA_ACK://SR_STOP_RESTART=0xa8, 自己的SLA+R 已经被接收,ACK 已返回
; {
.dbline 170
; Twi_WB(*(data+j)); //从机发送数据
.dbline 170
lds R2,_data
lds R3,_data+1
lds R30,_j
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
out 0x3,R2
.dbline 170
ldi R24,197
out 0x36,R24
.dbline 170
.dbline 170
.dbline 171
; j++; //准备下一个数据
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
.dbline 172
; break;
rjmp L3
L46:
.dbline 175
; }
; case MT_ST_SLA_ACK://SR_STOP_RESTART=0xb0, SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
; {
.dbline 176
; Twi_WB(*(data+j)); //从机发送数据
.dbline 176
lds R2,_data
lds R3,_data+1
lds R30,_j
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
out 0x3,R2
.dbline 176
ldi R24,197
out 0x36,R24
.dbline 176
.dbline 176
.dbline 177
; j++; //准备下一个数据
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
.dbline 178
; break;
rjmp L3
L47:
.dbline 181
; }
; case ST_DATA_ACK://SR_STOP_RESTART=0xb8, TWDR 里数据已经发送,接收到ACK
; {
.dbline 182
; Twi_WB(*(data+j)); //从机发送数据
.dbline 182
lds R2,_data
lds R3,_data+1
lds R30,_j
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
out 0x3,R2
.dbline 182
ldi R24,197
out 0x36,R24
.dbline 182
.dbline 182
.dbline 183
; j++; //准备下一个数据
lds R24,_j
subi R24,255 ; addi 1
sts _j,R24
.dbline 184
; break;
rjmp L3
L48:
.dbline 187
; }
; case ST_DATA_NOACK://SR_STOP_RESTART=0xc0, TWDR 里数据已经发送,接收到NOT ACK
; {
.dbline 188
; j=0; //发送完数据请零结束
clr R2
sts _j,R2
.dbline 189
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 190
; break;
rjmp L3
L49:
.dbline 193
; }
; case ST_LAST_DATA_ACK://SR_STOP_RESTART=0xc8, TWDR 的一字节数据已经发送,(TWAE = “0”);接收到ACK
; {
.dbline 194
; j=0;//发送完数据请零结束
clr R2
sts _j,R2
.dbline 195
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 196
; break;
rjmp L3
L50:
.dbline 199
; }
; case SR_STOP_RESTART://SR_STOP_RESTART=0xa0, 在以从机工作时接收到STOP或重复START
; {
.dbline 200
; j=0;
clr R2
sts _j,R2
.dbline 201
; Twi_ACK();
ldi R24,197
out 0x36,R24
.dbline 202
; break;
rjmp L3
L2:
.dbline 205
.dbline 206
ldi R24,149
out 0x36,R24
.dbline 207
L3:
.dbline -2
L1:
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 R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -