ORG 0000H
LJMP START
ORG 000BH
LJMP INTERRUPT_T0
ORG 0030H
START:
MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#4CH
MOV TL0,#00H
MOV R7,#00H
MOV R6,#00H
SETB ET0
SETB EA
SETB TR0
MOV DPTR,#TAB
MAIN:
MOV A,R6
MOVC A,@A+DPTR
MOV P1,A
LJMP MAIN
INTERRUPT_T0:
MOV TH0,#4CH
MOV TL0,#00H
INC R7
CJNE R7,#20,LOOP1
MOV R7,#00H
INC R6
CJNE R6,#10,LOOP1
MOV R6,#00H
LOOP1:
RETI
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
这是一个十进制计数器,但是只循环显示0~9,显示位数可以设定,按键按下,开始循环。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define dispseg P0
#define dispbit P2
#define disnum 3
uchar dispp[disnum],TimeCount,count;
sbit sb=P1^0;
sbit ssb=P1^0;
uint ttt,i,ii;
uchar duan[ ]={0Xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
uchar xuan[ ]={0X01,0X02,0X04,0X08,0X10,0X20};
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ;
}
void outside_init(void)
{ TMOD=0x01;
TH0=(65536-50000)/256; //定时
TL0=(65536-50000)%256;
IE=0X00;
ET0=1;
EA=0;
TR0=1;
}
void outside_int(void) interrupt 1
{ ET0=0;
TH0=(65536-50000)/256; //定时
TL0=(65536-50000)%256;
count++;
if(count>15)
{count=0;
ttt++;
if(ttt>10)
ttt=0;
}
ET0=1;
}
void displayy()
{ uint ii;
dispp[0]=duan[ttt%10];
dispp[1]=duan[ttt/10];
for(ii=0;ii<2;ii++)
{ P0=0xff;
P2=xuan[ii];
P0=dispp[ii] ;
}
P0=0xff;
P2=0xff;
}
void main()
{ outside_init();
delay(1);
while(1)
{ if(sb==0)
{delay(1);
if(sb==0)
{ EA=~EA ;
while(sb==0)
{ displayy();
ET0=0;}
ttt=0;
}
}
ET0=1;
displayy();
}
}