STRT EQU P3.5
STP EQU P3.6
CLRR EQU P3.7
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0INT
ORG 30H
MAIN:
MOV SP,#60H
MOV DPTR,#TAB
MOV TMOD,#01H ;T0定时方式1
SETB EA
SETB ET0
MOV TH0,#3CH ;50ms定时常数
MOV TL0,#0B0H
MOV R0,#20 ;20x50mS=1S
k1:
LCALL DISP
JB STRT,K2
ACALL DISP
JNB STRT,$-2
AJMP START
k2:
JB STP,K3
LCALL DISP
JNB STP,$-3
AJMP STOP
K3:
JB CLRR,K1
LCALL DISP
JNB CLRR,$-3
AJMP CLEAR
START:
SETB TR0
AJMP K1
STOP:
CLR TR0
AJMP K2
CLEAR:
CLR TR0
MOV R4,#0
AJMP K1
T0INT:
MOV TH0,#03CH; ;定时中断子程序。重装定时常数
MOV TL0,#0B0H;
DJNZ R0,T0INTR ;50msX20=1S,未满20次,跳出中断子程序
MOV R0,#20
INC R4
CJNE R4,#100,T0INTR
MOV R4,#0
CLR TR0
T0INTR:
RETI
DISP:
MOV A,R4
MOV B,#10
DIV AB
;当前值除以10
MOV 20H,A
;得出的商送给十位
MOV 21H,B
;得出的余数送给个位
MOV A,20H
;十位显示
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
LCALL DELAY
SETB P2.7
MOV A,21H
;个位显示
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
LCALL DELAY
SETB P2.6
RET
DELAY: ;误差 0us
MOV R6,#10
DL0:
MOV R5,#50
DJNZ R5,$
DJNZ R6,DL0
RET
TAB:
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit STRT=P3^5;
sbit STP=P3^6;
sbit CLRR=P3^7;
sbit DS1=P2^7;
sbit DS0=P2^6;
uchar dtab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar ts,tc;
//无参数输入的延时子程序,误差会比汇编大
void delay()
{ uint i;
for(i=500;i>0;i--);
}
void disp()
{
uchar i,j;
i=tc/10;
j=tc%10;
P0=dtab[i];
DS1=0;
delay();
DS1=1;
P0=dtab[j];
DS0=0;
delay();
DS0=1;
}
void main()
{
SP=0x60;
TMOD =0X01;
EA=1;
ET0=1;
TH0=0X3C;
TL0=0XB0;
while(1)
{
disp(); //显示
//键扫
if(STRT)
{
disp(); //通过调用显示子程序消抖
if(STRT)TR0=1;
}
if(STP)
{
disp();
if(STP){TR0=0;}
}
if(CLRR)
{
disp();
if(CLRR){tc=0;}
}
}
}
void T0INT() interrupt 1
{
TH0=0X3C;
TL0=0XB0;
ts++;
if(ts>=20){
tc++;
if(tc>=100){tc=0;TR0=0;}
}
}追问
能帮我看看那个程序怎么在这个中不能显示呢?