📄 pic12f683_ir.asm
字号:
;*************************************************
;
;
; PIC12f683 红外线遥控程序
;
; 2008/9/4
;***********************************************
MAIN:
call RE_BC_SET
;-------------------------------------------------
CVBS_TEST_TYPE_IN:
;----------------------
call CVBS_TYPE_TEST
;call ON_BK
CVBS_LOOP:
;-------红外线接收--------------
call IR_READ
decfsz INTEST_COUNT,1
goto CVBS_LOOP ;负数,表示计数未到
;不为负数.表示计数到
movlw 0xff ;
movwf INTEST_COUNT
decfsz INTEST_COUNT_H,1
goto CVBS_LOOP ;负数,表示计数未到
;不为负数.表示计数到
movlw 0xff ;
movwf INTEST_COUNT_H
;---NTSC PAL检测 --------
;bsf GPIO,SEL_TEST
call CVBS_TYPE_TEST
;bcf GPIO,SEL_TEST
goto CVBS_LOOP
;*******************************
;*******************************
;**********************************************
;********************************************************************************************
; 红外线模块
;********************************************************************************************
;----1bit(0.10ms)延时发生模块-------------
; 使用内部8M Hz RC 振荡器 时钟8分频时 1个指令周期=1uS
DELAY_010MS: ;1个racall DELAY_056MS 包含14+3*temp(182)=560个指令周期 72*0.0078125=0.5625MS
;3+1+(TEMP*3)+2+2+4=12+3*TEMP
movlw 0x24 ;23 ;1e ;
movwf TEMP
DELAY_010MS1:
decfsz TEMP,1 ;1
goto DELAY_010MS1 ;2/1
retlw 0 ;4
;----1bit(0.56ms)延时发生模块-------------
; 使用内部8M Hz RC 振荡器 时钟8分频时 1个指令周期=1uS
DELAY_056MS: ;1个racall DELAY_056MS 包含14+3*temp(182)=560个指令周期 72*0.0078125=0.5625MS
;ldi TEMP,0x48;72// 72/128=0.5625ms
;3+1+(TEMP*3)+2+2+4=12+3*TEMP
movlw 0xD2 ;b6 ; 24*3=72 72/128=0.5625
movwf TEMP
DELAY_056MS1:
decfsz TEMP,1 ;1
goto DELAY_056MS1 ;2/1
nop ;1
nop ;1
nop ;1
nop ;1
retlw 0 ;4
;----按键重复红外线起始位(2.25ms)延时发生模块-------------
; 使用内部8M Hz RC 振荡器 时钟8分频时 1个指令周期=1uS 2.25MS=2250 个指令周期
DELAY_225MS: ;3+1+(TEMP*563)+562+?=4+(2*563)+562+ 558=2250
movlw 0x04 ;2
movwf TEMPH
DELAY_225MS1:
call DELAY_056MS ;560
decfsz TEMPH,1 ;1
goto DELAY_225MS1 ;2/1
retlw 0 ;4
;----1个红外线起始位(4.5ms)延时发生模块-------------
; 使用内部8M Hz RC 振荡器 时钟8分频时 1个指令周期=1uS 4.5MS=4500 个指令周期
DELAY_45MS: ;3+1+(TEMP*563)+562+?=4+(6*563)+562+ 556=4500
movlw 0x08 ;6
movwf TEMPH
DELAY_45MS1:
call DELAY_056MS ;560
decfsz TEMPH,1 ;1
goto DELAY_45MS1 ;2/1
retlw 0 ;4
;----1个红外线起始位(9ms)延时发生模块-------------
; 使用内部8M Hz RC 振荡器 时钟8分频时 1个指令周期=1uS 9MS=9000 个指令周期
DELAY_9MS: ;3+1+(TEMP*563)+562+?=4+(14*563)+562+ 552=9000
movlw 0x10 ;14
movwf TEMPH
DELAY_9MS1:
call DELAY_056MS ;560
decfsz TEMPH,1 ;1
goto DELAY_9MS1 ;2/1
retlw 0 ;4
;*****TEST*************************************
;---TEST--接收验证-----
RCODE_TETST:
movlw 8
movwf IR_COUNT
movf IR_BUF,0
movwf IR_BUF_TEMP
TE_LOOP1:
rrf IR_BUF_TEMP,1
btfss STATUS,C
goto TE_SET0
TE_SET1:
;bsf GPIO,IR_TS
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
;bcf GPIO,IR_TS
goto TE_ST2
TE_SET0:
;bsf GPIO,IR_TS
nop
nop
nop
nop
nop
nop
;bcf GPIO,IR_TS
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
TE_ST2:
decfsz IR_COUNT,1 ;移位记数
goto TE_LOOP1
retlw 0
;---------------------
;-----test-----------------
BIT_TEST:
movf TEMPH,0
movwf TEMP
IR_LOP001:
;bsf GPIO,IR_TS
nop
nop
;bcf GPIO,IR_TS
decfsz TEMP,1 ;1
goto IR_LOP001
return
;-----------------------
;**********************************************
;--------8位代码接收模块------
;接收输出置于:IR_BUF
;影响: IR_BUF_TEMP; IR_COUNT;
IR_DATA_READ:
clrf IR_BUF_TEMP
movlw 8
movwf IR_COUNT
movlw 0x32 ;设置防止死等待循环时间 20*0.1=2ms
movwf TEMPH
;----上升沿开始,按高电平时间判定0/1 -------
IR_DATA_READ1:
call DELAY_010MS
;-----test----
;call T_TEST
;--------------
movlw 0x14 ;设置bit时长判定初始时间 20*0.1=2ms
movwf TEMPH
IR_DATA_RLOOP2: ;等待下降沿
call DELAY_010MS
btfss GPIO,IR_SEL ;==1? ==1跳过 并继续
goto IR_DATA_READ3 ;==0 bit时长属性结束
decfsz TEMPH,1 ;1
goto IR_DATA_RLOOP2 ;没有超出2ms,继续等待
goto IR_DATA_R_ERRO ;超出2ms ,接收出错
;-----上升沿结束 根据TEMPH判定0/1-----------------
IR_DATA_READ3:
;----test--------------
call BIT_TEST
;----------------------
IR_DATA_R0: ;set bit=0
bcf STATUS,C
goto IR_DATA_READ_SET
IR_DATA_R1: ;set bit=1
bsf STATUS,C
IR_DATA_READ_SET:
rrf IR_BUF_TEMP,1 ;接收bit->IR_BUF_TEMP
decfsz IR_COUNT,1 ;接收移位记数
goto IR_DATA_RLOOP1
;-------8bit接收完成----------------
movf IR_BUF_TEMP,0
movwf IR_BUF
retlw 0xff
IR_DATA_R_ERRO: ;接收出错
retlw 0
;************************************************
; *红外线接收主模块*
;************************************************
;IN: IR_CUST ; 客户代码
;OUT:IR_KEY ; 按键代码 无接收 IR_KEY=0
IR_READ:
;-----------------------------------------
;----起始接收判断(9mS低电平+4.5ms高电平)-----
;-----------------------------------------
IR_RX_START:
btfsc GPIO,IR_SEL ;==0? ==0跳过
goto IR_NOSTART ;==1
IR_READ_T:
call DELAY_45MS ;4.5ms
btfSc GPIO,IR_SEL ;==0? ==0跳过
goto IR_NOSTART ;==1
call DELAY_45MS ;^9.0ms
call DELAY_225MS ;2.25ms
btfss GPIO,IR_SEL ;==1? ==1跳过
goto IR_NOSTART ;==0
;----接收起始位有效,接收起始位同步----------
IR_RX_START_LOOP: ;3.0ms内有负跳变,则起始头结束,否则接收同步失败,故障退出.
movlw 0x1e
movwf TEMPH
DELAY_010MS10:
movlw 0x15 ;
movwf TEMP
DELAY_010MS11:
btfss GPIO,IR_SEL ;==1? ==1跳过 并继续
goto IR_RX_START_OK ;==0 接收起始OK 结束起始头 开始数据接收
decfsz TEMP,1 ;1
goto DELAY_010MS11 ;2/1
decfsz TEMPH,1 ;1
goto DELAY_010MS10 ;2/1
IR_NOSTART:
;clrf IR_KEY ;没有收到 IR_KEY清0
retlw 0 ;无接收头,接收错误
IR_RX_START_OK:
;retlw 0xff ;接收起始为有效标志
;-----------------------------------------
;------起始位完成,客户码开始-----红外线代码输出格式-例: 客户码0xe608+正键码0x42+补键码0xbd(0xff-0x42)-------
; 发送bit码 先(低)--->后(高)
; d0->d7
; 0001 0000 0110 0111 0100 0010 1011 1101
; 8 0 6 e 2 4 d b
andlw 0xff ;判断是否接收成功 Z=1==不成功 Z=0==成功
btfsc STATUS,Z
goto IR_RX_ERRO
;-----判定客户码L---------
;---test---------------
call RCODE_TETST
;-----------------------
movf IR_BUF,0
xorlw 0x00 ;08 ;客户码L(读码器前2位)
btfss STATUS,Z
goto IR_RX_ERRO ;/=0x00 客户码L错误 退出接收
;==0x00 客户码L正确 继续接收
call IR_DATA_READ ;8位客户码H接收
andlw 0xff ;判断是否接收成功 Z=1==不成功 Z=0==成功
btfsc STATUS,Z
goto IR_RX_ERRO
;-----判定客户码H---------
;---test---------------
call RCODE_TETST
;-----------------------
movf IR_BUF,0
xorlw 0xff ;e6 ;客户码H(读码器后2位)
btfsc STATUS,Z ;遥控客户码: 0x00ff
goto IR_KEY_REC
movf IR_BUF,0
xorlw 0x8f ;e6 ;客户码H(读码器后2位)
btfss STATUS,Z ;线控客户码: 0x008f
goto IR_RX_ERRO ;/=0x8f 客户码L错误 退出接收
;==0x8f 客户码H正确 继续接收
;-----------------------
;-----按键正码接收--------
IR_KEY_REC:
call IR_DATA_READ ;8bit按键正码接收
andlw 0xff ;判断是否接收成功 Z=1==不成功 Z=0==成功
btfsc STATUS,Z
goto IR_RX_ERRO
;-----按键码-> KEY_BUF ---------
;---test---------------
call RCODE_TETST
;-----------------------
movf IR_BUF,0
movwf KEY_BUF
;-----按键反码接收--------
call IR_DATA_READ ;8bit按键反码接收
andlw 0xff ;判断是否接收成功 Z=1==不成功 Z=0==成功
btfsc STATUS,Z
goto IR_RX_ERRO
;-----按键反码!== KEY_BUF? ---------
comf IR_BUF,0 ;IR_BUF!->W
subwf KEY_BUF,0
btfsc STATUS,Z ;Z==0 不相等
goto KEY_SEV ;Z==1 相等 按键处理
IR_RX_ERRO:
clrf KEY_BUF
retlw 0
;-----------------------------------
;-------按键处理模块------------------
; 白长条遥控器 客户码:0x00ff
; power:0x01 mute:0x00 rock:0x0c stereo:0x09
; clasisal:0x0a pop:0x15 vol-:0x0d vol+:0x16
;bass-:0x0e bass+:0x14
;
KEY_SEV:
;---test---------------
call RCODE_TETST
;-----------------------
movlw 0x50 ;0x50*62.5ms =5s
movwf INTEST_COUNT
;---键值跳转------
movf KEY_BUF,0
xorlw 0x0e
btfsc STATUS,Z
goto KEY_KL ;< 左 遥控 亮度-
movf KEY_BUF,0
xorlw 0x14
btfsc STATUS,Z
goto KEY_KR ;> 右 遥控 亮度+
movf KEY_BUF,0
xorlw 0x16
btfsc STATUS,Z
goto KEY_KUP ;^ 上 遥控 对比度+
movf KEY_BUF,0
xorlw 0x0d
btfsc STATUS,Z
goto KEY_KDN ; 下 遥控 对比度-
movf KEY_BUF,0
xorlw 0x15
btfsc STATUS,Z
goto KEY_BC_RESET ;pop 遥控 亮度/对比度参数复位
;-----------
movf KEY_BUF,0
xorlw 0x0a
btfsc STATUS,Z
goto KEY_SET_VIDEO ;classic 遥控 NTSC/PAL切换
;retlw 0
KEY_VGA_SET:
movf KEY_BUF,0
xorlw 0x09
btfsc STATUS,Z
goto KEY_SET_3D_LR ;stereo 遥控 2D_3D_LR切换
movf KEY_BUF,0
xorlw 0x00
btfsc STATUS,Z
goto KEY_SET_2D ;Mute 遥控 3D->2D切换
retlw 0
;--------------------------
;************************************************
; 按键处理模块
;************************************************
;**********************************
KEY_SET_VIDEO:
movlw 0xff ;
movwf INTEST_COUNT_H
movwf INTEST_COUNT
movlw 0x02
xorwf FLAG1,1 ;VIDEO_F取反
btfss FLAG1,VIDEO_F
goto KEY_SET_NTSC
goto KEY_SET_PAL
KEY_SET_NTSC:
call TYPE_NTSC
call W_EEPROM_ALL
retlw 0xff
KEY_SET_PAL:
call TYPE_PAL
call W_EEPROM_ALL
retlw 0xff
;**********************************
;**********************************
KEY_SET_2D:
call D3_D2_CN
call W_EEPROM_ALL
movf FLAG1,0
andlw 0x08
movwf FLAG_BAK ;FLAG1->FLAG_BAK
movlw 0x50 ;0x50*62.5ms =5s
movwf INTEST_COUNT
retlw 0xff
;**********************************
KEY_SET_3D_LR:
;btfss FLAG1,D23_F ;只有在3D状态下方可生效
;return
call D3_LR
call W_EEPROM_ALL
movf FLAG1,0
andlw 0x08
movwf FLAG_BAK ;FLAG1->FLAG_BAK
movlw 0x05 ;0x50*62.5ms =5s
movwf INTEST_COUNT
retlw 0xff
;**********************************
KEY_KR:
;------ SDP UP BRIGHT调整------
SDP_BRIGHT_UP:
movlw 0x08 ;10
addwf BRIGHT,0
btfsc STATUS,C ;超过最大值了吗?
retlw 0 ;超过,维持不变
;没有超过.增加亮度
movwf BRIGHT ;保存此次值
;---发送调整信号----
;movwf I2_DATA ; BRIGHT->I2_DATA
;movlw 0x42 ;ADI7401从机设备地址码->TWDR
;movwf I2_DEVICE
movlw 0xb8 ;TVP5150_W ;TVP5150从机设备地址码->TWDR
movwf I2_DEVICE
movlw 0x09
movwf I2_ADDR
movf BRIGHT,0 ;
call I2_SEND
call W_EEPROM_ALL
retlw 0xff
;--------------------------
;**********************************
;**********************************
KEY_KL:
;------ SDP DN BRIGHT调整------
SDP_BRIGHT_DN:
movlw 0x08 ;10
subwf BRIGHT,0
movwf TEMP
movlw 0x80 ;最暗值
subwf TEMP,0
btfss STATUS,C ;负数了吗?
retlw 0 ;负数,维持不变
;不为负数.减少亮度
movf TEMP,0
movwf BRIGHT ;保存此次值
;---发送调整信号----
;movwf I2_DATA ; BRIGHT->I2_DATA
movlw 0xb8 ;TVP5150_W ;TVP5150从机设备地址码->TWDR
movwf I2_DEVICE
movlw 0x09
movwf I2_ADDR
movf BRIGHT,0 ;
call I2_SEND
call W_EEPROM_ALL
retlw 0xff
;--------------------------
;
;--------------------------------
;**********************************
;**********************************
KEY_KUP:
;------ SDP UP CONTRAST调整------
SDP_CONTRAST_UP:
movlw 0x08 ;10
addwf CONTRAST,0
btfsc STATUS,C ;超过最大值了吗?
retlw 0 ;超过,维持不变
;没有超过.增加亮度
movwf CONTRAST ;保存此次值
;---发送调整信号----
; movwf I2_DATA ; BRIGHT->I2_DATA
movlw 0xb8 ;TVP5150_W ;TVP5150从机设备地址码->TWDR
movwf I2_DEVICE
movlw 0x0c
movwf I2_ADDR
movf CONTRAST,0 ;
call I2_SEND
call W_EEPROM_ALL
retlw 0xff
;--------------------------------
;**********************************
;**********************************
KEY_KDN:
;------ SDP CONTRAST调整------
SDP_CONTRAST_DN:
movlw 0x08 ;10
subwf CONTRAST,0
btfss STATUS,C ;负数了吗?
retlw 0 ;负数,维持不变
;不为负数.减少亮度
movwf CONTRAST ;保存此次值
;---发送调整信号----
;movwf I2_DATA ; BRIGHT->I2_DATA
movlw 0xb8 ;TVP5150_W ;TVP5150从机设备地址码->TWDR
movwf I2_DEVICE
movlw 0x0c
movwf I2_ADDR
movf CONTRAST,0 ;
call I2_SEND
call W_EEPROM_ALL
retlw 0xff
;-----------------------------
;**********************************
KEY_BC_RESET:
;------ SDP RESET------
SDP_CONTRAST_RESET:
;亮度 对比度参数复位
movlw 0x70 ;90 ; BRIGHT
btfsc FLAG1,D23_F
movlw 0x88 ;90 ; BRIGHT
movwf BRIGHT
movlw 0xA8 ;a0 ; CONTRAST
movwf CONTRAST
RE_BC_SET:
movlw 0xb8 ;TVP5150_W ;TVP5150从机设备地址码->TWDR
movwf I2_DEVICE
movlw 0x09
movwf I2_ADDR
movf BRIGHT,0
;movwf I2_DATA ; BRIGHT->I2_DATA
call I2_SEND
movlw 0x0c
movwf I2_ADDR
movf CONTRAST,0
;movwf I2_DATA ; BRIGHT->I2_DATA
call I2_SEND
call W_EEPROM_ALL
retlw 0xff
;**********************************
;************************************************
;************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -