| 這樣接收到的僅僅是普通的代碼,要得到標(biāo)準(zhǔn)的鍵值,還必須進(jìn)行代碼識別和代碼轉(zhuǎn)換,下面是從代碼接收到獲得標(biāo)準(zhǔn)值的子程。 KREM;與接收頭相連的I/O口 1AH,1BH,1CH,1DH;存放代碼的4個(gè)連續(xù)單元 YAO_KONG: CLR EA JNB KREM,REMOT1 SJMP REM_BAK ;平時(shí)KREM為高電平,所以當(dāng)KREM=1時(shí), ;表示無鍵按下,應(yīng)立即返回 REMOT1: JNB KREM,$ ;等待9ms的起始碼發(fā)送完 MOV R2,#32 ;32表示代碼共32位,也可以送24,這樣 ;接收到的24位碼將不包括數(shù)據(jù)代碼的 ;反代碼 ;----------------------------------------- ;代碼接收 BYTE1: MOV R3,#250 BYTE2: MUL AB ;延時(shí)約6ms,可以稍長或稍短,但不能 ;小于4.5ms,也不能太長。太長連擊時(shí) ;將影響程序運(yùn)行速度 JNB KREM,BYTE3; DJNZ R3,BYTE2 ;由于結(jié)果碼為4.5ms,如果小于4.5ms, ;結(jié)果碼未發(fā)送完,讀得的碼值將出錯(cuò) BYTE3: JNB KREM,$ ;等待高電平,保證讀每一位的起點(diǎn)一致 ;----------------------------------------------- MOV R3,#150 DJNZ R3,$ ;延時(shí)0.9ms,延時(shí)范圍為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位數(shù)據(jù)碼, ;8位數(shù)據(jù)的反代碼 ;---------------------------------------------------- ;代碼識別 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 ;如果地址碼不對或接收到的數(shù)據(jù)碼兩單元 ;不反向均當(dāng)錯(cuò)碼,本程序當(dāng)無鍵按下處理 JNZ REM_BAK ;-------------------------------------------- ;代碼轉(zhuǎn)換 MOV R2,#21 ;21為遙控器面板按鍵數(shù) 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中的值即為標(biāo)準(zhǔn)的鍵值 SJMP END_YK REM_BAK: CLR A END_YK: SETB EA RET ;===================================================================== ;代碼轉(zhuǎn)換表,表中的值為面板上相應(yīng)鍵的代碼 ;對于不同的遙控器,表中的值應(yīng)做相應(yīng)的改變 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 ;================================================================= 說明:此程序可在需要的地方任意調(diào)用(LCALL YA0_KONG),返回后,累加器中的值即為標(biāo)準(zhǔn)的鍵值,如果A=0則不予處理(可能原因有:無鍵按下,錯(cuò)碼或非本機(jī)所用的遙控器的操作),程序中的延時(shí)均以4MHz的晶振為準(zhǔn),若用不同的晶振,只需改變相應(yīng)值,符合注釋中的延時(shí)時(shí)間即可。 4.從上述解碼過程我們不難發(fā)現(xiàn),對于連發(fā)代碼,解碼得的值1AH~1DH全為0FFH,所以軟件如果需要處理連擊,我們只須在代碼識別前判斷1AH~1DH 是否全為0FFH,是則有連擊現(xiàn)象,這樣建一個(gè)連擊標(biāo)志,再返回,軟件根據(jù)這個(gè)標(biāo)志,結(jié)合上一次讀得的鍵值便可進(jìn)行相應(yīng)的連擊操作,直到按鍵松開,連擊標(biāo)志才被清除。具體操作如下: 在代碼識別前插入 MOV A,1AH ANL A,1BH ANL A,1CH ANL A,1DH XRL A,#0FFH JNZ DAN_JI SETB FLAG_LIANJI ;建連擊標(biāo)志 SJMP END_YK DAN_JI: NOP 另外子程的最后幾條指令改成 REM_BAK0: MOV A,R2 SJMP END_YK0 REM_BAK: CLRA END_YK0: CLR FLAG_LIANJI ;清連擊標(biāo)志 END_YK: SETB EA RET
四.應(yīng)用實(shí)例 讀者也許會問,只要解得遙控器的代碼就可以了,轉(zhuǎn)換成1~n標(biāo)準(zhǔn)值有什么優(yōu)點(diǎn)呢?看了后面的簡單實(shí)例,不難發(fā)現(xiàn)它有如下好處: ①. 在應(yīng)用系統(tǒng)中,帶遙控器的儀器,一般都帶按鍵,而且二者功能相同,轉(zhuǎn)換成標(biāo)準(zhǔn)值后,遙控按鍵散轉(zhuǎn)表格可以與鍵盤散轉(zhuǎn)表格復(fù)用,這樣能節(jié)省一定的空間。 ②. HT622 1/2最大可支持32或64個(gè)按鍵,一般系統(tǒng)只使用其中的一部分,這樣可能會使遙控器按鍵的代碼毫無規(guī)律,為了處理這樣的代碼,軟件人員要么想方設(shè)法通過復(fù)雜的算法找出那些代碼不是規(guī)律的規(guī)律,要么干脆不管那么多,排列一大堆"CJNE A,#DATA,NEXT"指令判斷,使鍵值判斷變得拖沓冗長。使用前述方法則清楚明了,簡單易行。 ③. 對于不同的遙控器,本程序只要改變代碼轉(zhuǎn)換表即可,對再開發(fā)大有益處。 1.實(shí)例電路
|