用89C51的串口和74ls164连接,74ls164和两片74ls373连接,P1.0控制个位数的74ls373,P1.1控制十位数的74ls373,数码管共阳极连接,问题是显示子程序不能确定是否正确
ORG 0000H ;主程序的入口地址
LJMP MAIN ;跳转到主程序的开始处
ORG 0003H ;外部中断0的中断程序入口地址
LJMP INT0
INT0: CLR P1.0
CLR P1.1
SETB P1.2
CLR P1.3
SETB P1.4
CLR P1.5
SETB P1.6
CLR P1.7
TT: JNB P1.7 ,TT
RETI
ORG 1000H
MAIN:MOV R1,#00H
MOV SCON,#00H ;初始化串行口方式0
MOV IE,#10000001B ;允许外部中断0
SETB IT0
MOV 20H,#55D
MOV 21H,#5D
MOV 22H,#25D
ST1: CLR P1.2 ;第一个状态,主干道亮绿灯、支干道亮红灯
SETB P1.3
SETB P1.4
CLR P1.5
SETB P1.6
CJNE R1,#0FFH,TZ1 ;R1中的数和立即数0FFH不等则跳转到TZ1
MOV R1,#00H
DEC 20H ;20H中的数55减1
CJNE R1,#0FFH,ST1
TZ1: MOV R2,20H
LCALL DISP ;调用显示子程序
MOV A,20H
MOV R1,#0FFH
CJNE A,#00H,ST1
MOV 20H,#55D
ST2: SETB P1.2
SETB P1.3
CLR P1.4
SETB P1.5
SETB P1.6
CJNE R1,#0FFH,TZ2
MOV R1,#00H
DEC 21H
CJNE R1,#0FFH,ST2
TZ2: MOV R2,21H
LCALL DISP
MOV A,21H
MOV R1,#0FFH
CJNE A,#00H,ST2
MOV 21H,#05D
ST3: SETB P1.2
CLR P1.3
SETB P1.4
SETB P1.5
CLR P1.6
CJNE R1,#0FFH,TZ3
MOV R1,#00H
DEC 22H
CJNE R1,#0FFH,ST3
TZ3: MOV R2,22H
LCALL DISP
MOV A,22H
MOV R1,#0FFH
CJNE A,#00H,ST3
MOV 22H,#25D
ST4: SETB P1.2
SETB P1.3
CLR P1.4
SETB P1.5
SETB P1.6
CJNE R1,#0FFH,TZ4
MOV R1,#00H
DEC 21H
CJNE R1,#0FFH,ST4
TZ4: MOV R2,21H
LCALL DISP
MOV A,21H
MOV R1,#0FFH
CJNE A,#00H,ST4
MOV 21H,#05D
LJMP ST1
DISP: MOV A,R2 ;显示子程序
MOV B,#10D
DIV AB ;A中的数除以B中的数得整数放到A中,余数放到B中
MOV 60H,A
MOV 61H,B
MOV R5,60H ;将十位数放入R5中
MOV R0,61H ;B中的数即个位数放到R0中
LLP: MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
SETB P1.0 ;74ls373的LE端为高电平
MOV SBUF,A ;串口输出A的值,也就是查表所得值,这里输出个位上的数
OUT1:JNB TI,OUT1
CLR TI
CLR P1.0 ;373LE端为低电平锁存
MOV A,R5 ;
MOV DPTR,#TABLE
MOVC A,@A+DPTR
SETB P1.1 ;P1.1控制令一片74ls373的LE端
MOV SBUF,A ;输出十位数
OUT2:JNB TI,OUT2 ;等待发送完毕
CLR TI ;请发送标志,准备发送下一位
CLR P1.1
LCALL DELAY1 ;调用延时一秒子程序
RET
DELAY1:
MOV R4,#10H
DL1: LCALL DL2
DJNZ R4,DL1
RET
DL2: MOV R7,#0FFH
MOV R6,#0FFH
DL3:DJNZ R6,DL3
DJNZ R7,DL3
RET
TABLE:DB 0C0H,0FCH,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END