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

📄 ir.lis

📁 单片机红外通讯控制 C语言编写 源程序。
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0154 8068              ori R24,128
 0156 8BBF              out 0x3b,R24
 0158                   .dbline -2
 0158           L48:
 0158                   .dbline 0 ; func end
 0158 0895              ret
 015A                   .dbend
 015A                   .dbfunc e int1_serving _int1_serving fV
 015A           ;            buf -> y+0
 015A           ;              j -> R22
 015A           ;              k -> R10
 015A           ;            mid -> R12
 015A           ;              i -> R20
                        .even
 015A           _int1_serving::
 015A 00D0              rcall push_lset
 015C 00D0              rcall push_gset4
 015E 2497              sbiw R28,4
 0160                   .dbline -1
 0160                   .dbline 163
 0160           ; }
 0160           ; /************************************************
 0160           ; 函 数 名:    Init_serving()
 0160           ; 功    能:    红外IR接收中断服务程序
 0160           ; 输入参数:     /
 0160           ; 输出参数:    /
 0160           ; 描    述:    整个红外译码部分的处理
 0160           ; ***********************************************/
 0160           ; void int1_serving (void)   //外部中断1,红外IR接收中断服务程序
 0160           ; {
 0160                   .dbline 166
 0160           ;    uchar i,j,k,mid ;
 0160           ;    uchar buf[4];
 0160           ;    CLI();              //暂时屏蔽外部中断
 0160 F894              cli
 0162                   .dbline 168
 0162           ;    
 0162           ;    for (i=0;i<9;i++)
 0162 4427              clr R20
 0164 06C0              rjmp L53
 0166           L50:
 0166                   .dbline 169
 0166           ;    {
 0166                   .dbline 170
 0166           ;          Delay882uS();      //调用882uS延迟程序。
 0166 5DDF              rcall _Delay882uS
 0168                   .dbline 171
 0168           ;          if((PIND&0x08)!=0) //判断INT1端口的状态。操作的是PD3,PD3为高吗?
 0168 839B              sbis 0x10,3
 016A 02C0              rjmp L54
 016C                   .dbline 172
 016C           ;          {
 016C                   .dbline 173
 016C           ;               SEI();           //开中断
 016C 7894              sei
 016E                   .dbline 174
 016E           ;               return;          //如果为高,说明是干扰或出错,跳出这个循环。
 016E 38C0              rjmp L49
 0170           L54:
 0170                   .dbline 176
 0170           L51:
 0170                   .dbline 168
 0170 4395              inc R20
 0172           L53:
 0172                   .dbline 168
 0172 4930              cpi R20,9
 0174 C0F3              brlo L50
 0176           L56:
 0176                   .dbline 177
 0176           L57:
 0176                   .dbline 177
 0176           ;          }
 0176           ;    }
 0176           ;    while ((PIND & 0x08) == 0); //等待9ms的低电平结束,
 0176 839B              sbis 0x10,3
 0178 FECF              rjmp L56
 017A           L59:
 017A                   .dbline 179
 017A           L60:
 017A                   .dbline 179
 017A           ;    
 017A           ;    while ((PIND & 0x08) != 0); //等待4.5ms的高电平结束,
 017A 8399              sbic 0x10,3
 017C FECF              rjmp L59
 017E                   .dbline 181
 017E           ; 
 017E           ;    for (j=0;j<4;j++)
 017E 6627              clr R22
 0180 21C0              rjmp L65
 0182           L62:
 0182                   .dbline 182
 0182           ;    {
 0182                   .dbline 183
 0182           ;        k=0;
 0182 AA24              clr R10
 0184                   .dbline 184
 0184           ;          for (i=0;i<8;i++)
 0184 4427              clr R20
 0186 15C0              rjmp L69
 0188           X5:
 0188                   .dbline 185
 0188           ;        {
 0188           L70:
 0188                   .dbline 186
 0188           L71:
 0188                   .dbline 186
 0188           ;           while((PIND&0x08)==0); //等待每一个数据位的0.565ms低电平后的高电平
 0188 839B              sbis 0x10,3
 018A FECF              rjmp L70
 018C                   .dbline 188
 018C           ;          
 018C           ;             Delay882uS();          //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
 018C 4ADF              rcall _Delay882uS
 018E                   .dbline 190
 018E           ;          
 018E           ;             mid = PIND & 0x08;    //读取端口的值。
 018E 80B3              in R24,0x10
 0190 8870              andi R24,8
 0192 C82E              mov R12,R24
 0194                   .dbline 191
 0194           ;             if (mid != 0)
 0194 8823              tst R24
 0196 31F0              breq L73
 0198                   .dbline 192
 0198           ;             {
 0198                   .dbline 193
 0198           ;                 Delay1000uS();     //为高电平,再延迟1ms,
 0198 58DF              rcall _Delay1000uS
 019A                   .dbline 194
 019A           ;                         k |= 1<<i;       //读取1
 019A 01E0              ldi R16,1
 019C 142F              mov R17,R20
 019E 00D0              rcall lsl8
 01A0 A02A              or R10,R16
 01A2                   .dbline 195
 01A2           ;             }
 01A2 06C0              rjmp L74
 01A4           L73:
 01A4                   .dbline 197
 01A4           ;             else
 01A4           ;             {
 01A4                   .dbline 198
 01A4           ;                         k &= ~(1<<i);       //读取0
 01A4 01E0              ldi R16,1
 01A6 142F              mov R17,R20
 01A8 00D0              rcall lsl8
 01AA 202E              mov R2,R16
 01AC 2094              com R2
 01AE A220              and R10,R2
 01B0                   .dbline 199
 01B0           ;             }
 01B0           L74:
 01B0                   .dbline 200
 01B0           L67:
 01B0                   .dbline 184
 01B0 4395              inc R20
 01B2           L69:
 01B2                   .dbline 184
 01B2 4830              cpi R20,8
 01B4 48F3              brlo L71
 01B6                   .dbline 201
 01B6 CE01              movw R24,R28
 01B8 E62F              mov R30,R22
 01BA FF27              clr R31
 01BC E80F              add R30,R24
 01BE F91F              adc R31,R25
 01C0 A082              std z+0,R10
 01C2                   .dbline 202
 01C2           L63:
 01C2                   .dbline 181
 01C2 6395              inc R22
 01C4           L65:
 01C4                   .dbline 181
 01C4 6430              cpi R22,4
 01C6 E8F2              brlo L62
 01C8                   .dbline 204
 01C8           ;         }
 01C8           ;               buf[j] = k ;          //保存读到的数据
 01C8           ;    }
 01C8           ;    
 01C8           ;    if ((buf[2]|buf[3]) != 0xff)  //判断数据的第三字节和第四字节的取反后相等吗?
 01C8 2B80              ldd R2,y+3
 01CA 8A81              ldd R24,y+2
 01CC 8229              or R24,R2
 01CE 8F3F              cpi R24,255
 01D0 11F0              breq L75
 01D2                   .dbline 205
 01D2           ;    {
 01D2                   .dbline 206
 01D2           ;               SEI(); //开中断
 01D2 7894              sei
 01D4                   .dbline 207
 01D4           ;               return;     //如果不相等说明是干扰或出错,跳出整个循环。
 01D4 05C0              rjmp L49
 01D6           L75:
 01D6                   .dbline 209
 01D6           ;    }  
 01D6           ;    key_decode (buf[2]);   //判断键值并显示,系统码即buf[1]和buf[2]忽略。
 01D6 0A81              ldd R16,y+2
 01D8 4BDF              rcall _key_decode
 01DA                   .dbline 211
 01DA           ;    //PORTC = buf[2];    //直接显示键值
 01DA           ;    spk(1000); //蜂鸣器响一声。
 01DA 08EE              ldi R16,232
 01DC A1DF              rcall _spk
 01DE                   .dbline 212
 01DE           ;    SEI(); //开中断
 01DE 7894              sei
 01E0                   .dbline -2
 01E0           L49:
 01E0 2496              adiw R28,4
 01E2 00D0              rcall pop_gset4
 01E4 00D0              rcall pop_lset
 01E6                   .dbline 0 ; func end
 01E6 1895              reti
 01E8                   .dbsym l buf 0 A[4:4]c
 01E8                   .dbsym r j 22 c
 01E8                   .dbsym r k 10 c
 01E8                   .dbsym r mid 12 c
 01E8                   .dbsym r i 20 c
 01E8                   .dbend
 01E8                   .dbfunc e main _main fV
                        .even
 01E8           _main::
 01E8                   .dbline -1
 01E8                   .dbline 216
 01E8           ; }
 01E8           ; //------------------------main----------------------------
 01E8           ; void main (void)    
 01E8           ; {
 01E8                   .dbline 217
 01E8           ;     Init_mcu();       //单片机端口初始化,口方向设置与外部中断的使用无关,不影响。
 01E8 A4DF              rcall _Init_mcu
 01EA                   .dbline 218
 01EA           ;       spk(1000);             //蜂鸣器响一声。
 01EA 08EE              ldi R16,232
 01EC 99DF              rcall _spk
 01EE                   .dbline 219
 01EE           ;       init_int1();       //外部中断1初始化
 01EE ABDF              rcall _init_int1
 01F0                   .dbline 220
 01F0           ;       SEI();             //开中断
 01F0 7894              sei
 01F2                   .dbline 221
 01F2           ;       PORTC=0b10111111;  ///上电后初始显示"-"
 01F2 8FEB              ldi R24,191
 01F4 85BB              out 0x15,R24
 01F6           L81:
 01F6                   .dbline 223
 01F6           L82:
 01F6                   .dbline 222
 01F6 FFCF              rjmp L81
 01F8           X6:
 01F8                   .dbline -2
 01F8           L80:
 01F8                   .dbline 0 ; func end
 01F8 0895              ret
 01FA                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -