| 这样接收到的仅仅是普通的代码,要得到标准的键值,还必须进行代码识别和代码转换,下面是从代码接收到获得标准值的子程。
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
四.应用实例 读者也许会问,只要解得遥控器的代码就可以了,转换成1~n标准值有什么优点呢?看了后面的简单实例,不难发现它有如下好处: ①. 在应用系统中,带遥控器的仪器,一般都带按键,而且二者功能相同,转换成标准值后,遥控按键散转表格可以与键盘散转表格复用,这样能节省一定的空间。 ②. HT622 1/2最大可支持32或64个按键,一般系统只使用其中的一部分,这样可能会使遥控器按键的代码毫无规律,为了处理这样的代码,软件人员要么想方设法通过复杂的算法找出那些代码不是规律的规律,要么干脆不管那么多,排列一大堆"CJNE A,#DATA,NEXT"指令判断,使键值判断变得拖沓冗长。使用前述方法则清楚明了,简单易行。 ③. 对于不同的遥控器,本程序只要改变代码转换表即可,对再开发大有益处。
1.实例电路
|