📄 ex_support.lis
字号:
0040 ;
0040 ; /***********************************************************
0040 ; * 函数说明:定时器0中断处理程序代码插入函数 *
0040 ; * 输入: 无 *
0040 ; * 输出: 无 *
0040 ; * 调用函数:无 *
0040 ; ***********************************************************/
0040 ; void Insert_Timer1_OVF_ISR_Code(void)
0040 ; {
0040 .dbline 167
0040 ; TCNT1H = 0xB3;
0040 83EB ldi R24,179
0042 80938500 sts 133,R24
0046 .dbline 168
0046 ; TCNT1L = 0xB5;
0046 85EB ldi R24,181
0048 80938400 sts 132,R24
004C .dbline 169
004C ; Beep(10);
004C 0AE0 ldi R16,10
004E 10E0 ldi R17,0
0050 EDDF rcall _Beep
0052 .dbline -2
0052 L12:
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
0000 L14:
0000 .blkb 1
.area text(rom, con, rel)
0054 .dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
0054 .dbfunc e Insert_TWI_ISR_Code _Insert_TWI_ISR_Code fV
0054 .dbsym s TWISendCounter L14 c
0054 ; TWIStatus -> R16
.even
0054 _Insert_TWI_ISR_Code::
0054 .dbline -1
0054 .dbline 179
0054 ; }
0054 ;
0054 ; /***********************************************************
0054 ; * 函数说明:TWI事件中断处理程序代码插入函数 *
0054 ; * 输入: 无 *
0054 ; * 输出: 无 *
0054 ; * 调用函数:无 *
0054 ; ***********************************************************/
0054 ; void Insert_TWI_ISR_Code(void)
0054 ; {
0054 .dbline 183
0054 ; unsigned char TWIStatus;
0054 ; static unsigned char TWISendCounter;
0054 ;
0054 ; TWIStatus = TWSR&0xF8;
0054 0091B900 lds R16,185
0058 087F andi R16,248
005A .dbline 184
005A ; UDR0 = TWIStatus;
005A 0093C600 sts 198,R16
005E .dbline 186
005E ;
005E ; TWCR &= ~(BIT(TWINT)|BIT(TWSTA)|BIT(TWSTO));
005E 8091BC00 lds R24,188
0062 8F74 andi R24,79
0064 8093BC00 sts 188,R24
0068 .dbline 188
0068 ;
0068 ; switch (TWIStatus)
0068 1127 clr R17
006A 0832 cpi R16,40
006C E0E0 ldi R30,0
006E 1E07 cpc R17,R30
0070 69F1 breq L20
0072 88E2 ldi R24,40
0074 90E0 ldi R25,0
0076 8017 cp R24,R16
0078 9107 cpc R25,R17
007A 74F0 brlt L26
007C L25:
007C 0830 cpi R16,8
007E E0E0 ldi R30,0
0080 1E07 cpc R17,R30
0082 C9F0 breq L18
0084 0830 cpi R16,8
0086 E0E0 ldi R30,0
0088 1E07 cpc R17,R30
008A 0CF4 brge X2
008C 4EC0 rjmp L15
008E X2:
008E L27:
008E 0831 cpi R16,24
0090 E0E0 ldi R30,0
0092 1E07 cpc R17,R30
0094 B9F0 breq L19
0096 49C0 rjmp L15
0098 L26:
0098 0833 cpi R16,56
009A E0E0 ldi R30,0
009C 1E07 cpc R17,R30
009E 09F4 brne X3
00A0 3BC0 rjmp L24
00A2 X3:
00A2 0833 cpi R16,56
00A4 E0E0 ldi R30,0
00A6 1E07 cpc R17,R30
00A8 0CF4 brge X4
00AA 3FC0 rjmp L15
00AC X4:
00AC L28:
00AC 0037 cpi R16,112
00AE E0E0 ldi R30,0
00B0 1E07 cpc R17,R30
00B2 49F1 breq L23
00B4 3AC0 rjmp L15
00B6 X1:
00B6 .dbline 189
00B6 ; {
00B6 L18:
00B6 .dbline 191
00B6 ; case SSend : //启动位已发送
00B6 ; {
00B6 .dbline 192
00B6 ; TWDR = 0xF0; //向主机传送时间
00B6 80EF ldi R24,240
00B8 8093BB00 sts 187,R24
00BC .dbline 193
00BC ; TWISendCounter = 0;
00BC 2224 clr R2
00BE 20920000 sts L14,R2
00C2 .dbline 194
00C2 ; break;
00C2 3BC0 rjmp L16
00C4 L19:
00C4 .dbline 198
00C4 ; }
00C4 ;
00C4 ; case SLAWSendACK : //SLA+W已发送,收到ACK
00C4 ; {
00C4 .dbline 199
00C4 ; TWDR = 0xA0; //发送从机编号
00C4 80EA ldi R24,160
00C6 8093BB00 sts 187,R24
00CA .dbline 200
00CA ; break;
00CA 37C0 rjmp L16
00CC L20:
00CC .dbline 204
00CC ; }
00CC ;
00CC ; case TDataACK :
00CC ; {
00CC .dbline 205
00CC ; if (TWISendCounter < 2)
00CC 80910000 lds R24,L14
00D0 8230 cpi R24,2
00D2 80F4 brsh L21
00D4 .dbline 206
00D4 ; {
00D4 .dbline 207
00D4 ; TWDR = Time[TWISendCounter];
00D4 80E0 ldi R24,<_Time
00D6 90E0 ldi R25,>_Time
00D8 E0910000 lds R30,L14
00DC FF27 clr R31
00DE E80F add R30,R24
00E0 F91F adc R31,R25
00E2 2080 ldd R2,z+0
00E4 2092BB00 sts 187,R2
00E8 .dbline 208
00E8 ; TWISendCounter++;
00E8 80910000 lds R24,L14
00EC 8F5F subi R24,255 ; addi 1
00EE 80930000 sts L14,R24
00F2 .dbline 209
00F2 ; }
00F2 23C0 rjmp L16
00F4 L21:
00F4 .dbline 211
00F4 ; else
00F4 ; {
00F4 .dbline 212
00F4 ; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //时间发送完成,停止总线
00F4 8091BC00 lds R24,188
00F8 8061 ori R24,16
00FA 8093BC00 sts 188,R24
00FE .dbline 213
00FE ; TWIProcess = TWIProcessOver;
00FE 81E0 ldi R24,1
0100 80930000 sts _TWIProcess,R24
0104 .dbline 214
0104 ; }
0104 .dbline 215
0104 ; break;
0104 1AC0 rjmp L16
0106 L23:
0106 .dbline 219
0106 ; }
0106 ;
0106 ; case GCAddRACK : //收到广播地址,ACK已发
0106 ; {
0106 .dbline 220
0106 ; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //空闲总线
0106 8091BC00 lds R24,188
010A 8061 ori R24,16
010C 8093BC00 sts 188,R24
0110 .dbline 221
0110 ; TIMERSTART; //启动计时
0110 84E0 ldi R24,4
0112 80938100 sts 129,R24
0116 .dbline 222
0116 ; break;
0116 11C0 rjmp L16
0118 L24:
0118 .dbline 226
0118 ; }
0118 ;
0118 ; case ArbiLost : //仲裁失败
0118 ; {
0118 .dbline 227
0118 ; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //恢复从机状态
0118 8091BC00 lds R24,188
011C 8061 ori R24,16
011E 8093BC00 sts 188,R24
0122 .dbline 228
0122 ; TWIProcess = TWIPrecessHan;
0122 81E3 ldi R24,49
0124 80930000 sts _TWIProcess,R24
0128 .dbline 229
0128 ; break;
0128 08C0 rjmp L16
012A L15:
012A .dbline 233
012A ; }
012A ;
012A ; default :
012A ; {
012A .dbline 234
012A ; TWCR |= BIT(TWSTO)&(~BIT(TWINT)); //出现错误状态,总线恢复空闲状态
012A 8091BC00 lds R24,188
012E 8061 ori R24,16
0130 8093BC00 sts 188,R24
0134 .dbline 235
0134 ; TWIProcess = TWIProcessERR; //当前TWI操作任务遇不明原因终止
0134 81E2 ldi R24,33
0136 80930000 sts _TWIProcess,R24
013A .dbline 236
013A ; } //在操作的最后,我们并没有再次设置TWEN位,用意是提醒大家编程细心,"意外"清除TWEN位本来就是不对的
013A .dbline 238
013A ;
013A ; }
013A L16:
013A .dbline 240
013A ;
013A ; TWCR |= BIT(TWINT);
013A 8091BC00 lds R24,188
013E 8068 ori R24,128
0140 8093BC00 sts 188,R24
0144 .dbline -2
0144 L13:
0144 .dbline 0 ; func end
0144 0895 ret
0146 .dbsym r TWIStatus 16 c
0146 .dbend
.area bss(ram, con, rel)
0001 .dbfile D:\实例17_I2C抢答器_从机程序\EX_Support.c
0001 _Time::
0001 .blkb 2
0003 .dbsym e Time _Time A[2:2]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -