⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex_support.s

📁 《深入浅出AVR单片机——从ATmega48/88/168开始》的实例程序源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	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 + -