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
它现在亮了但是不是按每个按键他都能亮,而且它显示的数字也不对,大佬帮帮忙吧 |