star 发表于 2012-8-20 10:49:34

[分享]遥控七彩灯

;----------------------------------------------------------
;项目名称:PIC12F629 PWM
;项目简介:遥控七彩灯
;造的。采用PIC12F629作主控,在用中断产生三路PWM信号,还要进行
;红外信号解码。对于PIC12F629来说很居有挑战性。。
;
;实现功能:PIC12F629工作于5V-20MHz,用定时中断产生三路PWM
;信号驱动RGBLED,配合三基色原理,实现多彩渐变,十三色跳变。
;红外接收头将解调后的信号输入PIC12F629,用软件对信号进行解
;码处理。识别出三个按键,分别为关机模式,渐变模式,跳变模式。
;
;编译平台:MPASMWIN v5.30.01, mplink v4.30.01 MPLAB V8.30
;----------------------------------------------------------
;定义器件, 默认为十进制
      list P = 12f629, R = DEC
;加载头文件            
#include <p12f629.inc>      
;熔丝配置:20M振荡器,看门狗关,使能上电延时,内部复位,欠压检测开
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
;----------------------------------------------------------
;共阳 LED
#define    ANODE
;共阴 LED
;#define   CATHODE
;定时器初值
#define   TIME_VALUE240
;电平时间常数         中断补尝实际数据
#define   TIME_DECO   1600      ;1950
#define   TIME_DELAY20      ;30
;关机模式
#define   OFF   00000000B
;渐变模式
#define   MICRO   00000011B
;跳变模式
#define   JUMP    00000101B
;按键数据
#define   KEY_1   00001100B
#define   KEY_2   00001010B
#define   KEY_3   00000110B
;换页操作
#define   BANK0   BCF STATUS,RP0
#define   BANK1   BSF STATUS,RP0
;红外信号输入
#define   SIGNA   GPIO,3
;内存分配
;PWM 周期计数
#define   PWM_H   20H
#define   PWM_L   21H
;PWM 电平缓冲
#define   OUT_H   22H
#define   OUT_L   23H
;PMW 占空比
#define   DUTY    24H
;查表索引值
#define   INDEX   25H
;PWM 输出时间
#define   TIME_126H   
#define   TIME_227H
;任务状态标志
#define   MARK    28H
;跳变 渐变模式
#define   FUNC    29H      
;中断现场保护
#define   W_TEMP2AH
#define   S_TEMP2BH
;共接收32位
#define   BYTE    2CH
#define   BIT   2DH
;电平时间计数
#define   COUNT   2EH
#define   DELAY   2FH
;接收缓冲区
#define   BUFF_05CH
#define   BUFF_15DH
#define   BUFF_25EH
#define   BUFF_35FH
;----------------------------------------------------------
      ORG   0000H
      GOTO    START
;----------------------------------------------------------
;函数名称:TIME_ISR:
;输入参数:无
;输出参数:无
;功能描述:定时器中断服务
;----------------------------------------------------------
      ORG   00004H
TIME_ISR:
;       保护中断现场
      MOVWF   W_TEMP
      SWAPF   STATUS,W
      MOVWF   S_TEMP
;       中断服务 模式识别
      
;       开关机识别
      BTFSS   FUNC,0
      GOTO    $+5
;       渐变模式
      BTFSC   FUNC,1
      CALL    MODE_MICRO
;       跳变模式
      BTFSC   FUNC,2
      CALL    MODE_JUMP
;       清中断标志
      BCF    INTCON,T0IF
;       加载定时器初值
      MOVLW   TIME_VALUE
      MOVWF   TMR0
;       还原中断现场
      SWAPF   S_TEMP,W
      MOVWF   STATUS
      SWAPF   W_TEMP,F
      SWAPF   W_TEMP,W
;       中断返回
      RETFIE
;----------------------------------------------------------
;函数名称:START
;输入参数:无
;输出参数:无
;功能描述:上电初始化
;----------------------------------------------------------
START:
BANK0
#IFDEFANODE
;       共阳 关闭LED
      MOVLW   00000111B
      MOVWF   GPIO
#ELSE
;       共阴 关闭LED
      CLRF    GPIO
#ENDIF
      
;       关模拟比较器
      MOVLW    00000111B
      MOVWF    CMCON
;               |-------- GIE禁止所有中断
;               | |------ T0IE 使能定时中断
;               | ||--- T0IF 定时标志清零
      MOVLW   00100000B
      MOVWF   INTCON

      BANK1
;                   |---- IR_IN 输入
;                   ||--- LED_B 输出
;                   |||-- LED_G 输出
;                   ||||- LED_R 输出            
      MOVLW   00001000B
      MOVWF   TRISIO
;               |-------- GPPU 上拉被禁止
;               ||------- INTEDG
;               |||------ T0CS 内部指令周期
;               ||||----- T0SE
;               |||||---- PSA 分配给WDT
;               ||||||--- PS2 分频比 1:1      
;               |||||||-- PS1
;               ||||||||- PS0
      MOVLW   10000000B
      MOVWF   OPTION_REG
      BANK0
      GOTO    MAIN
;----------------------------------------------------------
;函数名称:INDEX_MICRO
;输入参数:查表索引 W
;输出参数:LED 数据 W
;功能描述:渐变查表点亮LED
;----------------------------------------------------------
INDEX_MICRO:
;       渐变模式查表
      MOVWF   PCL
TAB_MICRO:
;                |--------- LED_B PWM_H_OUT
;                ||-------- LED_G
;                |||------- LED_R               
;                ||| |----- LED_B PWM_L_OUT
;                ||| ||---- LED_G
;                ||| |||--- LED_R
;                ||| |||               
      RETLW   00010001B ; 红
      RETLW   00110001B ; 红 > 黄
      RETLW   00110011B ; 黄
      RETLW   00100011B ; 黄 > 绿
      RETLW   00100010B ; 绿
      RETLW   01100010B ; 绿 > 青
      RETLW   01100110B ; 青
      RETLW   01000110B ; 青 > 蓝
      RETLW   01000100B ; 蓝
      RETLW   01010100B ; 蓝 > 紫

      RETLW   01010101B ; 紫
      RETLW   01110101B ; 紫 > 白

      RETLW   01110111B ; 白
      RETLW   00010111B ; 白 > 红
;----------------------------------------------------------
;函数名称:INDEX_JUMP
;输入参数:查表索引 W
;输出参数:LED 数据 W
;功能描述:跳变查表点亮LED
;----------------------------------------------------------
INDEX_JUMP:
;       跳变模式查表
      MOVWF   PCL
TAB_JUMP:
;                |--------- LED_B PWM_H_OUT
;                ||-------- LED_G
;                |||------- LED_R               
;                ||| |----- LED_B PWM_L_OUT
;                ||| ||---- LED_G
;                ||| |||--- LED_R
;                ||| |||                  
      RETLW   00010001B ; 红
      RETLW   00100010B ; 绿
      RETLW   01000100B ; 蓝
      RETLW   00110011B ; 黄
      RETLW   01100110B ; 青
      RETLW   01010101B ; 紫
      RETLW   00010011B ; 浅黄
      RETLW   00100110B ; 浅青
      RETLW   01000101B ; 浅紫
      RETLW   00110001B ; 深黄
      RETLW   01100010B ; 深青
      RETLW   01010100B ; 深紫
      RETLW   01110111B ; 白
;----------------------------------------------------------
;函数名称:MODE_MICRO
;输入参数:无
;输出参数:无
;功能描述:RGB 渐变模式
;----------------------------------------------------------
MODE_MICRO:
;       1号任务
      BTFSC   MARK,0
      GOTO    PWM_L_MICRO
;       2号任务
      BTFSC   MARK,1
      GOTO    PWM_H_MICRO
;       3号任务
      BTFSC   MARK,2
      GOTO    PWM_CYCLE_MICRO
;       4号任务
      BTFSC   MARK,3
      GOTO    PWM_TIME_MICRO
INIT_MICRO:
;       PWM索引查表   
      MOVF    INDEX,W
      ADDLW   TAB_MICRO
      CALL    INDEX_MICRO
;       PWM_L 数据缓存      
      MOVWF   OUT_L
;       PWM_H 数据缓存
      SWAPF   OUT_L,W
      MOVWF   OUT_H
;       LED 共阴 共阳识别
      #IFDEFANODE
      COMF    OUT_H,F
      COMF    OUT_L,F
      #ENDIF
;       加载最小占空比 1 / 256
      INCF    DUTY,F
PWM_TIME_MICRO:
;       下个任务
      MOVLW   0x04
      MOVWF   MARK
;       PWM 时间计数 7
      MOVLW   7
      MOVWF   TIME_1
PWM_CYCLE_MICRO:
;       下个任务
      MOVLW   0x02
      MOVWF   MARK
;       PWM_H 周期计数
      MOVF    DUTY,W
      MOVWF   PWM_H
;       PWM_L 周期计数
      SUBLW   0
      MOVWF   PWM_L
;       PWM 输出高电平
      MOVF    OUT_H,W
      MOVWF   GPIO
PWM_H_MICRO:
      DECFSZPWM_H,F
      RETURN
;       下个任务
      MOVLW   0x01
      MOVWF   MARK
;       PWM 输出低电平
      MOVF    OUT_L,W
      MOVWF   GPIO
PWM_L_MICRO:
      DECFSZPWM_L,F
      RETURN
;       下个任务
      MOVLW   0x04
      MOVWF   MARK
;       PWM 时间计数
      DECFSZTIME_1,F
      RETURN      
;       下个任务
      MOVLW   0x08
      MOVWF   MARK
;       PWM 占空比递增
      INCFSZDUTY,F
      RETURN
;       重置任务
      CLRF    MARK
;       查表索引值递增
      INCF    INDEX,F
      MOVF    INDEX,W

;       查表索引值是否超界
      SUBLW   14
      BTFSC   STATUS,Z

;       索引值清零
      CLRF    INDEX   
;       函数返回
      RETURN
;----------------------------------------------------------
;函数名称:MODE_JUMP
;输入参数:无
;输出参数:无
;功能描述:RGB跳变模式
;----------------------------------------------------------
MODE_JUMP:
;       1号任务
      BTFSC   MARK,0
      GOTO    PWM_L_JUMP
;       2号任务
      BTFSC   MARK,1
      GOTO    PWM_H_JUMP
;       3号任务
      BTFSC   MARK,2
      GOTO    PWM_CYCLE_JUMP
INIT_JUMP:
;       PWM 索引查表   
      MOVF    INDEX,W
      ADDLW   TAB_JUMP
      CALL    INDEX_JUMP
;       PWM_L 数据缓存      
      MOVWF   OUT_L
;       PWM_H 数据缓存
      SWAPF   OUT_L,W
      MOVWF   OUT_H
;       LED 共阴 共阳识别
      #IFDEFANODE
      COMF    OUT_H,F
      COMF    OUT_L,F
      #ENDIF
;       加载固定占空比 76 / 256
      MOVLW   76
      MOVWF   DUTY
PWM_TIME_JUMP:
;       下个任务
      MOVLW   0x04
      MOVWF   MARK
;       PWM 时间计数 7 * 256
      MOVLW   7
      MOVWF   TIME_1
      CLRF    TIME_2
PWM_CYCLE_JUMP:
;       下个任务
      MOVLW   0x02
      MOVWF   MARK
;       PWM_H 周期计数
      MOVF    DUTY,W
      MOVWF   PWM_H
;       PWM_L 周期计数
      SUBLW   0
      MOVWF   PWM_L
;       PWM 输出高电平
      MOVF    OUT_H,W
      MOVWF   GPIO
PWM_H_JUMP:
      DECFSZPWM_H,F
      RETURN
;       下个任务
      MOVLW   0x01
      MOVWF   MARK
;       PWM 输出低电平
      MOVF    OUT_L,W
      MOVWF   GPIO
PWM_L_JUMP:
      DECFSZPWM_L,F
      RETURN
;       下个任务
      MOVLW   0x04
      MOVWF   MARK
;       PWM 时间计数 7 * 256
      DECFSZTIME_2,F
      GOTO    PWM_CYCLE_JUMP
      DECFSZTIME_1,F
      GOTO    PWM_CYCLE_JUMP
;       重置任务
      CLRF    MARK
;       查表索引值递增
      INCF    INDEX,F
      MOVF    INDEX,W

;       查表索引值是否超界
      SUBLW   13
      BTFSC   STATUS,Z

;       索引值清零
      CLRF    INDEX
;       函数返回
      RETURN
;----------------------------------------------------------
;函数名称:DECODE
;输入参数:无
;输出参数:无
;功能描述:红外接收解码
;----------------------------------------------------------
DECODE:
;       加载缓冲区首址   
      MOVLW   BUFF_0
      MOVWF   FSR
      
;       共4 字节数据
      MOVLW   4
      MOVWF   BYTE
;       每字节8 位
      MOVLW   8
      MOVWF   BIT
RECE:
;       计数值清零
      CLRF   COUNT
RE_LOW:
;       低电平信号检测
      BTFSC   SIGNA
      GOTO    TEST_BIT
;       延时匹配 周期为 20us
      MOVLW   TIME_DELAY
      MOVWF   DELAY
      DECFSZDELAY,F
      GOTO    $-1
;       计数值递增
      INCF    COUNT,F
;       信号限定最大时间 +20%
      MOVLW   ((TIME_DECO * 6 / 5) / 20)
      SUBWF   COUNT,W
;       时间是否溢出
      BTFSS   STATUS,C
      GOTO    RE_LOW
;       时间溢出离开
      RETURN
TEST_BIT:
;       数据位测试
      MOVLW   ((TIME_DECO / 5) / 20)
      SUBWF   COUNT,W
;       脉冲时间过窄 离开      
      BTFSS   STATUS,C
      RETURN
;       数据位识别
      MOVF    COUNT,W
      SUBLW   ((TIME_DECO / 2) / 20)
;       (TIME_DECO / 2 / 20) < COUNT C = 0 数据位 = 0
;       (TIME_DECO / 2 / 20) > COUNT C = 1 数据位 = 1
;       记录一位数位 高位在先 低位在后
      RLF   INDF,F      
RE_HIGH:
;       高电平信号检测
      BTFSS   SIGNA
      GOTO    CHECK_BIT
;       延时匹配 周期为 20us
      MOVLW   TIME_DELAY
      MOVWF   DELAY
      DECFSZDELAY,F
      GOTO    $-1
;       计数值递增
      INCF    COUNT,F
;       信号限定时间最大 +20%
      MOVLW   ((TIME_DECO * 6 / 5) / 20)
      SUBWF   COUNT,W
;       时间是否溢出
      BTFSS   STATUS,C
      GOTO    RE_HIGH
;       时间溢出离开
      RETURN
CHECK_BIT:
;       信号限定最小时间 -20%
      MOVLW   ((TIME_DECO * 8 / 10) / 20)
      SUBWF   COUNT,W
;       时间是否过窄
      BTFSS   STATUS,C
;       信号过窄离开
      RETURN
NEXT_BIT:
;       成功接收一位数据
      DECFSZBIT,F
      GOTO    RECE
;       每字节8 位
      MOVLW   8
      MOVWF   BIT
;       指向下个缓冲区
      INCF    FSR,F
;       共接收4 个字节
      DECFSZBYTE,F
      GOTO    RECE
KEY_COM:
;       用户正反码对比
      COMF    BUFF_0,W
      XORWF   BUFF_1,F
;       校验失败 离开
      BTFSS   STATUS,Z
      RETURN
;       数据正反码对比
      COMF    BUFF_2,W
      XORWF   BUFF_3,F
;       校验失败 离开
      BTFSS   STATUS,Z
      RETURN
;       按键1 识别   
      MOVF    BUFF_2,W
      XORLW   KEY_1
      BTFSC   STATUS,Z
      GOTO    KEY_1_F
;       按键2 识别
      MOVF    BUFF_2,W
      XORLW   KEY_2
      BTFSC   STATUS,Z
      GOTO    KEY_2_F
;       按键3 识别
      MOVF   BUFF_2,W
      XORLW   KEY_3
      BTFSC   STATUS,Z
      GOTO    KEY_3_F
;       无效按键 离开
      RETURN
KEY_1_F:
#IFDEFANODE
;       共阳 关闭LED
      MOVLW   00000111B
      MOVWF   GPIO
#ELSE
;       共阴 关闭LED
      CLRF    GPIO
#ENDIF            
;       关机模式
      MOVLW   OFF
      GOTO    KEY_FUN
      
KEY_2_F:
;       渐变模式
      MOVLW   MICRO
      GOTO    KEY_FUN
KEY_3_F:
;       渐变模式
      MOVLW   JUMP   
KEY_FUN:
;       禁止中断
      BCF   INTCON,GIE
;       加载工作模式
      MOVWF   FUNC
   
;       变量全部清零
      CLRF    INDEX   
      CLRF    MARK
      CLRF    DUTY
;       加载定时器初值
      MOVLW   TIME_VALUE
      MOVWF   TMR0   
;       清定时器中断标志
      BCF   INTCON,T0IF
;       启动中断
      BSF   INTCON,GIE
;       函数返回
      RETURN
;----------------------------------------------------------
;函数名称:MAIN
;输入参数:无
;输出参数:无
;功能描述:主循环程序
;----------------------------------------------------------
MAIN:
;       变量全部清零
      CLRF    INDEX   
      CLRF    MARK
      CLRF    DUTY
;       默认渐变模式
      MOVLW   MICRO
      MOVWF   FUNC
;       加载定时器初值
      MOVLW   TIME_VALUE
      MOVWF   TMR0   
;       启动中断
      BSF   INTCON,GIE      
LOOP:
;       红外接收解码
      CALL    DECODE
;       循环执行程序
      GOTO LOOP

;----------------------------------------------------------
      END

页: [1]
查看完整版本: [分享]遥控七彩灯