📄 pic12f629解pt2262ir的源程序.txt
字号:
btfsc rem
setc ;rem为1,c置1
rlf A0_addr2,f
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 + -