PIC12F629解碼PT2262IR(asm程序)
這段程序是用在一款七彩燈紅外遙控解碼程序里,單片機使用PIC12F629,軟件模擬三路PWM輸出驅(qū)動紅綠藍LED分八組共24個LED,實現(xiàn)單LED漸明漸暗,兩LED一明一暗,七彩等九種花樣.有斷電記憶功能.如下是解碼程序.
;--------------------------------------------------------
;filename: 24LED_Remote.asm
;mcu: PIC12f629
;clock: 4 MHz for INTRC
;date: 2006/02/25
;writer: aLin
; IC type: PT2262IR
;Rosc: 470K
;--------------------------------------------------------
list p=pic12f629
#i nclude"p12f629.inc"
#defineB_LEDgpio,0;綠LED輸出端口
#defineG_LEDgpio,1;藍LED輸出端口
#defineR_LEDgpio,2;紅LED輸出端口
#defineremgpio,3;GP3/MCLR,定義遙控輸入端
;因為當(dāng)按住PT2262的按鍵不放的時候
;PT2262會把編碼不斷的送出
;設(shè)置ENABLE位用來檢測按鍵有沒有放開過,
;如果沒有放開則不再響應(yīng)
;用于遙控型
#defineenableuser_reg,0;接收允許位
#defineon_offuser_reg,1;該位為0時,按花樣選擇鍵無效
#definego_nextuser_reg,2;該位為1時,跳下一段
#defineresetuser_reg,3;該位為1時,關(guān)顯示
#defineunlockuser_reg,4;用于配合on_off位
;---------------------------------------------------------
;定義變量
;
r1equ20h;用于d5ms子程序
r2equ21h;用于d5ms子程序
r3equ22h;用于d320mS子程序
P_regequ23h;正脈寬時間寄存器
N_regequ24h;負(fù)脈寬時間寄存器
count1equ25h;計數(shù)器1
count2equ26h;計數(shù)器2
W_tempequ27h;W臨時寄存器
user_regequ28h;用戶寄存器
ee_dataequ29h;eeprom讀寫數(shù)據(jù)出入口
ee_addrequ2ah;eeprom讀寫地址入口
data_tempequ2bh;用于暫存從EEPROM讀出的數(shù)所數(shù)據(jù)
index_regequ2ch;用于保存引導(dǎo)值
data_regequ2dh;用于保存從EEPROM讀出的值
A0_addr1equ30h
A0_addr2equ31h
A1_addr1equ32h
A1_addr2equ33h
r5equ34h;用于解碼延時
r6equ35h;用于解碼延時
addr_set1equ36h;用于存儲比較密碼
addr_set2equ37h;用于存儲比較密碼
outputequ38h
countequ39h;接收12位編碼
status_tempequ3ah;保存status的值,用于現(xiàn)場保護
ww_tempequ3bh;W工作寄存器,用于現(xiàn)場保護用
A0_data1equ3ch;用于存儲比較數(shù)據(jù)D8
A0_data2equ3dh;用于存儲比較數(shù)據(jù)D8
A1_data1equ3eh;用于存儲比較數(shù)據(jù)D11
A1_data2equ3fh;用于存儲比較數(shù)據(jù)D11
;-------------------------------------------
;定義常數(shù)
;
indexequ00h;EEData數(shù)據(jù)引導(dǎo)地址
;--------------------------------------------------
org 0000h
call init;調(diào)用初始化程序
goto main
;--------------------------------------------------
;中斷處理入口
;TMR1溢出中斷,說明按鍵松開時間大于等于65.536mS左右
org 0004h
movwf ww_temp;保護現(xiàn)場
swapf status,w
movwf status_temp
bcf intcon,gie;關(guān)所有中斷
bcf t1con,tmr1on;停止TMR1
bcf pir1,tmr1if;清TMR1中斷標(biāo)志位
bcf enable;按鍵松開,清enable
swapf status_temp,w
movwf status
swapf ww_temp,f
swapf ww_temp,w
return
;--------------------------------------------------
;讀出引導(dǎo)地址單元(00H)內(nèi)容
mainmovlw index;送引導(dǎo)地址中轉(zhuǎn)
movwf ee_addr
call ee_data_rd;調(diào)用讀EEPROM程序
movf ee_data,w;讀出引導(dǎo)地址內(nèi)容
movwf index_reg;保存引導(dǎo)地址內(nèi)容
movwf ee_addr;送待讀出內(nèi)容地址
call ee_data_rd
movf ee_data,w
movwf data_reg;保存讀出
movf data_reg,w
addlw jumper_tab
movwf pcl
jumper_tabgoto 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段
;------------------------------------------------