📄 红外遥控开关.asm
字号:
;4 MHz
;RA0红外输入
;用西湖9012-011遥控器做发射控制端。
;信号格式:
;h560us+560us==0 h560us+1680us==1
;头码H4.5ms+4.5ms 地址码:01110000 01110000 数据码+数据反码
;数字“1”键:01110000 01110000 00000000 11111111 (高低位需对调)
;尾码:H560,46.7MS,H4.5ms,4.5MS,H560,1680,cH551(没使用)
;宁波歌林电子实验室
;网址: www.nbglin.com
;电话: 0574-88464538
;EMAIL: PICWORLD@126.COM
;=============================
include <p16f877A.inc>
;该程序改变头文件可直接用于16FXXXX 等28脚以上芯片.
;使用时注意各芯片RAM空间有大小.
;=========================================
#DEFINE IRIN PORTA,0 ; 这样易于改变引脚位置。
ID1 EQU 20H ; 8次循环计数。
DATATRUE EQU 21H ; 红外数据码寄存器。
COMDATA EQU 22H ; 红外数据码反码寄存器。
TEST EQU 23H ; 存TMR0的计时值。
FLAG EQU 24H ; 标志寄存器,为0表示错。
TEMP EQU 26H ; 地址码1
PWRSW EQU 27H
R1REG EQU 28H ; 用于比较红外脉冲的时间常数。小值
R2REG EQU 29H ; 用于比较红外脉冲的时间常数。大值
MM EQU 2AH ; 10MS DELAY
NN EQU 2BH
AA EQU 2CH ; DELAY1 用于LED闪
BB EQU 2DH
DATAAA EQU 2EH ; 操作码(使易于增加键和)
DATABB EQU 2FH
COUNT1 EQU 31H ; 开关1
COUNT2 EQU 32H ; 开关2
COUNT3 EQU 33H ; 开关3
COUNT4 EQU 34H ; 开关4
COUNT5 EQU 35H ; 开关5
;=============================
ORG 10H
START
BSF STATUS,RP0
MOVLW B'11111111' ;RA0 IR IN
MOVWF TRISA
MOVLW B'11111111'
MOVWF TRISB ;RC1--RC6 LED
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'00000110' ;RTCC 1:128
MOVWF OPTION_REG
BCF STATUS,RP0
;
CLRF COUNT1
CLRF COUNT2
CLRF COUNT3
CLRF COUNT4
CLRF COUNT5
CLRF ID1
CLRF DATATRUE
CLRF COMDATA
CLRF PORTC
;
BSF PORTC,1 ;复位时闪二下,表示工作正常。
CALL DELAY1
BCF PORTC,1
CALL DELAY1
BSF PORTC,1
CALL DELAY1
BCF PORTC,1
CALL DELAY1
;===============================
MAIN
BTFSS IRIN ;RA0为低电平,接收到红外信号。
GOTO IDEC
GOTO MAIN
;======判H4.5ms+4.5ms的头文件=======
IDEC CLRF TMR0 ;TMR0开始计时
MOVLW 0X08
MOVWF ID1
;
BTFSS IRIN ;第一个解出的低电平是4.5MS的IR高电平。
GOTO $-1
;
MOVF TMR0,0 ;当4.5ms完成 TMR0定时值存在TEST。
MOVWF TEST
CALL RANGE45
BTFSS FLAG,0
GOTO MAIN ;错误,退出。
;4.5mS 高正确。
CLRF TMR0
BTFSC IRIN
GOTO $-1
;
MOVF TMR0,0 ; 第二个高电平脉冲是4.5MS的低电平。
MOVWF TEST
CALL RANGE45 ; 在4.5mS 范围?
BTFSC FLAG,0
GOTO DDDD ; FLAG,0=1 信号正确。
GOTO MAIN ; 错误,退出。
;4.5mS 低正确
;=========判开始8位地址码================
DDDD
RRF TEMP,1
;
CLRF TMR0 ;接收一个脉冲。
BTFSS IRIN
GOTO $-1
BTFSC IRIN
GOTO $-1
;
MOVF TMR0,0 ; 取出RTCC当前值。
MOVWF TEST
CALL RANGELOW ; 查脉冲是0?
BTFSS FLAG,0
GOTO BHITEST
BCF TEMP,7 ; 是低电平,TEMP清0
GOTO NXTC1
BHITEST CALL RANGEHI ; 查脉冲是1?
BTFSS FLAG,0
GOTO MAIN ; 错误,退出。
BSF TEMP,7
NXTC1 DECFSZ ID1,1
GOTO DDDD
;
MOVF TEMP,0
XORLW B'00001110' ; 地址码1正确?
BTFSS STATUS,Z
GOTO MAIN ; 错误,退出。
MOVLW 0X08
MOVWF ID1
;=============8位地址码2===============
DATAS
CLRF TMR0
RRF TEMP,1
BTFSS IRIN
GOTO $-1
BTFSC IRIN
GOTO $-1
;
MOVF TMR0,0 ;取出RTCC当前值。
MOVWF TEST
CALL RANGELOW ; 查脉冲是0?
BTFSS FLAG,0
GOTO GHITEST
BCF TEMP,7
GOTO NXTC2
GHITEST CALL RANGEHI ; 查脉冲是1?
BTFSS FLAG,0
GOTO MAIN ; 错误,退出。
BSF TEMP,7
NXTC2 DECFSZ ID1,1
GOTO DATAS
;
MOVF TEMP,0
XORLW B'00001110' ; 地址码2正确?
BTFSS STATUS,Z
GOTO MAIN ; 错误,退出。
MOVLW 0X08
MOVWF ID1
;=================查操作码==========
CHTTT
CLRF TMR0
RRF DATATRUE,1
BTFSS IRIN
GOTO $-1
BTFSC IRIN
GOTO $-1
;
MOVF TMR0,0 ;取出RTCC当前值。
MOVWF TEST
CALL RANGELOW
BTFSS FLAG,0
GOTO CTHITEST ; 查脉冲是0?
BCF DATATRUE,7
GOTO NXTTC
CTHITEST
CALL RANGEHI ; 查脉冲是1?
BTFSS FLAG,0
GOTO MAIN ; 错误,退出。
BSF DATATRUE,7
NXTTC DECFSZ ID1,1
GOTO CHTTT
;
MOVF DATATRUE,0
XORLW B'00000000' ; 是键1?
BTFSC STATUS,Z
CALL SECFF1
;
MOVF DATATRUE,0
XORLW B'00000001' ; 是键2?
BTFSC STATUS,Z
CALL SECFF2
;
MOVF DATATRUE,0
XORLW B'00000010' ; 是键3?
BTFSC STATUS,Z
CALL SECFF3
;
MOVF DATATRUE,0
XORLW B'00000011' ; 是键4?
BTFSC STATUS,Z
CALL SECFF4
;
MOVF DATATRUE,0
XORLW B'00000100' ; 是键5?
BTFSS STATUS,Z
GOTO OUTERROR
CALL SECFF5
GOTO CCHWT
OUTERROR GOTO MAIN ; 错误,退出。
;==========查操作码反码=(未起作用)===========
CCHWT
MOVLW 0X08
MOVWF ID1
CLRF TMR0
RRF COMDATA,1
BTFSS IRIN
GOTO $-1
BTFSC IRIN
GOTO $-1
;
MOVF TMR0,0 ;取出RTCC当前值。
MOVWF TEST
CALL RANGELOW ;查位是低电平?
BTFSS FLAG,0
GOTO CCHITEST
BCF COMDATA,7
GOTO NXTCC
CCHITEST
CALL RANGEHI
BTFSS FLAG,0
GOTO MAIN ; 错误,退出。
BSF COMDATA,7
NXTCC DECFSZ ID1,1
GOTO CCHWT
;
MOVF COMDATA,0
XORWF DATABB,0 ; 数据码反码正确?
BTFSS STATUS,Z
GOTO MAIN ; 错误,退出。
;=============范围测试子程序============
RANGE45
MOVLW 0X1F ;3.968ms-->5.37ms
MOVWF R1REG ;正确是0X24
MOVLW 0X2A
MOVWF R2REG
GOTO RANRAM
;
RANGEHI MOVLW 0X0E ;1.8ms-->2.69ms
MOVWF R1REG ;正确“1”是2.25ms
MOVLW 0X15
MOVWF R2REG
GOTO RANRAM
;
RANGELOW
MOVLW 0X06 ;0.768ms-->1.53ms
MOVWF R1REG ;正确“0”是1.12ms
MOVLW 0X0C
MOVWF R2REG
GOTO RANRAM
;==========================
RANRAM MOVF R1REG,0
SUBWF TEST,0
BTFSS STATUS,C ; TEST>=R1REG, C=1 OK
GOTO NO9
MOVF TEST,0
SUBWF R2REG,0
BTFSS STATUS,C ; R2REG>=TEST, C=1 OK
GOTO NO9
BSF FLAG,0 ; 说明TEST在这个范围将被认为是正确的信号。
GOTO BACK
NO9 BCF FLAG,0 ; R2REG>=TEST >=R1REG
BACK RETURN
;====== 改变一次开关状态 ======
SECFF1 MOVLW B'00000001'
XORWF COUNT1,1
MOVF COUNT1,0
BTFSS STATUS,Z
GOTO LEDON1
BCF PORTC,1
GOTO LEDOUT1
LEDON1 BSF PORTC,1
LEDOUT1 RETURN
;====== 改变一次开关状态 ======
SECFF2 MOVLW B'00000001'
XORWF COUNT2,1
MOVF COUNT2,0
BTFSS STATUS,Z
GOTO LEDON2
BCF PORTC,2
GOTO LEDOUT2
LEDON2 BSF PORTC,2
LEDOUT2 RETURN
;====== 改变一次开关状态 ======
SECFF3 MOVLW B'00000001'
XORWF COUNT3,1
MOVF COUNT3,0
BTFSS STATUS,Z
GOTO LEDON3
BCF PORTC,3
GOTO LEDOUT3
LEDON3 BSF PORTC,3
LEDOUT3 RETURN
;====== 改变一次开关状态 ======
SECFF4 MOVLW B'00000001'
XORWF COUNT4,1
MOVF COUNT4,0
BTFSS STATUS,Z
GOTO LEDON4
BCF PORTC,4
GOTO LEDOUT4
LEDON4 BSF PORTC,4
LEDOUT4 RETURN
;====== 改变一次开关状态 ======
SECFF5 MOVLW B'00000001'
XORWF COUNT5,1
MOVF COUNT5,0
BTFSS STATUS,Z
GOTO LEDON5
BCF PORTC,5
GOTO LEDOUT5
LEDON5 BSF PORTC,5
LEDOUT5 RETURN
;=========== 3ms键去抖 =============
DELAY MOVLW 0X04
MOVWF MM
DY1 MOVLW 0XFF
MOVWF NN
DY2 DECFSZ NN
GOTO DY2
DECFSZ MM
GOTO DY1
RETURN
;=========== LED闪 =============
DELAY1 MOVLW 0XFF
MOVWF AA
DYA1 MOVLW 0XFF
MOVWF BB
DYA2 DECFSZ BB
GOTO DYA2
DECFSZ AA
GOTO DYA1
RETURN
;==========================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -