当前位置:
首页 >
单片机技术文章 >
51单片机 > 详细内容
- HT6221/2解码成标准的键值
- 发布时间:2009/6/29 阅读次数:2464 字体大小: 【小】 【中】【大】
2.根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
3.从上述两点,我们可得到解码程序的流程图。
这样接收到的仅仅是普通的代码,要得到标准的键值,还必须进行代码识别和代码转换,下面是从代码接收到获得标准值的子程。
KREM;与接收头相连的I/O口
1AH,1BH,1CH,1DH;存放代码的4个连续单元
YAO_KONG: CLR EA
JNB KREM,REMOT1
SJMP REM_BAK ;平时KREM为高电平,所以当KREM=1时,
;表示无键按下,应立即返回
REMOT1: JNB KREM,$ ;等待9ms的起始码发送完
MOV R2,#32 ;32表示代码共32位,也可以送24,这样
;接收到的24位码将不包括数据代码的
;反代码
;-----------------------------------------
;代码接收
BYTE1: MOV R3,#250
BYTE2: MUL AB ;延时约6ms,可以稍长或稍短,但不能
;小于4.5ms,也不能太长。太长连击时
;将影响程序运行速度
JNB KREM,BYTE3;
DJNZ R3,BYTE2 ;由于结果码为4.5ms,如果小于4.5ms,
;结果码未发送完,读得的码值将出错
BYTE3: JNB KREM,$ ;等待高电平,保证读每一位的起点一致
;-----------------------------------------------
MOV R3,#150
DJNZ R3,$ ;延时0.9ms,延时范围为0.56ms~1.12ms
;----------------------------------------
MOV C,KREM
MOV R3,#4
MOV R0,#1DH
BYTE4: MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R3,BYTE4
DJNZ R2,BYTE1
;至此32位代码已全部接收完成,并存放在1AH~1DH中,
;依次为低8位地址码,高8位地址码,8位数据码,
;8位数据的反代码
;----------------------------------------------------
;代码识别
MOV A,1AH
XRL A,#03 ;3为地址低8位的值,对于不同的遥控器
;有不同的地址值
JNZ REM_BAK
MOV A,1BH
XRL A,#0FCH ;FCH为地址高8位的值
JNZ REM_BAK
MOV A,1CH
CPL A
XRL A,1DH ;如果地址码不对或接收到的数据码两单元
;不反向均当错码,本程序当无键按下处理
JNZ REM_BAK
;--------------------------------------------
;代码转换
MOV R2,#21 ;21为遥控器面板按键数
MOV DPTR,#TAB_REMOT
LOOKUP_1: MOV A,R2
MOVC A,@A+DPTR
XRL A,1CH
JZ REM_BAK0
DJNZ R2,LOOPUP_1
REM_BAK0: MOV A,R2 ;R2中的值即为标准的键值
SJMP END_YK
REM_BAK: CLR A
END_YK: SETB EA
RET
;=====================================================================
;代码转换表,表中的值为面板上相应键的代码
;对于不同的遥控器,表中的值应做相应的改变
TAB_REMOT:
DB 00H
; VCD DVD AUX TUNER ST/M TSV-4 6
DB 0C0H, 0D0H, 0E8H, 0F0H, 0E0H, 0C8H
; UP DOWN FM/AM MEMORY A/B 11
DB 00H, 20H, 48H, 68H, 58H
; 1 2 3 4 5 6 17
DB 0D8H, 0F8H, 40H, 60H, 50H, 70H
; AUTO VOL+ VOL- MUTE 21
DB 28H , 10H , 30H , 78H
;=================================================================
说明:此程序可在需要的地方任意调用(LCALL YA0_KONG),返回后,累加器中的值即为标准的键值,如果A=0则不予处理(可能原因有:无键按下,错码或非本机所用的遥控器的操作),程序中的延时均以4MHz的晶振为准,若用不同的晶振,只需改变相应值,符合注释中的延时时间即可。
4. 从上述解码过程我们不难发现,对于连发代码,解码得的值1AH~1DH全为0FFH,所以软件如果需要处理连击,我们只须在代码识别前判断1AH~1DH是否全为0FFH,是则有连击现象,这样建一个连击标志,再返回,软件根据这个标志,结合上一次读得的键值便可进行相应的连击操作,直到按键松开,连击标志才被清除。具体操作如下:
在代码识别前插入
MOV A,1AH
ANL A,1BH
ANL A,1CH
ANL A,1DH
XRL A,#0FFH
JNZ DAN_JI
SETB FLAG_LIANJI ;建连击标志
SJMP END_YK
DAN_JI: NOP
另外子程的最后几条指令改成
REM_BAK0: MOV A,R2
SJMP END_YK0
REM_BAK: CLRA
END_YK0: CLR FLAG_LIANJI ;清连击标志
END_YK: SETB EA
RET