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显示某个数字。 |
是完全不亮吗?程序这样截屏还不如直接复制贴出来好方便阅读,电路图也一起贴出来 |