1HT6221/2解码成标准的键值李奇刚一.HT6221遥控器芯片简介1.特征*工作电压:1.8V~3.5V*Dout输出38KHz*最小发射字:一个字*一个455KHz的陶瓷或晶体*16位地址码*8位数据码*ppm代码方式*最大活动键HT6221:32键HT6222:64键2.应用*电视和录像录音机控制器*夜盗警报系统*烟火警报系统*车门控制器*汽车警报系统*安全系统*其它遥控系统3.概述HT6221/HT6222能编码16位地址码和8位数据码,HT6221/HT6222包含32键(K1~K32)和64键(K1~K64)4.引脚图-20DIP/SOPHT6221VSSX1X2D7VDDDOUTR4R3R2R11098765432116151413121117181920LEDC8C7C6C5C4C3C2C1AINR2R1AINC1C2C3C4C5C6C7C8LEDR3R4R5R6R7R8DOUTVDDD7X2X1VSS123456789101112131415161718192021222324HT6222-24DIP/SOP25.方框图6.引脚说明引脚号引脚名称I/0描述1~6R3~R8输入键盘行控制,高电平有效7DOUT输出串行数据输出引脚,38KHz发射频率8VDD输入1.8V~3.5V9DT输入最重要数据位(DT)代码设置10X2输出455KHz振荡器输出11X1输入455KHz振荡器输入12VSS输入地13LED输出发射输出14~21C8~C1输入/输出键盘列控制22AIN输入低8位地址码输入23~24R1~R2输入键盘行控制,高电平有效7.内部连接应用电路&BufferDataSelectCircuitSync.BinaryDetector1of24Decoder/24Counter&&RegistersDataRomCircuitGateMatrix&KeyboardDividerOscillatorDOUTLEDVDDVSSAIND7C8C1R1R8X1X2..............VDDCMOSIN/OUTCMOSIN/OUTPull-LowCMOSINPull-LowCMOSINCMOSOUTVDDOSCILLATORX1X2EN10M3二.代码的特征1.HT6221键码的形成当一个键按下超过36ms,振荡器使芯片激活,如果这个键按下且延迟大约108ms,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。2.代码格式(以接收代码为准,接收代码与发射代码反向)①位定义②单发代码格式③连发代码格式注:代码宽度算法:16位地址码的最短宽度:1.12×16=18ms16位地址码的最长宽度:2.24ms×16=36ms易知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms∴32位代码的宽度为(18ms+27ms)~(36ms+27ms)三.解码方法及软件说明“0”0.56msdataperiod(1.12ms)“1”0.56msdataperiod(2.24ms)2.5ms9ms32位位位(4.5ms~63ms)(A0~A15+D0~D7+D0~D7)4.5ms9ms41.解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。2.根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。3.从上述两点,我们可得到解码程序的流程图。这样接收到的仅仅是普通的代码,要得到标准的键值,还必须进行代码识别和代码转换,下面是从代码接收到获得标准值的子程。KREM;与接收头相连的I/O口1AH,1BH,1CH,1DH;存放代码的4个连续单元YAO_KONG:CLREAJNBKREM,REMOT1SJMPREM_BAK;平时KREM为高电平,所以当KREM=1时,;表示无键按下,应立即返回REMOT1:JNBKREM,$;等待9ms的起始码发送完MOVR2,#32;32表示代码共32位,也可以送24,这样位位KREM=0位Y位9ms位位位位位位位6ms,位位位位位位位位位位位位位位NY位6ms位位位位位位位位位位位位位位位位位位位位0.9ms位位位位位位位(位位位),位位位位位位32位位位N5;接收到的24位码将不包括数据代码的;反代码;-----------------------------------------;代码接收BYTE1:MOVR3,#250BYTE2:MULAB;延时约6ms,可以稍长或稍短,但不能;小于4.5ms,也不能太长。太长连击时;将影响程序运行速度JNBKREM,BYTE3;DJNZR3,BYTE2;由于结果码为4.5ms,如果小于4.5ms,;结果码未发送完,读得的码值将出错BYTE3:JNBKREM,$;等待高电平,保证读每一位的起点一致;-----------------------------------------------MOVR3,#150DJNZR3,$;延时0.9ms,延时范围为0.56ms~1.12ms;----------------------------------------MOVC,KREMMOVR3,#4MOVR0,#1DHBYTE4:MOVA,@R0RLCAMOV@R0,ADECR0DJNZR3,BYTE4DJNZR2,BYTE1;至此32位代码已全部接收完成,并存放在1AH~1DH中,;依次为低8位地址码,高8位地址码,8位数据码,;8位数据的反代码;----------------------------------------------------;代码识别MOVA,1AHXRLA,#03;3为地址低8位的值,对于不同的遥控器;有不同的地址值JNZREM_BAKMOVA,1BHXRLA,#0FCH;FCH为地址高8位的值JNZREM_BAKMOVA,1CHCPLAXRLA,1DH;如果地址码不对或接收到的数据码两单元;不反向均当错码,本程序当无键按下处理6JNZREM_BAK;--------------------------------------------;代码转换MOVR2,#21;21为遥控器面板按键数MOVDPTR,#TAB_REMOTLOOKUP_1:MOVA,R2MOVCA,@A+DPTRXRLA,1CHJZREM_BAK0DJNZR2,LOOPUP_1REM_BAK0:MOVA,R2;R2中的值即为标准的键值SJMPEND_YKREM_BAK:CLRAEND_YK:SETBEARET;=====================================================================;代码转换表,表中的值为面板上相应键的代码;对于不同的遥控器,表中的值应做相应的改变TAB_REMOT:DB00H;VCDDVDAUXTUNERST/MTSV-46DB0C0H,0D0H,0E8H,0F0H,0E0H,0C8H;UPDOWNFM/AMMEMORYA/B11DB00H,20H,48H,68H,58H;12345617DB0D8H,0F8H,40H,60H,50H,70H;AUTOVOL+VOL-MUTE21DB28H,10H,30H,78H;=================================================================说明:此程序可在需要的地方任意调用(LCALLYA0_KONG),返回后,累加器中的值即为标准的键值,如果A=0则不予处理(可能原因有:无键按下,错码或非本机所用的遥控器的操作),程序中的延时均以4MHz的晶振为准,若用不同的晶振,只需改变相应值,符合注释中的延时时间即可。4.从上述解码过程我们不难发现,对于连发代码,解码得的值1AH~1DH全为0FFH,所以软件如果需要处理连击,我们只须在代码识别前判断1AH~1DH是否全为0FFH,是则有连击现象,这样建一个连击标志,再返回,软件根据这个标志,结合上一次读得的键值便可进行相应的连击操作,直到按键松开,连击标志才被清除。具体操作如下:在代码识别前插入MOVA,1AHANLA,1BH7ANLA,1CHANLA,1DHXRLA,#0FFHJNZDAN_JISETBFLAG_LIANJI;建连击标志SJMPEND_YKDAN_JI:NOP另外子程的最后几条指令改成REM_BAK0:MOVA,R2SJMPEND_YK0REM_BAK:CLRAEND_YK0:CLRFLAG_LIANJI;清连击标志END_YK:SETBEARET四.应用实例读者也许会问,只要解得遥控器的代码就可以了,转换成1~n标准值有什么优点呢?看了后面的简单实例,不难发现它有如下好处:①.在应用系统中,带遥控器的仪器,一般都带按键,而且二者功能相同,转换成标准值后,遥控按键散转表格可以与键盘散转表格复用,这样能节省一定的空间。②.HT6221/2最大可支持32或64个按键,一般系统只使用其中的一部分,这样可能会使遥控器按键的代码毫无规律,为了处理这样的代码,软件人员要么想方设法通过复杂的算法找出那些代码不是规律的规律,要么干脆不管那么多,排列一大堆“CJNEA,#DATA,NEXT”指令判断,使键值判断变得拖沓冗长。使用前述方法则清楚明了,简单易行。③.对于不同的遥控器,本程序只要改变代码转换表即可,对再开发大有益处。1.实例电路8P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78RESET9P3.010P3.111P3.212P3.313P3.414P3.515P3.616P3.717XTAL218XTAL119GND20VDD40P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732EA/VPP31ALE/PR30PSEN29P2.728P2.627P2.526P2.425P2.324P2.223P2.122P2.021A1AT89C51VCCVCCVCC12310410u33p33p4m9015IN4148REMOT300X8300X8300X3300X2L1L2L3L4L5L6L7L8L9L10L11L12L13L14L15L16L17L18L19L20L219程序清单及说明:KREMEQUP0.0L1EQUP1.0L2EQUP1.1L3EQUP1.2L4EQUP1.3L5EQUP1.4L6EQUP1.5L7EQUP1.6L8EQUP1.7L9EQUP3.4L10EQUP3.5L11EQUP3.6L12EQUP2.0L13EQUP2.1L14EQUP2.2L15EQUP2.3L16EQUP2.4L17EQUP2.5L18EQUP2.6L19EQUP2.7L20EQUP0.6L21EQUP0.5;-----------------------------------------ORG0000HAJMPSTART0ORG0030HSTART0:MOVSP,#60HSTART:ACALLYAO_KONG;调用解码子程JZSTART;----------