tmpEQU0x07;20
txbufEQU0x08;22
txcntEQU0x09;23
keyvalueEQU0x0a;24
keylastEQU0xob;25
keytmpEQU0x0c;26
tmr_keyEQU0x0d;27
temp2EQU0x0e;28
teMP3EQU0x0f;29
tmpcntEQU0x10;2A
FLAGEQUOx11;2B
#defineB_keyonFLAG,2
#defineB_keyexecFLAG,0
org0
MOVWFOSCCAL
gotoReset
Readaddr0
retlw0x01
Readaddr1
retlw0x02
;子程序区
Delay9msmovlw.44
goto+2
Delay4ms5movlw.22
movwftemp3
callDelay200us
decfsztemp3,f
goto-2
RETURN;
Delay560usmovlw,138
goto+2
Delay_200usmovlw.48
movwftemp2
nop
nop
deefsztemp2,f
goto-2
nop
RETURN;reflw0
send_byte;发射一个字节
movwftxbuf
movlw.8
movwftxent
send_looprrftxbuf,f;DO先出
bffssSTATUS.C
gotoNow_txbit0
callTx_bitl
goto+2
Nowtxbit0callTx_bit0
deefsztxcnt,f
gotosend_loop
RETURN:retlw0
Tx_bitObsfGPIO.2
callDelay_560as
bcfGPl0.2
callDelay_560us
RETURN;reflw0
Tx_bitl;bit1--高560μs,低
560μs×3
callDelay560us
bcfGPIO,2
callDelay_560us
callDelay_560us
callDelay_560us
RErURN;retlw0
ResetbcfSTATUS,5MOVLWB'00111111’
OPTION
clrfGPJ0
movlwB'00110011'
TRISGPIO
MOVWFGPI0
MOVLWB'00000011'
movwfGPIO
clrfkeylast
bsfGPIO,2
main_loopcallKey_drv;按键驱动
gotomain_loop;按键扫描和处理,有效的按键键值1~4
Key_drvMOVFGPIO,W
clrfkeyvalue
movfwGPIO
andlwB'00111111';读入按键状态,取GPI05,4,1,0
movwftmp
xorlwB'00011111'
btfscSTATUS,Z
gotoGet_key_LON;GPI05压下了
movfwtmp
xorlwB'00010111'
btfscSTATUS,Z
gotoGet_key_LOFF;GPI04压下了
movfwtmp
xorlwB'00111101
btfscSTATUS,Z
gotoGet_key_RON;GPI01压下了
movfwtmp
xorlwB00111110
btfseSTATUS,Z
gotoGet_key_ROFF;GPIO0压下了
movfwtmp
xorlwB'00111111'
btfscSTATUS,Z
gotoNo_key;没有按键压下
incfkeyvalue,f;超过一个键按下,键值=5
Get_key_RON;keyRON键值=4
incfkeyvalue,f
Get_key_ROFF;keyROFF键值=3
incfkeyvalue;f
Get_kty_LON;keyLON键值=2
incfkeyvalue,f
Get_key_LOFF;KeyLOFF键值=1
incfkeyvalue,f
Nokeymovfwkeylast
xorwfkeyvalue,w
btfseSTATUS,Z
gotoValid_key
New_key;前后两次按键不同,把新的按键记下来
movfkeyvalue,w
movwfkeylast
gotoKey_exit
Validkeymovfwkeyvalue
btfscSTATUS,Z
gotokey_release
keyactivexorlw5
bffscSTATUS,Z
gotoKey_exit:键值=5,是多个按键按下,不处理
bsfB_keyon
gotoTx_frame
keyrelease;两次发现无键,是键释放
bcfB_keyon;清键按下标志
bcfB_keyexec:清键处理过标志
clrftmr_key
gotoKey_exit;退出
Key_exitRETURN;retlw0
Tx_framebsfGPIO,5
bsfGPIO,4;
callDelay_9ms
bcfGPIO,4
callDelay_4ms5
callRead_addr0;发地址字节0
callsend_byte
callRead_addr1;发地址字节1
callsend_byte
movfkeyvalue,w;发按键数据
callsend_byte
movfkeyvalue,w
xorlwOxff
callsend_byte;发按键数据补码
callTx_bit1:发结束位
bcfGPIO,5
gotoKey_exit
end
四、硬件抗干扰
在无线通讯中使用单片机,若设计不当。会对诵讯系统造成严重的干扰,相信许多技术人员一定有过同样的苦恼。如果硬件设计不当,会造成原先硬件解码时通讯距离为200米,而用软件编码后可能只有十几米,因此解决硬件抗干扰问题在很大程度上可减少软件解码的误码率。
1.收发模块:早期常用的频率为47MHz,在此频率下,很难有好的解决方法。建议采用目前国家允许无线遥控使用的频率315MHz或433MHz。
2.单片机振荡频率:由于编码或发射电路比较简单,所选用单片机通常为小型单片机,为了节省单片机I/O口,解决单片机运行速度与电磁干扰的矛盾,建议采用芯片内部振荡。
3.屏蔽:为了有效抑制单片机对接收模块的电磁干扰,建议采用屏蔽的方法,让其振荡与发射电路避免外界干扰。
五、结束语
PT2262的软件编码有较好的用武之地。采用软件编码的系统,厂家无须对收发设备进行配套,有利于生产和保管。对客户来说,使用软件编码,厂家只需在软件中加入自动学习功能,用户便可自行使用该功能:只需轻按学习键即可学习新的通讯设备,如遥控器等。目前,该软件编码已经在众多手持遥控设备中采用,客户反映使用简便,效果良好。