下面是仿真图,芯片是用的51单片机:
下面是源程序:
#include"AT89X52.H"
#define uchar unsigned char
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //断码
uchar code pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //微码
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit jidianqi1=P1^5;
sbit k6=P1^6;
sbit led=P1^7;
uchar k[8]={0,0,16,0,0,16,0,0}; //01234567
uchar code seg00[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //断码
uchar code pos00[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //微码
uchar k00[8]={0,0,16,0,0,16,0,0}; //01234567
uchar second;
uchar minite;
uchar hour;
uchar num;
uchar naozhongqiyongFlag;
uchar second00;
uchar minite00;
uchar hour00;
uchar num00;
////////////////////////////////////////////////////////////////////////////////////
void TimeCompate(void)
{
if(naozhongqiyongFlag)
{
if((second00==0)&&(minite00==1)&&(hour00==0)) ///&&(minite00<=2),,,(naozhongqiyongFlag==1)&&,, led=1
{
jidianqi1=0;
}
else if((second00==5)&&(minite00==42)&&(hour00==0))
{
jidianqi1=1; naozhongqiyongFlag=~naozhongqiyongFlag; led=~led;
}
}
/*if(hour00!=0)
{ jidianqi1=1; naozhongqiyongFlag=0;
}
if(hour00==0)
{
if(minite00<1)
{ jidianqi1=1; naozhongqiyongFlag=0;
}
else if(minite00>2)
{ jidianqi1=1; naozhongqiyongFlag=0;
}
else
{
jidianqi1=0;
}
}
/*/
//////////////////////////////////////////
}
//////////////// //延时程序///////////////////////////////
void delay_5ms(void)
{
uchar i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--)
;
}
////////////显示程序,这个写法不错啊。//////////////////////////
void disp(uchar m,uchar n)
{
P2=pos[n]; //查表法 把对应的段码送P2?
P0=seg[m]; //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}
////////////显示程序,这个写法不错啊。//////222222222222222/////
void disp00(uchar x,uchar y)
{
P2=pos00[y]; //查表法 把对应的段码送P2?
P0=seg00[x]; //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}
////////////////////主程序//////////////////////////////
void main(void)
{
uchar j;
uchar p;
TMOD=0x01;
// TH0=-50000/256;
// TL0=-50000%256;
TR0=1;
ET0=1;
EA=1;
second=0;
minite=0;
hour=0;
second00=7;
minite00=8;
hour00=9;
jidianqi1=1;
naozhongqiyongFlag=0;
led=1;
while(1)
{
TimeCompate();
if(k1==0)
{
delay_5ms();
if(k1==0) //判断按键是否按下
{
second=0;
while(k1==0);
}
}
if(k2==0) //判断按键是否按下
{
delay_5ms();
if(k2==0)
{
minite++;
if(minite==60) minite=0;
while(k2==0);
}
}
if(k3==0) //判断按键是否按下
{
delay_5ms();
if(k3==0)
{
hour++;
if(hour==24) hour=0;
while(k3==0)
{for(j=0;j<8;j++) //扫描显示程序,循环有8次,01234567.
disp(k[j],j); //扫描显示程序
}
}
}
//////////////////////////////////////////////////////////////////////
if(k4==0) //判断按键是否按下
{
delay_5ms();
if(k4==0)
{
while(k4==0)
{
for(p=0;p<8;p++)
disp00(k00[p],p);
TimeCompate();
;
}
}
}
///////////////////////////////////////////////////////////////////////////////
if(k5==0) //判断按键是否按下
{
delay_5ms();
if(k5==0)
{
second00=57;
minite00=0;
hour00=0;
while(k5==0)
{
for(p=0;p<8;p++)
disp00(k00[p],p);
;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////
if(k6==0) //判断按键是否按下
{
delay_5ms();
if(k6==0)
{
naozhongqiyongFlag=~naozhongqiyongFlag;
led=~led;
while(k6==0)
{
;
}
}
}
////////////////////////////////////////////////////////////////////////////////////
for(j=0;j<8;j++) //扫描显示程序,循环有8次,01234567.
disp(k[j],j); //扫描显示程序
////////////////////////////////////////////////////////////////////////////////////
TimeCompate();
////////////////////////////////////////////////////////////////////////////////////
}
}
////////////////*定时器工作方式*/ /////////////////////////////////
void t0(void) interrupt 1 /*定时器工作方式*/ using 0 //工作寄存器
{
num++;
if(num==20)
{
num=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
k[0]=second%10; //各位
k[1]=second/10; //各十位
k[3]=minite%10; //各位
k[4]=minite/10; //各十位
k[6]=hour%10; //各位
k[7]=hour/10; //各十位
}
num00++;
if(num00==20)
{
num00=0;
second00++;
if(second00==60)
{
second00=0;
minite00++;
if(minite00==60)
{
minite00=0;
hour00++;
if(hour00==99)
{
hour00=0;
}
}
}
k00[0]=second00%10; //各位
k00[1]=second00/10; //各十位
k00[3]=minite00%10; //各位
k00[4]=minite00/10; //各十位
k00[6]=hour00%10; //各位
k00[7]=hour00/10; //各十位
}
TH0=-50000/256;
TL0=-50000%256;
}