📄 ex_support.s
字号:
clr R3
sts _g_wSystemTimer+1,R3
sts _g_wSystemTimer,R2
L13:
.dbline 205
;
; DoTime = TRUE; //端口刷新与闪烁控制标志
ldi R24,1
sts _DoTime,R24
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Insert_Timer1_OVF_ISR_Code _Insert_Timer1_OVF_ISR_Code fV
.even
_Insert_Timer1_OVF_ISR_Code::
.dbline -1
.dbline 215
; }
;
; /***********************************************************
; * 函数说明:定时器1中断处理程序代码插入函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; void Insert_Timer1_OVF_ISR_Code(void)
; {
.dbline 216
; TIMERSTOP;
clr R2
sts 129,R2
.dbline 217
; ShowTime = TRUE;
ldi R24,1
sts _ShowTime,R24
.dbline 218
; Beep(10);
ldi R16,10
ldi R17,0
rcall _Beep
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Insert_Twi_Isr_Code _Insert_Twi_Isr_Code fV
; TWIStatus -> R16
.even
_Insert_Twi_Isr_Code::
.dbline -1
.dbline 228
; }
;
; /***********************************************************
; * 函数说明:TWI中断处理程序代码插入函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; void Insert_Twi_Isr_Code(void)
; {
.dbline 231
; unsigned char TWIStatus;
;
; TWIStatus = TWSR&0xF8;
lds R16,185
andi R16,248
.dbline 233
;
; TWCR &= ~(BIT(TWINT)|BIT(TWSTA)|BIT(TWSTO));
lds R24,188
andi R24,79
sts 188,R24
.dbline 235
;
; switch (TWIStatus)
clr R17
cpi R16,24
ldi R30,0
cpc R17,R30
breq L21
ldi R24,24
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L25
L24:
cpi R16,8
ldi R30,0
cpc R17,R30
breq L20
rjmp L17
L25:
cpi R16,96
ldi R30,0
cpc R17,R30
breq L18
cpi R16,96
ldi R30,0
cpc R17,R30
brlt L17
L26:
cpi R16,128
ldi R30,0
cpc R17,R30
breq L23
rjmp L17
X1:
.dbline 236
; {
L20:
.dbline 238
; case SSend : //启动位已发送
; {
.dbline 239
; TWDR = 0x00; //发送广播地址,写方向
clr R2
sts 187,R2
.dbline 240
; break;
rjmp L18
L21:
.dbline 244
; }
;
; case SLAWSendACK : //SLA+W已发送,收到ACK
; {
.dbline 245
; p = &RecArr[0];
ldi R24,<_RecArr
ldi R25,>_RecArr
sts _p+1,R25
sts _p,R24
.dbline 246
; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //广播地址+W发送完成,发送停止信号
lds R24,188
ori R24,16
sts 188,R24
.dbline 247
; TWIProcess = TWIProcessOver;
ldi R24,1
sts _TWIProcess,R24
.dbline 248
; break;
rjmp L18
X2:
.dbline 252
; }
;
; case SLAWRecACK :
; {
.dbline 253
; break;
L23:
.dbline 257
; }
;
; case SRDataACK :
; {
.dbline 258
; *p = TWDR;
lds R2,187
lds R30,_p
lds R31,_p+1
std z+0,R2
.dbline 259
; p++;
lds R24,_p
lds R25,_p+1
adiw R24,1
sts _p+1,R25
sts _p,R24
.dbline 260
; break;
rjmp L18
L17:
.dbline 264
; }
;
; default :
; {
.dbline 265
; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //出现错误状态,总线恢复空闲状态
lds R24,188
ori R24,16
sts 188,R24
.dbline 266
; TWIProcess = TWIProcessERR; //当前TWI操作任务遇不明原因终止
ldi R24,33
sts _TWIProcess,R24
.dbline 267
; } //在操作的最后,我们并没有再次设置TWEN位,用意是提醒大家编程细心,"意外"清除TWEN位本来就是不对的
.dbline 269
;
; }
L18:
.dbline 271
;
; TWCR |= BIT(TWINT);
lds R24,188
ori R24,128
sts 188,R24
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbsym r TWIStatus 16 c
.dbend
.dbfunc e Port_refresh _Port_refresh fV
; i -> R16
.even
_Port_refresh::
.dbline -1
.dbline 281
; }
;
; /***********************************************************
; * 函数说明:虚拟端口刷新函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; void Port_refresh (void)
; {
.dbline 284
; unsigned char i;
;
; SS_Low; //模拟#SS的下跳沿
cbi 0x5,2
.dbline 286
;
; for (i=0; i<ExtPortNum; i++)
clr R16
rjmp L31
L28:
.dbline 287
; {
.dbline 288
; SPDR = PortBuffer[i]; //刷新虚拟端口的一个字节
ldi R24,<_PortBuffer
ldi R25,>_PortBuffer
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x2e,R2
L32:
.dbline 289
L33:
.dbline 289
in R2,0x2d
sbrs R2,7
rjmp L32
.dbline 290
L29:
.dbline 286
inc R16
L31:
.dbline 286
cpi R16,3
brlo L28
.dbline 292
; while(!(SPSR&(1<<SPIF))); //等待通讯完成
; }
;
; SS_High; //模拟#SS的上跳沿
sbi 0x5,2
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.area data(ram, con, rel)
.dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
L36:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
.area text(rom, con, rel)
.dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
.dbfunc e LEDDisplay _LEDDisplay fV
.dbsym s ScanStatu L36 c
; LocalTime -> R20
.even
_LEDDisplay::
rcall push_gset1
.dbline -1
.dbline 302
; }
;
; /***********************************************************
; * 函数说明:显示驱动函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; void LEDDisplay(void)
; {
.dbline 306
; static unsigned char ScanStatu = 0; //扫描状态标志,扫描程序内部使用
; unsigned char LocalTime; //函数内部使用的时标
;
; LocalTime = g_wSystemTimer%20;
ldi R18,20
ldi R19,0
lds R16,_g_wSystemTimer
lds R17,_g_wSystemTimer+1
rcall mod16u
mov R20,R16
.dbline 308
;
; if (LocalTime > 16)
ldi R24,16
cp R24,R16
brsh L37
.dbline 309
; return;
rjmp L35
L37:
.dbline 311
; else
; {
.dbline 312
; LocalTime >>= 1;
lsr R20
.dbline 313
; ScanPort = (~(1<<LocalTime));
ldi R16,1
mov R17,R20
rcall lsl8
mov R2,R16
com R2
sts _PortBuffer+2,R2
.dbline 314
; SegPort = (DisTab[LEDDisBuffer[LocalTime]]);
ldi R24,<_LEDDisBuffer
ldi R25,>_LEDDisBuffer
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_DisTab
ldi R25,>_DisTab
add R30,R24
adc R31,R25
lpm R30,Z
sts _PortBuffer+1,R30
.dbline 315
; }
.dbline -2
L35:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r LocalTime 20 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
_PortBuffer::
.blkb 3
.dbsym e PortBuffer _PortBuffer A[3:3]c
_LEDDisBuffer::
.blkb 8
.dbsym e LEDDisBuffer _LEDDisBuffer A[8:8]c
_RecArr::
.blkb 6
.dbsym e RecArr _RecArr A[6:6]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -