华强电子网

电子元器件
采购信息平台

扫码下载
手机洽洽

  • 华强电子网公众号

    电子元器件原材料

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强微电子公众号

    专注电子产业链

    坚持深度原创

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业小灵通

PIC16F628红外接收程序

来源:华强电子网 作者:华仔 浏览:879

标签:

摘要: >PIC16F628红外接收程序;SomenotesonRC5 ; ;14RC5bits: ;SSTAAAAACCCCCC ; ;S:2startbits,T:1togglebit,A:5addressbits,C:6commandbits ; ;Usuallybothstartbitsarehigh.ExtendedRC5usesthe2ndstartbitforexpanding ;the6c

>

PIC16F628红外接收程序
;SomenotesonRC5
;
;14RC5bits:
;SSTAAAAACCCCCC
;
;S:2startbits,T:1togglebit,A:5addressbits,C:6commandbits
;
;Usuallybothstartbitsarehigh.ExtendedRC5usesthe2ndstartbitforexpanding
;the6commandbitsto7bits.Afterreceivingacomplete14bitword,thisbit
;isinvertedandaddedasbit6totheregister’RC5_CMD’.Thetogglebitis
;copiedtobit7of’RC5_CMD’.The5LSBsofregister’RC5_ADR’containthe
;5addressbits;the3MSBsaresetto0.
;Resultafteravalidcodehasbeenreceived:;RC5_ADR:000AAAAARC5_CMD:TCCCCCCC
;NotethatmostIRreceiverChips(e.g.SFH5110-xx)haveanactivelowoutput,however,the
;PIC’sinternalcomparatorinvertsthesignal.AninvertingdrivertransistorfortheRS232
;interfacefinallyinvertsandlevelshiftsthesignalagainsothatthestandardLIRC
;configuration(i.e.activelow)mustbeused.
;
;
;PIC16F628connections
;
;PINFUNCTION
;
;RB7ICSP
;RB6ICSP
;RA5ICSP
;
;RB5测试输出,高电平有效
;RB4PWRin--PC开关输入低电平有效
;RB3RESETout--输出晶体管重拨,高电平有效
;RB2PWRout--输出晶体管forMBATXpwron/off,高电平有效
;RB1LEDgrn--输出LED绿管,高电平有效
;RB0LEDred--输出LED红管,高电平有效
;
;RA74.000MCcrystal
;RA64.000MCcrystal
;
;RA4(unused)
;RA3comparatorC1output--transistorbasedriveforRS232TX
;RA2(internallyconnectedtoVref=1.25volts)
;RA1ATXin--comparatorC2invertinginputforsensing-5voltsofATXpowersupply
;RA0IRin--comparatorC1invertinginputforIRreceiverchip
;
;---Configuration--------------------------------------------------------------------------------
;
;PIC16F628,Poweruptimer,nowatchdog,HS-oscillator,*no*brownoutdetect,LVPoff,CPoff,
;MCLREoff,f=4MHz

listp=16f628

__CONFIG_pwrte_on&_wdt_off&_hs_osc&_boden_off&_lvp_off&_cp_off&_mclre_off

include

;---Variables[allUPPERCASE]-------------------------------------------------------------------

cbLOCkh’20’

DATA_1;16-bitshiftregisterforincomingRC5bits
DATA_2;
DATA_TMP1;temporaryregisterforRC5codes
DATA_TMP2;temporaryregisterforRC5codes
BITCOUNT;counterfortheRC5bits
COUNT;universaltemporarycountregister
TMP;universaltemporaryregisters
TMP1;
TMP2;
RC5_ADR;receivedRC5addressaftercleanup:’000AAAAA’
RC5_CMD;receivedRC5commandaftercleanup:’0CCCCCCC’
RC5_CMD_TMP;temporaryregisterforRC5command
RC5_CMD_TMP_1;temporaryregisterforRC5command
KEYCOUNT;countstheincomingRC5pwr-keyPACketstosetupadelay
KEYCOUNT_1;countstheincomingRC50-keypacketstosetupadelay
RC5_TX_1;16-bitshiftregisterforoutgoingRC5bits
RC5_TX_2;
EEADR_TMP;holdstheEEPROMaddresswhencallingtheEEPROMwritesubroutine
EEDATA_TMP;holdstheEEPROMdatawhencallingtheEEPROMwritesubroutine

PWR_ON_DELAY;00...99(recalledfromEEPROMlocationh’00’)
PWR_KEY_ADR;assignedRC5pwrkeyaddress’000AAAAA’(recalledfromEEPROMlocationh’01’)
PWR_KEY_CMD;assignedRC5pwrkeycommand’0CCCCCCC’(recalledfromEEPROMlocationh’02’)

D1;temporaryregistersfordelayroutines
D2;
D3;

FLAGS;flags,seedefinitions

endc

;---EEPROMdefaultdata--------------------------------------------------------------------------

orgh’2100’
;adrcontent
ded’45’;h’00’PWR_ON_DELAY
deb’00000101’;h’01’PWR_KEY_ADR
deb’00001100’;h’02’PWR_KEY_CMD

;---Definitions[allMixedCase]-----------------------------------------------------------------

#defineATX_C_outcmcon,7;comparator2output
#defineIRinporta,0;inputforIRreceiverchip(activelow)
#defineIRinTristrISA,0;trisregisterbitforIRin
#defineIR_C_outcmcon,6;comparator1output

#defineLEDredportb,0;outputforbicolorLEDredanode
#defineLEDgrnportb,1;outputforbicolorLEDgreenanode
#definePWRoutportb,2;outputtodrivetransistorforMBATXpwron/off
#defineRESEToutportb,3;outputtodrivetransistorforMBreset
#definePWRinportb,4;inputforPCpwrswitch
#defineTestOutportb,5;debugoutputforscope

#defineTurnOnDelayd’9’;turnondelaywhenpressingremotepwrkeyto
;wakeupfromstandby(9makesapprox.onesecond)

#defineRebootDelayd’15’;additionalrebootdelay(inseconds)

#defineRC5_FlagFLAGS,0;0:RC_5codevalid,1:RC_5codeinvalid
#defineReboot_FlagFLAGS,1;0:normalbootdelay,1:additionaldelayneeded


;---Macros[allMixedCase]----------------------------------------------------------------------

Bank_0macro
bcfstatus,5
bcfstatus,6
endm

Bank_1macro
bsfstatus,5
bcfstatus,6
endm

Testmacro
bsfTestOut
bcfTestOut
endm

LED_redmacro
bsfLEDred
bcfLEDgrn
endm

LED_grnmacro
bsfLEDgrn
bcfLEDred
endm

LED_offmacro
bcfLEDred
bcfLEDgrn
endm

;---Reset----------------------------------------------------------------------------------------

orgh’00’
gotoinit;reset->init

;---Interrupt------------------------------------------------------------------------------------

orgh’04’
gotoinit;nointerrupt

;**************************************************************************************************
;Initialization
;**************************************************************************************************

init

;configurationofportaandportb----------------------------------------------------------------

Bank_0
clrfporta;clearportaregister
clrfportb;clearportbregister

Bank_1
MOVlwb’00000111’;RA0...RA2input,RA3...RA7output
MOVwftrisa
MOVlwb’00010000’;RB0...RB3output,RB4input,RB5...RB7output
MOVwftrisb
bcfoption_reg,7;enableportbweakpullups
Bank_0

;configurationofanalogcomparators-------------------------------------------------------------

MOVlwb’00000110’;twocommonreferencecomparatorswithoutputs
MOVwfcmcon
Bank_1
MOVlwb’11100110’;Vref=1.25volts,connectedtoRA2
MOVwfvrcon
Bank_0

;timer0------------------------------------------------------------------------------------------

Bank_1
MOVlwb’01000000’;timer0internalclock,prescaler1:2,enableportbweakpullups
MOVwfoption_reg;
Bank_0

;timer1------------------------------------------------------------------------------------------

MOVlwb’00110001’;prescaler=8,internalclock,enabled
MOVwft1con

;**************************************************************************************************
;Mainprogram
;**************************************************************************************************

start
clrfFLAGS;clearallflags
callcopy_ee;copydefaulteepromvaluestoRAMregisters

main_loop
btfscATX_C_out;checkifATXisstandby
gotogreen;on-->LEDgreen
LED_red;standby-->LEDred
gotopwr_sw
green
LED_grn

pwr_sw
btfssPWRin;testPWRin(activelow)
gotopwr_sw_1;iflowgotopwr_sw_1

btfssIR_C_out;waitforhighlevelatIR_C_out
gotomain_loop;
callrc5_rx;callrc5_rxsubroutine
btfscRC5_Flag;RC5codeOK?
gotomain_loop;no,gotomain_loop

LED_off;turnoffgreenLEDfor50mseachtimeavalidcode
calldelay_t4;hasbeenreceived
LED_grn

pwr_key;checkifpwrkeyofremotecontrolispressed
MOVfwRC5_ADR;loadRC5_ADRintow
subwfPWR_KEY_ADR,w;
btfssstatus,z;doesPWR_KEY_ADRmatch?
gotono_match;-no,gotono_match
;
MOVfwRC5_CMD;-yes,loadRC5_CMDintow
andlwb’01111111’;andcleartogglebit
subwfPWR_KEY_CMD,w;
btfssstatus,z;doesPWR_KEY_CMDmatch?
gotono_match;-no,gotono_match
;
MOVfwRC5_CMD_TMP;-yes,togglebitalsounchanged?
subwfRC5_CMD,w;
btfssstatus,z;
gotono_match;-no,gotono_match
;
btfscATX_C_out;activatePWRoutonlyifATXisstandbytopowerupPC
gotovdr_pwr_down;ifon,VDR’sshutdownscriptwillturnoffPC

;ATXisstandby,nowcheckifpwrkeyofremotecontrolis
;pressedlongenough(approx.TurnOnDelay*114ms)

incfKEYCOUNT,f;-yes,unchanged,incrementKEYCOUNT
MOVfwKEYCOUNT;
sublwTurnOnDelay;ifreachedTurnOnDelay,activatePWRout
btfssstatus,z
gotocont
bsfPWRout;activatePWRoutfor250ms
calldelay_t6
bcfPWRout
gotoboot_delay;andgotoboot_delay

no_match
clrfKEYCOUNT;clearKEYCOUNT

cont
MOVfwRC5_CMD;copyRC5_CMDtotemporaryregister
MOVwfRC5_CMD_TMP;fornexttogglebitcomparison

zero_key;checkif0keyonremotecontrolispressed
;atleast44*114ms(RC5coderepetitionrate)=approx.5s
MOVfwRC5_CMD;loadRC5_CMDintow
andlwb’01111111’;andcleartogglebit
btfssstatus,z;doesOkey(command’0000000’,anyaddress)match?
gotono_match_1;

MOVfwRC5_CMD_TMP_1;togglebitalsounchanged?
subwfRC5_CMD,w;
btfssstatus,z;
gotono_match_1;-no,haschanged
incfKEYCOUNT_1,f;-yes,unchanged,incrementKEYCOUNT_1
MOVfwKEYCOUNT_1;
sublwd’44’;
btfssstatus,z;reached44(approx.5s)?
gotocont_1;-no,loop
gotopgm_or_reboot;-yes,gotopgm_or_reboot

no_match_1
clrfKEYCOUNT_1;clearKEYCOUNT_1

cont_1
MOVfwRC5_CMD;copyRC5_CMDtotemporaryregister
MOVwfRC5_CMD_TMP_1;fornexttogglebitcomparison

gotomain_loop

pgm_or_reboot
btfssATX_C_out
gotopgm_mode;PCisinstandby-->enableprogrammode

LED_red;turnLEDredtoinDICatethatreboothasbeeninitialized

MOVlwh’1f’;setaddresstoh’1f’
MOVwfRC5_TX_2;
MOVlwh’3f’;setcommandtoh’3f’
MOVwfRC5_TX_1;Thiscombinationisnotusedbytheremotecontrol.Suitable
;entriesinlircd.confandlircrccallarebootscriptviairexec

callrc5_tx
bsfReboot_Flag;setReboot_flagsothatadditionaldelayforgreenLEDflashing
gotoboot_delay;willbeaddedandgotoboot_delay

;------------------------------------------------------------------------------------------------

pwr_sw_1;checksifpwrswitchofPCispressedforlessormorethan
;5seconds:ifless-->poweron/off,ifmore-->reset

calldelay_t4;50msdelay
btfscPWRin;stilllowafter50ms?
gotomain_loop;ifnot,assumespikeandgotomain_loop

btfssATX_C_out;ATXonorstandby?
gototurn_on;standby,aresetwouldbequiteuseless,soturnonVDR

clrftmr1h;cleartimer1registers
clrftmr1l;
MOVlwd’19’;setCOUNTtod’19’,thismakesapprox.19*262ms=5seconds
MOVwfCOUNT;

chk_low
btfscPWRin;stilllow?
gotovdr_pwr_down;ifnot,pwrkeywaspressed<5s-->turnoffVDR

btfsctmr1h,7;checktimer1hregisterbit7(setafter262ms)
gotodec_cnt1
gotochk_low

dec_cnt1
clrftmr1h;cleartimer1registers
clrftmr1l
decfszCOUNT,f
gotochk_low;notyet5s,loop
gotoreset;powerkeypressed>5s

turn_on
bsfPWRout;activatePWRoutfor250ms
calldelay_t6;
bcfPWRout;
gotoboot_delay;andgotoboot_delay

resetbsfRESETout;activateRESEToutfor250ms
calldelay_t6
bcfRESETout

boot_delay;variabledelayfrom0to127swhileLEDisflashinggreen
MOVfwPWR_ON_DELAY;andnocommandisaccepted,delayderivedfromuserpreset(0..99)
btfscReboot_Flag;addadditionaltime(definedinRebootDelay)ifReboot_Flagisset
addlwRebootDelay;
MOVwfCOUNT
bcfstatus,c
rlfCOUNT;multiplyCOUNTbytwoastheg_flashroutinetakesonly0.5s
sublwd’0’;ifCOUNT=0stopimmediately
btfssstatus,z
gotog_flash
bcfReboot_Flag;clearReboot_Flag
gotomain_loop

g_flash
LED_grn
calldelay_t6
LED_off
calldelay_t6

decfszCOUNT,f
gotog_flash

gotomain_loop

vdr_pwr_down
LED_red;turnLEDred

MOVlwh’1f’;setRC5addresstoh’1f’andcommandtoh’3e’andsendthecode
MOVwfRC5_TX_2;Thiscombinationisnotusedbytheremotecontrolandwill
MOVlwh’3e’;besendtoLIRCinsteadoftheremote’snormalpwrkeycode.
MOVwfRC5_TX_1;Thiswayexactly*one*commandCANbesentinsteadofmultiple
;(autorepeatofRC5codes)--VDRwouldstartandimmediately
;aborttheshutdownifthepwrkeyispressedabittoolong...
;Acorrespondingentrymustbeaddedtolircd.confandthe
;originalpwrkeycodemustbereMOVed.
callrc5_tx;
;FlashredLEDwhilecheckingifakeyontheremotecontrolis
;pressed(whichstopsVDRfromexecutingtheshutdownscript).
;Ifso,theprogrammreturnstothemainloopandtheLED
;turnsgreenagain.OtherwiseflashLEDuntilATXisinstandby
;andfinallyturnLEDred.Note:Theremote’spwrkeywillbe
;ignored(alsotoavoidproblemwithRC5/repeatandVDR).

MOVlwd’57’;setCOUNTtod’57’fortimeoutcouter
MOVwfCOUNT;timeoutisapprox.2*262ms*57=30seconds

r_flash
LED_red;turnonredLED
calltim_sub;calltimersubroutineandcheckifanyremotekeyispressed
LED_off;turnoffLED
calltim_sub;calltimersubroutineandcheckifanyremotekeyispressed
decfszCOUNT,f
gotor_flash;andloop
gotomain_loop;timeoutafterapprox.30seconds(ifshutdownfails)

tim_sub;
clrftmr1h;cleartimer1registers
clrftmr1l;

ir_chk
btfssIR_C_out;highlevelatIR?
gototim_chk;-no,checktimer1
callrc5_rx;-yes,callrc5_rxsubroutine
btfscRC5_Flag;RC5codeOK?
gototim_chk;-no,checktimer1

MOVfwRC5_CMD;copyRC5_CMDtowand
andlwb’01111111’;cleartogglebit
bcfstatus,c;clearcarrybit
subwfPWR_KEY_CMD,w;checkifcommandispwrkey;thiswillbeignored
btfssstatus,z;
gotomain_loop;keypressed,abortshutdownandgotomain_loop

tim_chk;
btfsstmr1h,7;checktimer1hregisterbit7(setafter262ms)
gotoir_chk;loopifnotyetset

atx_chk
btfscATX_C_out;waituntilATXisstandby
return;stillon,continueflashing

gotomain_loop;nowstandby,gotomain_loop

;**************************************************************************************************
;Programmode
;**************************************************************************************************

pgm_mode
MOVlwd’4’
MOVwfCOUNT

rg_flash
LED_red;flashbicolorLEDaLTErnatelygreen/red
calldelay_t6;(eitherfor250ms)4timestoindicate
LED_grn;thattheprogrammodehasbeenentered
calldelay_t6
decfszCOUNT
gotorg_flash
LED_off;nowreadytolearncodes(LEDoff)

learn_1
callir_chk1;waitforhighlevelatIR_C_out,timeoutifidlefor>5s
callrc5_rx;callrc5_rxsubroutinee
btfscRC5_Flag;RC5codeOK?
gotolearn_1;no,tryagain

MOVfwRC5_CMD;copyRC5_CMDtowand
andlwb’01111111’;cleartogglebit
MOVwfTMP1;copytoTMP1andTMP2
MOVwfTMP2;
bsfstatus,c;checkifcommandis0...9
sublwd’9’
btfssstatus,c
gotolearn_1;no,tryagain

LED_grn;turnongreenLEDfor250msifa
calldelay_t6;validcodehasbeenreceived
LED_off

MOVfwRC5_CMD;copyRC5_CMDtotemporaryregister
MOVwfRC5_CMD_TMP;forthenexttogglebitcomparison

bcfstatus,c;multiplyTMP1by10
rlfTMP1,f;for10’sofPWR_ON_DELAY
rlfTMP1,f
rlfTMP1,f
MOVfwTMP2
addwfTMP1,f
addwfTMP1,f

learn_2
callir_chk1;waitforhighlevelatIR_C_out,timeoutifidlefor>5s
callrc5_rx;callrc5_rxsubroutine
btfscRC5_Flag;RC5codeOK?
gotolearn_2;no,tryagain

MOVfwRC5_CMD;checkiftogglebithaschanged
subwfRC5_CMD_TMP,w;
btfscstatus,z;
gotolearn_2;no,tryagain

MOVfwRC5_CMD;copyRC5_CMDtowand
andlwb’01111111’;cleartogglebit
MOVwfTMP2;copytoTMP2
bsfstatus,c;checkifcommandis0...9
sublwd’9’;
btfssstatus,c;
gotolearn_2;no,tryagain

MOVfwTMP1;add10’sand1’s
addwfTMP2,w;

MOVwfEEDATA_TMP;copytoEEDATA_TMP

MOVlwh’00’;setEEADR_TMPtoh’00’
MOVwfEEADR_TMP;
callwrite_ee;andwritetoEEPROM

LED_grn;turnongreenLEDfor250msifa
calldelay_t6;validcodehasbeenreceived
LED_off

MOVfwRC5_CMD;copyRC5_CMDtotemporaryregister
MOVwfRC5_CMD_TMP;forthenexttogglebitcomparison

learn_3
callir_chk1;waitforhighlevelatIR_C_out,timeoutifidlefor>5s
callrc5_rx;callrc5_rxsubroutine
btfscRC5_Flag;RC5codeOK?
gotolearn_3;no,tryagain

MOVfwRC5_CMD;checkiftogglebithaschanged
subwfRC5_CMD_TMP,w;
btfscstatus,z;
gotolearn_3;no,tryagain

MOVfwRC5_CMD;copyRC5_CMDtowand
andlwb’01111111’;cleartogglebit
bcfstatus,c;checkifcommandis0...9
sublwd’9’;whichcannotbeassigned
btfscstatus,c;aspwr_key
gotolearn_3;yes,tryagain

MOVfwRC5_ADR
MOVwfEEDATA_TMP;copytoEEDATA_TMP
MOVlwh’01’;setEEADR_TMPtoh’01’
MOVwfEEADR_TMP;
callwrite_ee;andwritetoEEPROM

MOVfwRC5_CMD;copyRC5_CMDtowand
andlwb’01111111’;cleartogglebit
MOVwfEEDATA_TMP;copytoEEDATA_TMP
MOVlwh’02’;setEEADR_TMPtoh’02’
MOVwfEEADR_TMP;
callwrite_ee;andwritetoEEPROM

callcopy_ee;copynewvaluestoRAM

LED_grn;turnongreenLEDfor250mstoindicate
calldelay_t6;thatavalidcodehasbeenreceived
LED_off

clrfKEYCOUNT_1;clearKEYCOUNT_1toresetzerokeydetectiondelay
gotomain_loop

ir_chk1;waitforhighlevelatIR_C_out,timeoutifidlefor>5s
clrftmr1h;cleartimer1registers
clrftmr1l
MOVlwd’19’;setCOUNTtod’19’,thismakes19x262ms=approx.5seconds
MOVwfCOUNT

ir_chk2
btfscIR_C_out;waitforhighlevelatIR_C_out
return;andreturn

btfsctmr1h,7;checktimer1hregisterbit7(setafter262ms)
gotodec_cnt
gotoir_chk2

dec_cnt
clrftmr1h;cleartimer1registers
clrftmr1l
decfszCOUNT,f
gotoir_chk2;notyet5s,loop
clrfKEYCOUNT_1;clearKEYCOUNT_1toresetzerokeydetectiondelay
gotomain_loop;timeoutafterapprox.5s


;**************************************************************************************************
;RC5transmitsubroutine
;**************************************************************************************************

rc5_tx;wehave:RC5address’000AAAAA’andcommand’0CCCCCCC’
bsfRC5_TX_2,7;set1ststartbit
btfssRC5_TX_1,6;checkcommandbit#6and
bsfRC5_TX_2,6;set2ndstartbitifnecessary
bcfstatus,c;clearcarrybit
rlfRC5_TX_1;leftshiftRC5_TX_1twicetobringcommandMSBto
bcfstatus,c;left-mostposition
rlfRC5_TX_1;nowthe16-bitshiftregisterisreadyfor
;shiftingout:RC5_TX_21S0AAAAARC5_TX_1CCCCCC00

bsfIRin;setportregisterbitIRinhighbeforesettingtooutput
Bank_1;toavoida1祍spike
bcfIRinTris;setIRinasoutput
Bank_0;

calldelay_t6;250msdelayfortimedecoupling(LIRCmightstillbebusywith
;processingIRcodesfromthereceiverandwouldnotreacttothe
;thecodegeneratedbelow)

MOVlwd’14’;setBITCOUNTto14
MOVwfBITCOUNT;

bit_test
btfssRC5_TX_2,7;testallbits
gotoout_low_high;rememberthatwehavetoinvertthem

out_high_low
bsfIRin;outputahigh-lowsequenceatIRin
calldelay_t5;eitherstateis889祍
bcfIRin;
calldelay_t5;
gotonext_bit;gotonext_bit

out_low_high
bcfIRin;outputalow-highsequenceatIRin
calldelay_t5;eitherstateis889祍
bsfIRin;
calldelay_t5;

next_bit
rlfRC5_TX_1;leftshiftthe16-bitregister
rlfRC5_TX_2;
decfszBITCOUNT;untilall14bitsareout
gotobit_test;

btfssIRin;ifthelastbitwasahigh-lowsequence,immediatelysetIRin
bsfIRin;hightoterminatetheRC5codeafterthecorrecttime

calldelay_t6;250msdelayfortimedecoupling(IRcodesfromthereceiverchip
;occuringdirectlyafterthecodegeneratedabovewoulddestroy
;theintegrityofthiscode)
Bank_1
bsfIRinTris;setIRintoinputagain
Bank_0

return


;**************************************************************************************************
;RC5receiveroutine
;**************************************************************************************************
;
;in:14bitdatafromIRinresp.DTRin
;
;out:RC5_ADR(8bit,000AAAAA)
;RC5_CMD(8bit,TCCCCCCC)
;RC5_Flag(1bit)0:RC5codevalid,1:RC5codeinvalid
;
;Self-synchronizingcodewhichtoleratesinaccurateRC5timings.
;Toleranceisachievedbypolling+/-approx.250祍aroundeachexpectedlevelchange.Tomarkthe
;receivedcodeasvalid,thelevelbeforeandaftertheedgesmustbeopposite,notimer0overflow
;(512祍)occurred,andtwosamplestakenat1200祍and1500祍aftereachedgemustbeequal.

rc5_rx
clrfDATA_1;clearinputshiftregister
clrfDATA_2;
MOVlwd’13’;setBITCOUNTto13
MOVwfBITCOUNT;
test;1祍mark
calldelay_t1a;1520祍delayuntilapprox.256祍beforenextexpectedslope
calldelay_t1b

pre_slope
test;1祍mark

clrftmr0;cleartimer0register
bcfiNTCon,t0if;cleartimer0interruptflag

btfssIR_C_out;IR_C_outhigh?
gotopoll_lo_hi;

poll_hi_lo
btfscintcon,t0if;checkfortimer0overflow(after512祍)
gotoset_flag;andset’invalid’flag

btfscIR_C_out
gotopoll_hi_lo
gotonext_bit1

poll_lo_hi
bsfDATA_1,0;setlsbinDATA_1

btfscintcon,t0if;checkfortimer0overflow(after512祍)
gotoset_flag;andset’invalid’flag

btfssIR_C_out
gotopoll_lo_hi

next_bit1
decfszBITCOUNT,1;if0:all14bitsreceived(1stwasusedfor
gotoshift;triggerandhasnotbeenrecorded);donot
gotocleanup;shiftanyfurtherandgoonwithcleanup

shift
bcfstatus,c;clearcarrybit
rlfDATA_1,1;leftshiftthe16-bitregisterDATA_2/DATA_1
rlfDATA_2,1;

calldelay_t1a;aquiresample#1
clrfDATA_TMP1;cleartemporaryregister
btfssIR_C_out;IR_C_outlow?
bsfDATA_TMP1,0;thensetlsbinDATA_TMP1

calldelay_t1b;aquiresample#2
clrfDATA_TMP2;cleartemporaryregister
btfssIR_C_out;IR_C_outlow?
bsfDATA_TMP2,0;thensetlsbinDATA_TMP2

check;checkifsamplesareequal
MOVfwDATA_TMP1;copyDATA_1tow,
andlwb’00000001’;keeponlylsbinw,
xorwfDATA_TMP2,0;xorLSBsofDATA_TMP2andw,
btfssstatus,z;ifnotequaldiscarddataand
gotoset_flag;gotoset_flag--novalidcodehasbeenreceived

gotopre_slope;andloop

cleanup;collectedsofar:DATA_2000STAAADATA_1AACCCCCC
MOVfwDATA_1;copyDATA_1tow
andlwb’00111111’;clearbits6and7
MOVwfRC5_CMD;copywtoRC5_CMD

btfscDATA_2,3;togglebitis0?
bsfRC5_CMD,7;ifnot,setbit7ofRC5_CMD
btfssDATA_2,4;2ndstartbitis1?
bsfRC5_CMD,6;ifnot,setbit6ofRC5_CMD(extendedRC5)

rlfDATA_2;leftshifttwotimes
rlfDATA_2;
MOVfwDATA_2;copyDATA_2tow
andlwb’00011100’;clear3MSBand2LSB
MOVwfRC5_ADR;andcopytoRC5_ADR
btfscDATA_1,6;addressbit0is0?
bsfRC5_ADR,0;ifnot,setbit0ofRC5_ADR
btfscDATA_1,7;addressbit1is0?
bsfRC5_ADR,1;ifnot,setbit1ofRC5_ADR
;nowwehave:RC5_ADR000AAAAARC5_CMDTCCCCCCC
bcfRC5_Flag;clearRC5_Flag--validcodehasbeenreceived

return

set_flag
bsfRC5_Flag;setRC5_Flag--novalidcodehasbeenreceived
return


;**************************************************************************************************
;EEPROMread/writesubroutines
;**************************************************************************************************

write_ee
Bank_0
MOVfwEEADR_TMP;copyEEADR_TMPtoeeadr
Bank_1
MOVwfeeadr
Bank_0
MOVfwEEDATA_TMP;copyEEDATA_TMPtoeedata
Bank_1
MOVwfeedata
bsfeecon1,wren;enablewrite
MOVlwh’55’;eepromwriteunlocksequence
MOVwfeecon2;
MOVlwh’aa’;
MOVwfeecon2;
bsfeecon1,wr;write

w_ready
btfsceecon1,wr;writecompleted?
gotow_ready;
Bank_0

return

;--------------------------------------------------------------------------------------------------

copy_ee;readsaddressandcommandforassignedremotepowerkey
;andturnondelayvaluefromEEPROMandcopiesthemto
;theRAMregistersPWR_KEY_ADR,PWR_KEY_CMD,andPWR_ON_DELAY
Bank_1
MOVlwh’00’
MOVwfeeadr
bsfeecon1,rd
MOVfweedata
Bank_0
MOVwfPWR_ON_DELAY

Bank_1
MOVlwh’01’
MOVwfeeadr
bsfeecon1,rd
MOVfweedata
Bank_0
MOVwfPWR_KEY_ADR

Bank_1
MOVlwh’02’
MOVwfeeadr
bsfeecon1,rd
MOVfweedata
Bank_0
MOVwfPWR_KEY_CMD

return

;**************************************************************************************************
;Delayroutines(1cycleequals1祍@4MCoscillatorFrequency)
;**************************************************************************************************

delay_t1a;total:1200cycles
MOVlw0xEE;1193cycles
MOVwfd1
MOVlw0x01
MOVwfd2
delay_t1a_0
decfszd1,f
goto$+2
decfszd2,f
gotodelay_t1a_0

goto$+1;3cycles
nop
return;4cycles(includingcall)

;----------------------------------------------------------

delay_t1b;total:320cycles
MOVlw0x69;316cycles
MOVwfd1
delay_t1b_0
decfszd1,f
gotodelay_t1b_0

return;4cycles(includingcall)

;----------------------------------------------------------

delay_t2;total:500cycles
MOVlwh’A5’;496cycles
MOVwfD1
delay_5
decfszD1,f
gotodelay_5
return;4cycles(includingcall)

;----------------------------------------------------------

delay_t3;total:1255cycles
MOVlwh’F9’;1248cycles
MOVwfD1
MOVlwh’01’
MOVwfD2
delay_6
decfszD1,f
goto$+2
decfszD2,f
gotodelay_6
goto$+1;3cycles
nop
return;4cycles(includingcall)

;----------------------------------------------------------

delay_t4;total:50000cycles
;49993cycles
MOVlwh’0E’
MOVwfD1
MOVlwh’28’
MOVwfD2
delay_7
decfszD1,f
goto$+2
decfszD2,f
gotodelay_7
goto$+1;3cycles
nop
return;4cycles(includingcall)

;----------------------------------------------------------

delay_t5;total:886cycles
MOVlwh’AF’;878cycles
MOVwfD1
MOVlwh’01’
MOVwfD2
delay_8
decfszD1,f
goto$+2
decfszD2,f
gotodelay_8
goto$+1;4cycles
goto$+1
return;4cycles(includingcall)

;----------------------------------------------------------

delay_t6;total:250000cycles
MOVlwh’4E’;249993cycles
MOVwfD1
MOVlwh’C4’
MOVwfD2
delay_9
decfszD1,f
goto$+2
decfszD2,f
gotodelay_9
goto$+1;3cycles
nop
return;4cycles(includingcall)

;----------------------------------------------------------
end

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67