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

📄 pic12f683_ir.asm

📁 利用PIC12f683的输入口作为红外线遥控接收的汇编源程序
💻 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 + -