 源程序如下: ;******************************************************************************** ;* 標(biāo)題: 遙控霓虹燈模擬顯示 * ;* 硬件: top-2005 * ;* 文件: REMCONLED.asm * ;* 日期: 2003-1-18 * ;* 版本: 1.0 * ;* 作者: 張紹斌 轉(zhuǎn)載請注明出處www.mcu51av.com ;* 郵箱: shaobinz@163.com * ;******************************************************************************** ;* 描述: * ;* 遙控控制發(fā)光二極管組花樣顯示 * ;* P0口為發(fā)光二極管的數(shù)據(jù)口,P3.2口接遙控接收頭 * ;********************************************************************************
IRCOM EQU 20H ;20H-23H IR使用 IRIN EQU P3.2 D1 EQU 30H ;流水燈移位數(shù)緩存 D2 EQU 31H NO_M EQU 44H
ORG 0000H AJMP MAIN ORG 0003H ;外部中斷INT0入口地址 AJMP IR_IN
MAIN: MOV SP,#60H MOV PSW,#00H MOV A,#00H MOV 20H,#00H MOV 21H,#00H MOV 22H,#00H MOV 23H,#00H MOV 30h,#00h MOV 31h,#00h MOV IE,#81H ;允許總中斷中斷,使能 INT0 外部中斷 MOV TCON,#01H ;觸發(fā)方式為脈沖負(fù)邊沿觸發(fā) SETB IRIN MOV NO_M,#00H loop1: MOV p0,#00h loop: MOV A,NO_M JZ loop1;開機(jī)無遙控按鍵按下點(diǎn)亮所有二極管 RL A;實(shí)現(xiàn)1~8倍乘(及1變2,2變4....) MOV DPTR,#TAB_KEY NOP JMP @A+DPTR;散轉(zhuǎn) TAB_KEY: AJMP LOOP AJMP TAPE1 AJMP TAPE2 AJMP TAPE3 AJMP TAPE4 AJMP TAPE5 AJMP TAPE6 AJMP TAPE7 AJMP TAPE8 ;------------------以下為花樣燈顯示樣式-------------------- TAPE1: MOV D1,#08H;單燈點(diǎn)亮右移 MOV A,#0FEH QQ0: MOV P0,A ACALL YS RL A DJNZ D1,QQ0 ajmp loop TAPE2: MOV D1,#08H;單燈點(diǎn)亮左移 MOV A,#7FH QQ1: MOV P0,A ACALL YS RR A DJNZ D1,QQ1 ajmp loop TAPE3: MOV D1,#08H;暗點(diǎn)右移 MOV A,#01H QQ2: MOV P0,A ACALL YS RL A DJNZ D1,QQ2 ajmp loop TAPE4: MOV D1,#08H;暗點(diǎn)右移 MOV A,#80H QQ3: MOV P0,A ACALL YS RR A DJNZ D1,QQ3 ajmp loop TAPE5: MOV D1,#08H;亮點(diǎn)右左往返流動(dòng) MOV D2,#08H MOV A,#0FEH QQ4: MOV P0,A ACALL YS RL A DJNZ D1,QQ4 AJMP NBA NBA: RR A MOV P0,A ACALL YS DJNZ D2,NBA ajmp loop TAPE6: MOV R5,#00H;全亮后向右檫除,向左點(diǎn)亮 QQ5: INC R5 MOV A,R5 MOV DPTR, #NU_TAB1 MOVC A,@A+DPTR MOV P0,A ACALL YS ACALL YS CJNE R5,#11H,QQ5 ajmp loop NU_TAB1: DB 00H DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH,0FFH DB 7FH,3FH,1FH,0FH,07H,03H,01H,00h
TAPE7: MOV R5,#00H;模擬隊(duì)列向左經(jīng)過顯示窗口 QQ7: INC R5 MOV A,R5 MOV DPTR, #NU_TAB2 MOVC A,@A+DPTR MOV P0,A ACALL YS CJNE R5,#0FH,QQ7 ajmp loop NU_TAB2: DB 00H DB 7FH,0BFH,5FH,0AFH,57H,0ABH,55H,0AAH,0D5H DB 0EAH,0F5H,0FAH,0FDH,0FEH,0FFH TAPE8: MOV R5,#00H;全亮后從兩端往中間擦,再從兩端往中間點(diǎn)亮 QQ9: INC R5 MOV A,R5 MOV DPTR, #NU_TAB3 MOVC A,@A+DPTR MOV P0,A ACALL YS CJNE R5,#10H,QQ9 ajmp loop NU_TAB3: DB 00H DB 00H,81H,0C3H,0E7H,0FFH,0E7H,0C3H,81H,00H DB 81H,0C3H,0E7H,0FFH,0E7H,0C3H,81H ;----------------------------燈點(diǎn)亮延時(shí)---------------------
YS: MOV R7,#250 CBA: MOV R6,#250 DJNZ R6,$ DJNZ R7,CBA RET ; IR 譯碼子程序 ;--------------------------------------------------------- ;轉(zhuǎn)載請注明出處www.mcu51av.com IR_IN: CLR EA ;暫時(shí)關(guān)閉CPU的所有中斷請求 PUSH ACC PUSH PSW SETB PSW.3 ;選擇工作寄存器組1 CLR PSW.4 MOV R2,#04H MOV R0,#IRCOM I1: JNB IRIN,I2 ;等待 IR 信號出現(xiàn) DJNZ R2,I1 JMP IR_OUT ;IR信號沒出現(xiàn),退出。 I2: MOV R4,#20 I20: CALL DEL DJNZ R4,I20 JB IRIN,I1 ;確認(rèn)IR信號出現(xiàn) I21: JB IRIN,I3 ;循環(huán)等IR變?yōu)楦唠娖?變高就過了9MS低電平引導(dǎo)區(qū) CALL DEL JMP I21 I3: MOV R3,#0 ;8位數(shù)清為0 LL: JNB IRIN,I4 ;等IR變?yōu)榈碗娖?變低就過了4.5MS結(jié)束碼 CALL DEL JMP LL I4: JB IRIN,I5 ;等 IR 變?yōu)楦唠娖,過了0或1的0.56MS低電平區(qū) CALL DEL JMP I4 I5: MOV R2,#0 ;0.14ms 計(jì)數(shù) L1: CALL DEL ;看高電平保持時(shí)間,即幾個(gè)0.14MS ;"0"不超過(1.125-0.56)/0.14=4個(gè) ;"1"至少有(2.25-0.56)/0.14=12個(gè) JB IRIN, N1 ;等 IR 變?yōu)楦唠娖?BR>;IR=0,檢查R2中的計(jì)數(shù)值 MOV A,#8 CLR C SUBB A,R2 ;判斷高低位,R2小于8,C=0,R2大于8,C=1 ;取5,6,7,8,9,10,11都可,中間數(shù)最保險(xiǎn) ;若C=0說明R2小于8,收到的是"0"位 ;若C=1說明R2大于8,收到的是"1"位 MOV A,@R0 ;R0=20H已被清0,及A=0 RRC A ;RRC后A內(nèi)被一位一位C替代了,低位是第一個(gè)C的值 MOV @R0,A ;處理完一位,暫時(shí)存到20H INC R3 CJNE R3,#8,LL ;需處理完8位,1,2,3,4,5,6,7,8位放入20H,第8位是最高位 MOV R3,#0 INC R0 ;換緩存21H,22H,23H,一個(gè)緩存存8位0,1組合 CJNE R0,#24H,LL ;收集到4字節(jié)了哦(用戶反碼=21H,鍵碼=22H,鍵反碼=23H) JMP IR_COMP ;跳出準(zhǔn)備處理糾錯(cuò) N1: INC R2 CJNE R2,#30,L1 ;0.14ms計(jì)數(shù)過長則時(shí)間到自動(dòng)離開
IR_OUT: POP PSW POP ACC SETB EA RETI ;----------------------------------------------------- ;鍵值比較與鍵值數(shù)據(jù)處理 ;22H存入鍵碼,23H存入鍵碼的反碼 ;----------------------------------------------------- IR_COMP: ;MOV A,20H ;XRL A,#00H;不同遙控器用戶碼不同的,加上比較遙控就專用了 ;JNZ,IR_OUT ;MOV A,21H ;XRL A,#0DFH;同上,雙保險(xiǎn) ;JNZ IR_OUT MOV A,22H CPL A XRL A,23H ;將22H取反后和23H比較 JNZ IR_OUT ;如果不等表示接收數(shù)據(jù)發(fā)生錯(cuò)誤,放棄 MOV R1,#08H;只用遙控的8個(gè)按鍵,看按下的按鍵是第幾個(gè) MOV DPTR,#TAB_REMOT;指針指向遙控鍵值表 LOOKUP: MOV A,R1 MOVC A,@A+DPTR XRL A,22H JZ REMBAK DJNZ R1,LOOKUP REMBAK: MOV NO_M,R1 nop sjmp ir_out ;-------------------------遙控鍵值表--------------------- TAB_REMOT:;其他6221/6222遙控器要先測碼建立此表 DB 00H DB 10H,03H,01H,06H DB 09H,1DH,1FH,0DH;只用遙控上排8個(gè)按鍵 ;------------------------------------------------ ; DELAY R5*0.14MS DEL: MOV R5,#1 ;IR解碼使用 DEL0: MOV R6,#2 DEL1: MOV R7,#32 DEL2: DJNZ R7,DEL2 DJNZ R6,DEL1 DJNZ R5,DEL0 RET ;--------------------------------------------- DELAY1: ;數(shù)碼管延時(shí)4MS
MOV R6,#20 DL2: MOV R7,#100 DJNZ R7,$ DJNZ R6,DL2 RET ;------------------------------------- END ;結(jié)束
|