📄 ex_support.lis
字号:
00D6 ;
00D6 ; case SLAWSendACK : //SLA+W已发送,收到ACK
00D6 ; {
00D6 .dbline 245
00D6 ; p = &RecArr[0];
00D6 80E0 ldi R24,<_RecArr
00D8 90E0 ldi R25,>_RecArr
00DA 90930100 sts _p+1,R25
00DE 80930000 sts _p,R24
00E2 .dbline 246
00E2 ; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //广播地址+W发送完成,发送停止信号
00E2 8091BC00 lds R24,188
00E6 8061 ori R24,16
00E8 8093BC00 sts 188,R24
00EC .dbline 247
00EC ; TWIProcess = TWIProcessOver;
00EC 81E0 ldi R24,1
00EE 80930600 sts _TWIProcess,R24
00F2 .dbline 248
00F2 ; break;
00F2 19C0 rjmp L18
00F4 X2:
00F4 .dbline 252
00F4 ; }
00F4 ;
00F4 ; case SLAWRecACK :
00F4 ; {
00F4 .dbline 253
00F4 ; break;
00F4 L23:
00F4 .dbline 257
00F4 ; }
00F4 ;
00F4 ; case SRDataACK :
00F4 ; {
00F4 .dbline 258
00F4 ; *p = TWDR;
00F4 2090BB00 lds R2,187
00F8 E0910000 lds R30,_p
00FC F0910100 lds R31,_p+1
0100 2082 std z+0,R2
0102 .dbline 259
0102 ; p++;
0102 80910000 lds R24,_p
0106 90910100 lds R25,_p+1
010A 0196 adiw R24,1
010C 90930100 sts _p+1,R25
0110 80930000 sts _p,R24
0114 .dbline 260
0114 ; break;
0114 08C0 rjmp L18
0116 L17:
0116 .dbline 264
0116 ; }
0116 ;
0116 ; default :
0116 ; {
0116 .dbline 265
0116 ; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //出现错误状态,总线恢复空闲状态
0116 8091BC00 lds R24,188
011A 8061 ori R24,16
011C 8093BC00 sts 188,R24
0120 .dbline 266
0120 ; TWIProcess = TWIProcessERR; //当前TWI操作任务遇不明原因终止
0120 81E2 ldi R24,33
0122 80930600 sts _TWIProcess,R24
0126 .dbline 267
0126 ; } //在操作的最后,我们并没有再次设置TWEN位,用意是提醒大家编程细心,"意外"清除TWEN位本来就是不对的
0126 .dbline 269
0126 ;
0126 ; }
0126 L18:
0126 .dbline 271
0126 ;
0126 ; TWCR |= BIT(TWINT);
0126 8091BC00 lds R24,188
012A 8068 ori R24,128
012C 8093BC00 sts 188,R24
0130 .dbline -2
0130 L16:
0130 .dbline 0 ; func end
0130 0895 ret
0132 .dbsym r TWIStatus 16 c
0132 .dbend
0132 .dbfunc e Port_refresh _Port_refresh fV
0132 ; i -> R16
.even
0132 _Port_refresh::
0132 .dbline -1
0132 .dbline 281
0132 ; }
0132 ;
0132 ; /***********************************************************
0132 ; * 函数说明:虚拟端口刷新函数 *
0132 ; * 输入: 无 *
0132 ; * 输出: 无 *
0132 ; * 调用函数:无 *
0132 ; ***********************************************************/
0132 ; void Port_refresh (void)
0132 ; {
0132 .dbline 284
0132 ; unsigned char i;
0132 ;
0132 ; SS_Low; //模拟#SS的下跳沿
0132 2A98 cbi 0x5,2
0134 .dbline 286
0134 ;
0134 ; for (i=0; i<ExtPortNum; i++)
0134 0027 clr R16
0136 0CC0 rjmp L31
0138 L28:
0138 .dbline 287
0138 ; {
0138 .dbline 288
0138 ; SPDR = PortBuffer[i]; //刷新虚拟端口的一个字节
0138 80E0 ldi R24,<_PortBuffer
013A 90E0 ldi R25,>_PortBuffer
013C E02F mov R30,R16
013E FF27 clr R31
0140 E80F add R30,R24
0142 F91F adc R31,R25
0144 2080 ldd R2,z+0
0146 2EBC out 0x2e,R2
0148 L32:
0148 .dbline 289
0148 L33:
0148 .dbline 289
0148 2DB4 in R2,0x2d
014A 27FE sbrs R2,7
014C FDCF rjmp L32
014E .dbline 290
014E L29:
014E .dbline 286
014E 0395 inc R16
0150 L31:
0150 .dbline 286
0150 0330 cpi R16,3
0152 90F3 brlo L28
0154 .dbline 292
0154 ; while(!(SPSR&(1<<SPIF))); //等待通讯完成
0154 ; }
0154 ;
0154 ; SS_High; //模拟#SS的上跳沿
0154 2A9A sbi 0x5,2
0156 .dbline -2
0156 L27:
0156 .dbline 0 ; func end
0156 0895 ret
0158 .dbsym r i 16 c
0158 .dbend
.area data(ram, con, rel)
0007 .dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
0007 L36:
0007 .blkb 1
.area idata
0007 00 .byte 0
.area data(ram, con, rel)
0008 .dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
.area text(rom, con, rel)
0158 .dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
0158 .dbfunc e LEDDisplay _LEDDisplay fV
0158 .dbsym s ScanStatu L36 c
0158 ; LocalTime -> R20
.even
0158 _LEDDisplay::
0158 00D0 rcall push_gset1
015A .dbline -1
015A .dbline 302
015A ; }
015A ;
015A ; /***********************************************************
015A ; * 函数说明:显示驱动函数 *
015A ; * 输入: 无 *
015A ; * 输出: 无 *
015A ; * 调用函数:无 *
015A ; ***********************************************************/
015A ; void LEDDisplay(void)
015A ; {
015A .dbline 306
015A ; static unsigned char ScanStatu = 0; //扫描状态标志,扫描程序内部使用
015A ; unsigned char LocalTime; //函数内部使用的时标
015A ;
015A ; LocalTime = g_wSystemTimer%20;
015A 24E1 ldi R18,20
015C 30E0 ldi R19,0
015E 00910200 lds R16,_g_wSystemTimer
0162 10910300 lds R17,_g_wSystemTimer+1
0166 00D0 rcall mod16u
0168 402F mov R20,R16
016A .dbline 308
016A ;
016A ; if (LocalTime > 16)
016A 80E1 ldi R24,16
016C 8017 cp R24,R16
016E 08F4 brsh L37
0170 .dbline 309
0170 ; return;
0170 17C0 rjmp L35
0172 L37:
0172 .dbline 311
0172 ; else
0172 ; {
0172 .dbline 312
0172 ; LocalTime >>= 1;
0172 4695 lsr R20
0174 .dbline 313
0174 ; ScanPort = (~(1<<LocalTime));
0174 01E0 ldi R16,1
0176 142F mov R17,R20
0178 00D0 rcall lsl8
017A 202E mov R2,R16
017C 2094 com R2
017E 20920200 sts _PortBuffer+2,R2
0182 .dbline 314
0182 ; SegPort = (DisTab[LEDDisBuffer[LocalTime]]);
0182 80E0 ldi R24,<_LEDDisBuffer
0184 90E0 ldi R25,>_LEDDisBuffer
0186 E42F mov R30,R20
0188 FF27 clr R31
018A E80F add R30,R24
018C F91F adc R31,R25
018E E081 ldd R30,z+0
0190 FF27 clr R31
0192 80E0 ldi R24,<_DisTab
0194 90E0 ldi R25,>_DisTab
0196 E80F add R30,R24
0198 F91F adc R31,R25
019A E491 lpm R30,Z
019C E0930100 sts _PortBuffer+1,R30
01A0 .dbline 315
01A0 ; }
01A0 .dbline -2
01A0 L35:
01A0 00D0 rcall pop_gset1
01A2 .dbline 0 ; func end
01A2 0895 ret
01A4 .dbsym r LocalTime 20 c
01A4 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\实例17_I2C抢答器_主机程序\EX_Support.c
0000 _PortBuffer::
0000 .blkb 3
0003 .dbsym e PortBuffer _PortBuffer A[3:3]c
0003 _LEDDisBuffer::
0003 .blkb 8
000B .dbsym e LEDDisBuffer _LEDDisBuffer A[8:8]c
000B _RecArr::
000B .blkb 6
0011 .dbsym e RecArr _RecArr A[6:6]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -