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

📄 ex_support.lis

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