?? 一段12f629解pt2262ir的源程序.txt
字號:
rlf A0_addr1,f
;等待第二個下降沿
;加入了限時判斷,防止死循環。
;
; btfss rem ;rem為0,一直執行
; goto $-1
movlw .255
movwf r5
btfsc rem ;rem為0,一直執行
goto $+4
decfsz r5,f
goto $-3
goto remote8 ;超時,跳到錯誤處理
; btfsc rem ;rem為1,一直執行
; goto $-1
movlw .255
movwf r5
btfss rem ;rem為1,一直執行
goto $+4
decfsz r5,f
goto $-3
goto remote8 ;超時,跳到錯誤處理
;等待1200uS后采集接收信號
movlw .200
movwf r5
decfsz r5,f
goto $-1
movlw .200
movwf r5
decfsz r5,f
goto $-1
btfss rem ;如果rem為1,則c置1,否則清0
clrc
btfsc rem
setc ;rem為1,c置1
rlf A1_addr2,f
rlf A1_addr1,f
;等待第二個碼值的下降沿
;加入了限時判斷,防止死循環。
;
; btfss rem ;rem為0,一直執行
; goto $-1
movlw .255
movwf r5
btfsc rem ;rem為0,一直執行
goto $+4
decfsz r5,f
goto $-3
goto remote8 ;超時,跳到錯誤處理
; btfsc rem ;rem為1,一直執行
; goto $-1
movlw .255
movwf r5
btfss rem ;rem為1,一直執行
goto $+4
decfsz r5,f
goto $-3
goto remote8 ;超時,跳到錯誤處理
decfsz count,f
goto remote6 ;連續接收12位
goto decode ;接收完12位編碼,跳到解碼
;開始解碼
;把接收的編碼左移4位,將8位密碼放在同一字節上
decode movlw .4
movwf count
remote7 clrc
rlf A0_addr2,f
rlf A0_addr1,f
clrc
rlf A1_addr2,f
rlf A1_addr1,f
decfsz count,f
goto remote7
;把4位數據編碼由高4位移到低4位上
swapf A0_addr2,f
swapf A1_addr2,f
;比較密碼
movf A0_addr1,w
xorwf addr_set1,w
skpz
goto remote8 ;跳到接收錯誤處理
movf A1_addr1,w
xorwf addr_set2,w
skpz
goto remote8 ;跳到接收錯誤處理
;接收正確處理
;每次按鍵都一次響應
;按鍵為PT2262IR pin10(D8) 和 pin13(D11)
;以下只識別D8、D11,對數據理D9、D10不作處理
;
;懸空: A0=1 , A1=0
; 1: A0=0 , A1=0
; 0: A0=1 , A1=1
;
;檢查鍵值D8,ON/OFF鍵
movf A0_addr2,w
andlw 0fh
xorwf A0_data1,w
skpz
goto D11 ;不是只有鍵值D8按下,檢查鍵值D11,
;即D8沒有按下或D8按下同時還有其它按鍵按下
movf A1_addr2,w
andlw 0fh
xorwf A1_data1,w
skpz
goto D11 ;不是只有鍵值D8按下,檢查鍵值D11
;即D8沒有按下或D8按下同時還有其它按鍵按下
;是鍵值D8按下,開始處理
;on/off處理,按下on/off鍵假如on,
;再按下就是off,然后再按下又是off。
movlw b'00000010' ;取反user_reg的on_off位
xorwf user_reg,f
btfss on_off ;on_off位為0,reset置1,返回時關顯示
goto clr_rst
bsf unlock ;on_off位為1,置unlock為1,返回時開顯示
goto back
;檢查鍵值D11,NEXT鍵。
D11 btfss on_off ;on_off為0,當前已關顯示,按鍵NEXT無效
goto back ;返回
movf A0_addr2,w
andlw 0fh
xorwf A0_data2,w
skpz
goto back ;也不是只有鍵值D11按下,返回
;即D11沒有按下或D11按下同時還有其它按鍵按下
movf A1_addr2,w
andlw 0fh
xorwf A1_data2,w
skpz
goto back ;也不是只有鍵值D11按下,返回
;即D11沒有按下或D11按下同時還有其它按鍵按下
;是鍵值D11按下,開始處理
bsf go_next ;跳下一段
bcf reset
goto back
clr_rst bsf reset
bcf go_next
goto back
back bcf t1con,tmr1on ;停止TMR1
clrf tmr1h
clrf tmr1l
bsf t1con,tmr1on ;啟動TMR1
bsf enable ;置1,防止開關按住不放,不斷響應。
work_end retfie ;返回并開中斷
;接收錯誤處理
remote8 bcf enable
bcf go_next ;密碼錯誤,取消解碼,清0
bcf reset ;密碼錯誤,取消解碼,清0
bcf unlock
bsf enable ;雖接收錯誤,但都是有按鍵按下
;重新設定TMR1
bcf t1con,tmr1on ;停止TMR1
clrf tmr1h ;ffff為65.536mS
clrf tmr1l
bsf t1con,tmr1on ;重啟動TMR1
retfie ;返回并開中斷
;-------------------------------------------
;初始化程序
init bsf status,rp0 ;選擇bank1
call 3ffh
movwf osccal
movlw b'00001000' ;GP0/1/2為輸出
movwf trisio ;GP3為輸入
clrf ioc ;關閉所有電平變化中斷
bsf pie1,tmr1ie ;開TMR1中斷
bcf status,rp0 ;選擇bank0
bcf intcon,gie ;關所有中斷
bsf intcon,peie ;開外設中斷
bcf t1con,tmr1on ;停止TMR1
clrf gpio ;輸出清0
movlw 07h
movwf cmcon ;設置GP0/1/2為IO
bcf enable ;頭次上電,初始化enable、reset、go_next
bcf reset
bcf go_next
;編碼地址設定為:A0~A7為懸空(A0=1,A1=0)
movlw b'11111111' ;A0
movwf addr_set1
movlw b'00000000' ;A1
movwf addr_set2
;D8設置1(A0=0,A1=0),D9、D10懸空(A0=1,A1=0)
;D11設置0(A0=1,A1=1),該狀態為只有D8按下。D8為ON/OFF鍵。
movlw b'00001110' ;A0
movwf A0_data1
movlw b'00001000' ;A1
movwf A1_data1
;D11設置1(A0=0,A1=0),,D9、D10懸空(A0=1,A1=0)
;D8設置0(A0=1,A1=1),該狀態為只有D11按下。D11為NEXT鍵。
movlw b'00000111' ;A0
movwf A0_data2
movlw b'00000001' ;A1
movwf A1_data2
return
;------------------------------------------------------
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -