|
|
DQ EQU P3.3 ADDR0 EQU P1.0 ADDR1 EQU P1.1 ADDR2 EQU P1.2 ADDR3 EQU P1.3 ENLED EQU P1.4 ORG 000H LJMP MAIN ORG 000BH LJMP ZD MAIN: MOV TH0,#0FEH MOV TL0,#0FEH MOV TMOD,#01H SETB ET0 SETB TR0 SETB EA CLR ENLED CLR ADDR0 CLR ADDR1 CLR ADDR2 SETB ADDR3 SJMP $ ZD: CLR EA MOV R3,#10 SB: LCALL YS1 ;延時9000微妙 DJNZ R3,SB JB DQ,EXIT ;---------------以上對檢測9000微妙的初始低電平 JNB DQ,$ LCALL YS2 ;延時4.74毫秒避開4.5毫秒結果碼 MOV R1,#40H ;設定起始RAM區 MOV R2,#4 ;四組八位數據 PP: MOV R3,#8 JJJ: JNB DQ,$ ;等待地址碼第一個高電平信號 LCALL YS1 ;延時882微妙去判斷此時的信號高低電平狀態 MOV C,DQ JNC UU LCALL YS3 ;延時1000微妙 UU: MOV A,@R1 ;將R1的地址給它 RRC A ;將C轉到最低位 MOV @R1,A ;再將A存到r1中 DJNZ R3,JJJ ;循環接受地址碼的高8位 INC R1 DJNZ R2,PP ;接受完16位地址碼和8位數據嗎和8位數據反碼 ;---------------以上將16位地址碼和8位數據嗎和8位數據反碼存放在1AH,1BH,1CH,1DH MOV A,42H CPL A XRL A,43H ;將兩數據作比較 JNZ EXIT ;不相同則丟棄退出解碼 MOV DPTR,#TABLE MOV A,43H ANL A,#0FH ;求與取其低四位 MOVC A,@A+DPTR MOV 44H,A ;將查表得到的數字存到1EH中 MOV A,43H SWAP A ;高四位與低四位交換 ANL A,#0FH ;求與取其高四位 MOVC A,@A+DPTR MOV 45H,A ;將查表到的數據放在1FH中 ;---------------以上將接受到的數據碼與數據反碼經過查表后存放在1EH和1FH中 MOV R7,#20H DISP: MOV P0,45H ;將數據送到數碼管中 CLR P2.1 LCALL YS2 SETB P2.1 MOV P0,44H CLR P2.2 LCALL YS2 SETB P2.2 CLR P1.6 LCALL YS2 SETB P1.6 DJNZ R7,DISP EXIT: SETB EA RETI ;退出解碼程序 ;延時882微秒 YS1: MOV R4,#03H DL0: MOV R5,#91H DJNZ R5,$ DJNZ R4,DL0 RET YS2: ;延時4740微秒 MOV R6,#03H DL1: MOV R4,#08H DL2: MOV R5,#61H DJNZ R5,$ DJNZ R4,DL2 DJNZ R6,DL1 RET YS3: ;延時1000微秒 MOV R4,#01H DL3: MOV R6,#8EH DL4: MOV R5,#02H DJNZ R5,$ DJNZ R6,DL4 DJNZ R4,DL3 RET TABLE: DB 0C0h,0F9h,0A4h,0B0h,99h,92h DB 82h,0F8h,80h,90h,88h,83h,0C6h,0A1h,86h,8Eh 它現在亮了但是不是按每個按鍵他都能亮,而且它顯示的數字也不對,大佬幫幫忙吧 |
| 如果不亮,很有可能是數碼管共陰共陽弄錯了 |
| 是不是接線錯了,你的數碼管怎么接的啊?按程序你應該接P0,且是個共陽的管子。 |
| 分段排故,你用的應該是開發板,先讓紅外接收器接收到信號以后讓P1口某個燈亮,然后判斷后再讓另一個燈亮,看問題是出現在前面還是后面。如果出現在后面,就不對紅外接收器收到的數據判斷,直接讓LED顯示某個數字。 |
| 是完全不亮嗎?程序這樣截屏還不如直接復制貼出來好方便閱讀,電路圖也一起貼出來 |