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

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

📁 这段程序是用在一款七彩灯红外遥控解码程序里,单片机使用PIC12F629,软件模拟三路PWM输出驱动红绿蓝LED分八组共24个LED,实现单LED渐明渐暗,两LED一明一暗,七彩等九种花样.有断电记忆
💻 TXT
📖 第 1 页 / 共 2 页
字号:
   这段程序是用在一款七彩灯红外遥控解码程序里,单片机使用PIC12F629,软件模拟三路PWM输出驱动红绿蓝LED分八组共24个LED,
实现单LED渐明渐暗,两LED一明一暗,七彩等九种花样.有断电记忆功能.如下是解码程序.
;--------------------------------------------------------
;FileName: 24LED_Remote.asm
;     MCU: PIC12f629
;   Clock: 4 MHz for INTRC
;    Date: 2006/02/25
;  Writer: Alin
;    Blog: http://51dz.21ic.org
; IC Type: PT2262IR
;    Rosc: 470K
;--------------------------------------------------------
        list p=pic12f629
        #i nclude"p12f629.inc"
        
        #define    B_LED    gpio,0   ;绿LED输出端口
        #define    G_LED    gpio,1   ;蓝LED输出端口
        #define    R_LED    gpio,2   ;红LED输出端口
        #define    rem      gpio,3   ;GP3/MCLR,定义遥控输入端
                 
;因为当按住PT2262的按键不放的时候
;PT2262会把编码不断的送出
;设置ENABLE位用来检测按键有没有放开过,
;如果没有放开则不再响应          
;用于遥控型
        
        #define    enable       user_reg,0     ;接收允许位 
        #define    on_off       user_reg,1     ;该位为0时,按花样选择键无效
        #define    go_next      user_reg,2     ;该位为1时,跳下一段
        #define    reset        user_reg,3     ;该位为1时,关显示  
        #define    unlock       user_reg,4     ;用于配合on_off位
;---------------------------------------------------------
;定义变量
;
        r1    equ    20h       ;用于d5ms子程序
        r2    equ    21h       ;用于d5ms子程序
        r3    equ    22h       ;用于d320mS子程序
     P_reg    equ    23h       ;正脉宽时间寄存器
     N_reg    equ    24h       ;负脉宽时间寄存器
    count1    equ    25h       ;计数器1
    count2    equ    26h       ;计数器2
    W_temp    equ    27h       ;W临时寄存器
  user_reg    equ    28h       ;用户寄存器
   ee_data    equ    29h       ;eeprom读写数据出入口
   ee_addr    equ    2ah       ;eeprom读写地址入口
 data_temp    equ    2bh       ;用于暂存从EEPROM读出的数所数据
 index_reg    equ    2ch       ;用于保存引导值
  data_reg    equ    2dh       ;用于保存从EEPROM读出的值     
            
   A0_addr1   equ    30h
   A0_addr2   equ    31h 
   A1_addr1   equ    32h
   A1_addr2   equ    33h 
         r5   equ    34h       ;用于解码延时 
         r6   equ    35h       ;用于解码延时 
  addr_set1   equ    36h       ;用于存储比较密码      
  addr_set2   equ    37h       ;用于存储比较密码 
     output   equ    38h
      count   equ    39h       ;接收12位编码
status_temp   equ    3ah       ;保存status的值,用于现场保护
    ww_temp   equ    3bh       ;W工作寄存器,用于现场保护用
   A0_data1   equ    3ch       ;用于存储比较数据D8 
   A0_data2   equ    3dh       ;用于存储比较数据D8
   A1_data1   equ    3eh       ;用于存储比较数据D11
   A1_data2   equ    3fh       ;用于存储比较数据D11
;-------------------------------------------
;定义常数
;
     index    equ    00h          ;EEData数据引导地址
                             
;--------------------------------------------------      
            org    0000h
            
            call   init           ;调用初始化程序
            goto   main
            
;--------------------------------------------------
;中断处理入口
;TMR1溢出中断,说明按键松开时间大于等于65.536mS左右
            org    0004h
            movwf  ww_temp        ;保护现场
            swapf  status,w
            movwf  status_temp
            
            bcf    intcon,gie     ;关所有中断
            bcf    t1con,tmr1on   ;停止TMR1
            bcf    pir1,tmr1if    ;清TMR1中断标志位
            bcf    enable         ;按键松开,清enable
            
            swapf  status_temp,w
            movwf  status
            swapf  ww_temp,f
            swapf  ww_temp,w
            
            return                                 
;--------------------------------------------------    
;读出引导地址单元(00H)内容  
      
      main  movlw  index         ;送引导地址中转
            movwf  ee_addr  
            
            call   ee_data_rd    ;调用读EEPROM程序            
            movf   ee_data,w     ;读出引导地址内容
            
            movwf  index_reg     ;保存引导地址内容
            movwf  ee_addr       ;送待读出内容地址
            
            call   ee_data_rd
            movf   ee_data,w
            movwf  data_reg      ;保存读出     
            
            movf   data_reg,w
            addlw  jumper_tab            
            movwf  pcl
            
jumper_tab  goto   start         ;跳到开始0段
            goto   seg1          ;跳到第1段
            goto   seg2          ;跳到第2段
            goto   seg3          ;跳到第3段
            goto   seg4          ;跳到第4段
            goto   seg5          ;跳到第5段
            goto   seg6          ;跳到第6段
            goto   seg7          ;跳到第7段
            goto   seg8          ;跳到第8段
                                                     
;------------------------------------------------
             如下略....

;-----------------------------------------------
;
;解码程序
;
;---------------------------------------------------------
; A0  | A1  | 说明              
;-----+-----+------------------
; 30H | 32H | 接收的8位地址编码 
;-----+-----+------------------
; 31H | 33H | 接收的4位数据编码
;-----+-----+------------------
; 36H | 37H | 设定的8位地址密码
;------------------------------ 
;
;  A0_addr1   equ   30h
;  A0_addr2   equ   31h 
;  A1_addr1   equ   32h
;  A1_addr2   equ   33h   
;
;其中以30H,0和32H,0为例
;悬空: 30H,0=1,32H,0=0
;1:   30H,0=0,32H,0=0
;0:   30H,0=1,32H,0=1
;38H: 输出控制
;---------------------------------------------------------
;
;解码子程序                 
 
  check_sw  btfss  rem          ;rem为1,无接收到信号,返回
            goto   remote0            
            bcf    go_next      ;没按键,清0
            bcf    reset        ;没按键,清0
            bcf    unlock
                             
remote_end  return             ;没有按键,反回
;--------------------------------------------------------
     
   remote0  btfss  enable       ;rem为0,但enable为1,按键没放开,返回 
            goto   incept       ;接收12位编码
            
;重新设定TMR1 
            bcf    t1con,tmr1on   ;停止TMR1 
            clrf   tmr1h         ;ffff为65.536mS
            clrf   tmr1l
            bsf    t1con,tmr1on   ;重启动TMR1   
            
            bcf    reset          ;按键没松开,解码取消,清0
            bcf    go_next        ;按键没松开,解码取消,清0  
            bcf    unlock
            
            goto   remote_end    ;按键没有放开,返回
;清除上次解码内容
;接收12位编码
;
    incept  movlw  .12
            movwf  count
;解码
;先找出接收到的开头,即16mS左右的高电平
;设置高电平时间为15~17mS
;
;检测和等待15mS的高电平
;
   remote1  movlw  .30  
            movwf  r5
   remote2  movlw  .100
            movwf  r6
   remote3  btfss  rem
            goto   remote1
            decfsz r6,f
            goto   remote3
            decfsz r5,f
            goto   remote2    
                 
;等待在2mS内接收到的低电平
            movlw  .4  
            movwf  r5
   remote4  movlw  .100
            movwf  r6 
                 
;15mS到17mS内接收到下降沿,则跳去解码,否则返回
   remote5  btfss  rem
            goto   remote6
            decfsz r6,f
            goto   remote5
            decfsz r5,f
            goto   remote4  
;超出17mS,接收错误,返回
            bcf    enable
            goto   remote_end
                
;等待1200uS后,采集接收信号
   remote6  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    A0_addr2,f

⌨️ 快捷键说明

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