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

📄 一段12f629解pt2262ir的源程序.txt

📁 这段程序是用在一款七彩灯红外遥控解码程序里,单片机使用PIC12F629,软件模拟三路PWM输出驱动红绿蓝LED分八组共24个LED,实现单LED渐明渐暗,两LED一明一暗,七彩等九种花样.有断电记忆
💻 TXT
📖 第 1 页 / 共 2 页
字号:
            rlf    A0_addr1,f
             
;等待第二个下降沿
;加入了限时判断,防止死循环。
;
;           btfss  rem        ;rem为0,一直执行
;           goto   $-1
            movlw  .255
            movwf  r5
            btfsc  rem        ;rem为0,一直执行
            goto   $+4
            decfsz r5,f
            goto   $-3
            goto   remote8    ;超时,跳到错误处理
            
                 
;           btfsc  rem        ;rem为1,一直执行 
;           goto   $-1
            movlw  .255
            movwf  r5
            btfss  rem        ;rem为1,一直执行 
            goto   $+4
            decfsz r5,f
            goto   $-3
            goto   remote8    ;超时,跳到错误处理 
            
            
;等待1200uS后采集接收信号                              
            movlw  .200      
            movwf  r5
            decfsz r5,f
            goto   $-1
            movlw  .200
            movwf  r5
            decfsz r5,f
            goto   $-1
                
            btfss  rem        ;如果rem为1,则c置1,否则清0
            clrc
            btfsc  rem
            setc              ;rem为1,c置1
            
            rlf    A1_addr2,f
            rlf    A1_addr1,f
 
;等待第二个码值的下降沿
;加入了限时判断,防止死循环。
;
;           btfss  rem        ;rem为0,一直执行
;           goto   $-1
            movlw  .255
            movwf  r5
            btfsc  rem        ;rem为0,一直执行
            goto   $+4
            decfsz r5,f
            goto   $-3
            goto   remote8    ;超时,跳到错误处理
            
                 
;           btfsc  rem        ;rem为1,一直执行 
;           goto   $-1
            movlw  .255
            movwf  r5
            btfss  rem        ;rem为1,一直执行 
            goto   $+4 
            decfsz r5,f
            goto   $-3
            goto   remote8    ;超时,跳到错误处理 
            
                 
            decfsz count,f
            goto   remote6    ;连续接收12位
            goto   decode     ;接收完12位编码,跳到解码 
;开始解码
;把接收的编码左移4位,将8位密码放在同一字节上
    decode  movlw  .4
            movwf  count
   remote7  clrc
            rlf    A0_addr2,f
            rlf    A0_addr1,f
            clrc
            rlf    A1_addr2,f
            rlf    A1_addr1,f
            decfsz count,f
            goto   remote7
          
;把4位数据编码由高4位移到低4位上
            swapf  A0_addr2,f
            swapf  A1_addr2,f  
                 
;比较密码                                         
            movf   A0_addr1,w
            xorwf  addr_set1,w
            skpz
            goto   remote8       ;跳到接收错误处理 
                 
            movf   A1_addr1,w
            xorwf  addr_set2,w
            skpz
            goto   remote8       ;跳到接收错误处理
;接收正确处理                                   
;每次按键都一次响应
;按键为PT2262IR pin10(D8) 和 pin13(D11)
;以下只识别D8、D11,对数据理D9、D10不作处理
;
;悬空: A0=1 , A1=0
;   1: A0=0 , A1=0
;   0: A0=1 , A1=1
;
;检查键值D8,ON/OFF键
            movf   A0_addr2,w
            andlw  0fh
            xorwf  A0_data1,w   
            skpz 
            goto   D11           ;不是只有键值D8按下,检查键值D11,
                                 ;即D8没有按下或D8按下同时还有其它按键按下
            movf   A1_addr2,w
            andlw  0fh
            xorwf  A1_data1,w
            skpz
            goto   D11           ;不是只有键值D8按下,检查键值D11
                                 ;即D8没有按下或D8按下同时还有其它按键按下
;是键值D8按下,开始处理    
;on/off处理,按下on/off键假如on,
;再按下就是off,然后再按下又是off。
                                  
            movlw  b'00000010'   ;取反user_reg的on_off位
            xorwf  user_reg,f
            btfss  on_off        ;on_off位为0,reset置1,返回时关显示
            goto   clr_rst
            bsf    unlock        ;on_off位为1,置unlock为1,返回时开显示
            goto   back
 
;检查键值D11,NEXT键。  
       D11  btfss  on_off        ;on_off为0,当前已关显示,按键NEXT无效
            goto   back          ;返回
                    
            movf   A0_addr2,w
            andlw  0fh
            xorwf  A0_data2,w    
            skpz 
            goto   back          ;也不是只有键值D11按下,返回
                                 ;即D11没有按下或D11按下同时还有其它按键按下
            movf   A1_addr2,w
            andlw  0fh
            xorwf  A1_data2,w
            skpz
            goto   back          ;也不是只有键值D11按下,返回
                                 ;即D11没有按下或D11按下同时还有其它按键按下
            
;是键值D11按下,开始处理             
            bsf    go_next       ;跳下一段
            bcf    reset  
            goto   back            
                                               
   clr_rst  bsf    reset
            bcf    go_next
            goto   back   
                        
      back  bcf    t1con,tmr1on  ;停止TMR1
            clrf   tmr1h
            clrf   tmr1l
            bsf    t1con,tmr1on  ;启动TMR1
            bsf    enable        ;置1,防止开关按住不放,不断响应。
                                  
  work_end  retfie               ;返回并开中断
            
;接收错误处理                 
   remote8  bcf    enable
            
            bcf    go_next       ;密码错误,取消解码,清0
            bcf    reset         ;密码错误,取消解码,清0
            bcf    unlock
            
            bsf    enable        ;虽接收错误,但都是有按键按下
            
;重新设定TMR1 
            bcf    t1con,tmr1on  ;停止TMR1       
            clrf   tmr1h         ;ffff为65.536mS
            clrf   tmr1l
            bsf    t1con,tmr1on  ;重启动TMR1
            retfie               ;返回并开中断            
                                                      
;-------------------------------------------
;初始化程序
      init  bsf    status,rp0     ;选择bank1
            call   3ffh
            movwf  osccal
            movlw  b'00001000'    ;GP0/1/2为输出
            movwf  trisio         ;GP3为输入 
            clrf   ioc            ;关闭所有电平变化中断
            bsf    pie1,tmr1ie    ;开TMR1中断
            
            bcf    status,rp0     ;选择bank0 
            bcf    intcon,gie     ;关所有中断
            bsf    intcon,peie    ;开外设中断 
            bcf    t1con,tmr1on   ;停止TMR1
            
            clrf   gpio           ;输出清0
            movlw  07h         
            movwf  cmcon          ;设置GP0/1/2为IO
            
            bcf    enable         ;头次上电,初始化enable、reset、go_next
            bcf    reset
            bcf    go_next
            
;编码地址设定为:A0~A7为悬空(A0=1,A1=0) 
            movlw  b'11111111'    ;A0
            movwf  addr_set1
            movlw  b'00000000'    ;A1
            movwf addr_set2
            
;D8设置1(A0=0,A1=0),D9、D10悬空(A0=1,A1=0)
;D11设置0(A0=1,A1=1),该状态为只有D8按下。D8为ON/OFF键。
            movlw  b'00001110'    ;A0                        
            movwf  A0_data1
            movlw  b'00001000'    ;A1
            movwf  A1_data1
            
;D11设置1(A0=0,A1=0),,D9、D10悬空(A0=1,A1=0)
;D8设置0(A0=1,A1=1),该状态为只有D11按下。D11为NEXT键。
            movlw  b'00000111'    ;A0                        
            movwf  A0_data2
            movlw  b'00000001'    ;A1            
            movwf  A1_data2
 
            return       
       
;------------------------------------------------------       
    
            end

⌨️ 快捷键说明

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