?? 一段12f629解pt2262ir的源程序.txt
字號:
這段程序是用在一款七彩燈紅外遙控解碼程序里,單片機使用PIC12F629,軟件模擬三路PWM輸出驅動紅綠藍LED分八組共24個LED,
實現單LED漸明漸暗,兩LED一明一暗,七彩等九種花樣.有斷電記憶功能.如下是解碼程序.
;--------------------------------------------------------
;FileName: 24LED_Remote.asm
; MCU: PIC12f629
; Clock: 4 MHz for INTRC
; Date: 2006/02/25
; Writer: Alin
; Blog: http://51dz.21ic.org
; IC Type: PT2262IR
; Rosc: 470K
;--------------------------------------------------------
list p=pic12f629
#i nclude"p12f629.inc"
#define B_LED gpio,0 ;綠LED輸出端口
#define G_LED gpio,1 ;藍LED輸出端口
#define R_LED gpio,2 ;紅LED輸出端口
#define rem gpio,3 ;GP3/MCLR,定義遙控輸入端
;因為當按住PT2262的按鍵不放的時候
;PT2262會把編碼不斷的送出
;設置ENABLE位用來檢測按鍵有沒有放開過,
;如果沒有放開則不再響應
;用于遙控型
#define enable user_reg,0 ;接收允許位
#define on_off user_reg,1 ;該位為0時,按花樣選擇鍵無效
#define go_next user_reg,2 ;該位為1時,跳下一段
#define reset user_reg,3 ;該位為1時,關顯示
#define unlock user_reg,4 ;用于配合on_off位
;---------------------------------------------------------
;定義變量
;
r1 equ 20h ;用于d5ms子程序
r2 equ 21h ;用于d5ms子程序
r3 equ 22h ;用于d320mS子程序
P_reg equ 23h ;正脈寬時間寄存器
N_reg equ 24h ;負脈寬時間寄存器
count1 equ 25h ;計數器1
count2 equ 26h ;計數器2
W_temp equ 27h ;W臨時寄存器
user_reg equ 28h ;用戶寄存器
ee_data equ 29h ;eeprom讀寫數據出入口
ee_addr equ 2ah ;eeprom讀寫地址入口
data_temp equ 2bh ;用于暫存從EEPROM讀出的數所數據
index_reg equ 2ch ;用于保存引導值
data_reg equ 2dh ;用于保存從EEPROM讀出的值
A0_addr1 equ 30h
A0_addr2 equ 31h
A1_addr1 equ 32h
A1_addr2 equ 33h
r5 equ 34h ;用于解碼延時
r6 equ 35h ;用于解碼延時
addr_set1 equ 36h ;用于存儲比較密碼
addr_set2 equ 37h ;用于存儲比較密碼
output equ 38h
count equ 39h ;接收12位編碼
status_temp equ 3ah ;保存status的值,用于現場保護
ww_temp equ 3bh ;W工作寄存器,用于現場保護用
A0_data1 equ 3ch ;用于存儲比較數據D8
A0_data2 equ 3dh ;用于存儲比較數據D8
A1_data1 equ 3eh ;用于存儲比較數據D11
A1_data2 equ 3fh ;用于存儲比較數據D11
;-------------------------------------------
;定義常數
;
index equ 00h ;EEData數據引導地址
;--------------------------------------------------
org 0000h
call init ;調用初始化程序
goto main
;--------------------------------------------------
;中斷處理入口
;TMR1溢出中斷,說明按鍵松開時間大于等于65.536mS左右
org 0004h
movwf ww_temp ;保護現場
swapf status,w
movwf status_temp
bcf intcon,gie ;關所有中斷
bcf t1con,tmr1on ;停止TMR1
bcf pir1,tmr1if ;清TMR1中斷標志位
bcf enable ;按鍵松開,清enable
swapf status_temp,w
movwf status
swapf ww_temp,f
swapf ww_temp,w
return
;--------------------------------------------------
;讀出引導地址單元(00H)內容
main movlw index ;送引導地址中轉
movwf ee_addr
call ee_data_rd ;調用讀EEPROM程序
movf ee_data,w ;讀出引導地址內容
movwf index_reg ;保存引導地址內容
movwf ee_addr ;送待讀出內容地址
call ee_data_rd
movf ee_data,w
movwf data_reg ;保存讀出
movf data_reg,w
addlw jumper_tab
movwf pcl
jumper_tab goto start ;跳到開始0段
goto seg1 ;跳到第1段
goto seg2 ;跳到第2段
goto seg3 ;跳到第3段
goto seg4 ;跳到第4段
goto seg5 ;跳到第5段
goto seg6 ;跳到第6段
goto seg7 ;跳到第7段
goto seg8 ;跳到第8段
;------------------------------------------------
如下略....
;-----------------------------------------------
;
;解碼程序
;
;---------------------------------------------------------
; A0 | A1 | 說明
;-----+-----+------------------
; 30H | 32H | 接收的8位地址編碼
;-----+-----+------------------
; 31H | 33H | 接收的4位數據編碼
;-----+-----+------------------
; 36H | 37H | 設定的8位地址密碼
;------------------------------
;
; A0_addr1 equ 30h
; A0_addr2 equ 31h
; A1_addr1 equ 32h
; A1_addr2 equ 33h
;
;其中以30H,0和32H,0為例
;懸空: 30H,0=1,32H,0=0
;1: 30H,0=0,32H,0=0
;0: 30H,0=1,32H,0=1
;38H: 輸出控制
;---------------------------------------------------------
;
;解碼子程序
check_sw btfss rem ;rem為1,無接收到信號,返回
goto remote0
bcf go_next ;沒按鍵,清0
bcf reset ;沒按鍵,清0
bcf unlock
remote_end return ;沒有按鍵,反回
;--------------------------------------------------------
remote0 btfss enable ;rem為0,但enable為1,按鍵沒放開,返回
goto incept ;接收12位編碼
;重新設定TMR1
bcf t1con,tmr1on ;停止TMR1
clrf tmr1h ;ffff為65.536mS
clrf tmr1l
bsf t1con,tmr1on ;重啟動TMR1
bcf reset ;按鍵沒松開,解碼取消,清0
bcf go_next ;按鍵沒松開,解碼取消,清0
bcf unlock
goto remote_end ;按鍵沒有放開,返回
;清除上次解碼內容
;接收12位編碼
;
incept movlw .12
movwf count
;解碼
;先找出接收到的開頭,即16mS左右的高電平
;設置高電平時間為15~17mS
;
;檢測和等待15mS的高電平
;
remote1 movlw .30
movwf r5
remote2 movlw .100
movwf r6
remote3 btfss rem
goto remote1
decfsz r6,f
goto remote3
decfsz r5,f
goto remote2
;等待在2mS內接收到的低電平
movlw .4
movwf r5
remote4 movlw .100
movwf r6
;15mS到17mS內接收到下降沿,則跳去解碼,否則返回
remote5 btfss rem
goto remote6
decfsz r6,f
goto remote5
decfsz r5,f
goto remote4
;超出17mS,接收錯誤,返回
bcf enable
goto remote_end
;等待1200uS后,采集接收信號
remote6 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 A0_addr2,f
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -