求助独立按键P14控制停止和启动。P15秒加一怎么在数码管时钟添加。四位共阴极数码管显示分秒
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#define uchar unsigned char
#define uint unsingned int
#define LED P0
sbit k1=P1^4;
sbit k2=P1^5;
void keytest();
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9共阴数码管数字码
uchar tbb[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点字码
uchar miao,t,shi,ge,fen,bai,qian; //定义秒,分 。 每位数码管划分为个 十 百 千。
//----------------子函数初始化--------------------
void init();
void timer0();
void display();
void delay(uchar);
//-----------------主函数-------------------
void main()
{
while(1)
{
init();
timer0();
display();
}
}
//-----------------定时器0初始化-------------------
void init()
{
miao=t=0;
TMOD=0x01;
TH0=(65536-15536)/256;
TL0=(65536-15536)%256;
EA=1;
ET0=1;
}
//-----------------计时函数-------------------
void timer0()
{
TR0=1; //启动定时器0
if(TF0==1) //查询定时器0的中断标志位TF0
{
TF0=0;
t++;
if(t==20) //20次循环为1s
{
t=0;
miao++; //秒每次加一
if(miao==60) //秒为60时清零后。分加一
{miao=0;
fen++;
if(fen==60) //分为60时清零
fen=0;
}
}
}
}
//-----------------扫描显示函数-------------------
void display()
{
shi=miao/10; //十位
ge=miao%10; //各位
bai=fen%10; //百位
qian=fen/10; //千位
P1=0x01; //选中个位并显示
LED=tab[ge];
delay(5);
P1=0x02; //选中十位并显示
LED=tab[shi];
delay(5);
P1=0X04;
LED=tbb[bai]; //选中百位并显示
delay(5);
P1=0X08;
LED=tab[qian]; //选中千位并显示
delay(5);
}
//-----------------快速延时函数-------------------
void delay(uchar x)
{
int i,j;
for(i=x;i>0;i--)
for(j=2;j>0;j--);
}
#define uchar unsigned char
#define uint unsingned int
#define LED P0
sbit k1=P1^4;
sbit k2=P1^5;
void keytest();
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9共阴数码管数字码
uchar tbb[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点字码
uchar miao,t,shi,ge,fen,bai,qian; //定义秒,分 。 每位数码管划分为个 十 百 千。
//----------------子函数初始化--------------------
void init();
void timer0();
void display();
void delay(uchar);
//-----------------主函数-------------------
void main()
{
while(1)
{
init();
timer0();
display();
}
}
//-----------------定时器0初始化-------------------
void init()
{
miao=t=0;
TMOD=0x01;
TH0=(65536-15536)/256;
TL0=(65536-15536)%256;
EA=1;
ET0=1;
}
//-----------------计时函数-------------------
void timer0()
{
TR0=1; //启动定时器0
if(TF0==1) //查询定时器0的中断标志位TF0
{
TF0=0;
t++;
if(t==20) //20次循环为1s
{
t=0;
miao++; //秒每次加一
if(miao==60) //秒为60时清零后。分加一
{miao=0;
fen++;
if(fen==60) //分为60时清零
fen=0;
}
}
}
}
//-----------------扫描显示函数-------------------
void display()
{
shi=miao/10; //十位
ge=miao%10; //各位
bai=fen%10; //百位
qian=fen/10; //千位
P1=0x01; //选中个位并显示
LED=tab[ge];
delay(5);
P1=0x02; //选中十位并显示
LED=tab[shi];
delay(5);
P1=0X04;
LED=tbb[bai]; //选中百位并显示
delay(5);
P1=0X08;
LED=tab[qian]; //选中千位并显示
delay(5);
}
//-----------------快速延时函数-------------------
void delay(uchar x)
{
int i,j;
for(i=x;i>0;i--)
for(j=2;j>0;j--);
}
可以用中断,也可以用循环。
P14有两个功能:启动、停止,应该是互斥的才对吧。做一个标志位。用来表示是哪一种。
P15秒加1,检测是否P15按下,或在中断中,让秒++。
当秒>60时,秒=1;
程序加了。没反应