[分享]遥控七彩灯
;----------------------------------------------------------;项目名称: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]