?? 紅外遙控開關.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 + -