#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit tiao=P3^4;
sbit jia=P3^5;
sbit jian=P3^6;
sbit sure=P3^7;
uchar num=3;//调整的按键按下的次数,取num=3是为了方便后续使用num%3进行判断
sbit wela=P2^7;
sbit dula=P2^6;
// uchar flag0=0; //flag0=1时,1HZ闪烁
uchar flag1=0; //flag0=1的前提下:若flag1=0时,亮;flag1=1时,灭
uchar flag2=0;//flag2=1时,调整时
uchar flag3=0;//flag3=1时,调整分
uchar flag4=0;//flag4=1时,调整秒
uchar cd=0; //定义一个长按或短按的标识位,cd=0,短按
uchar miao,fen,shi;//时分秒
uchar shanshuo=0;//用于闪烁,shanshuo=10时,为1HZ
uchar jishi=0; //用于数码管显示计时,jishi=20时为1s
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delay(uchar k) //数码管动态显示的延时函数
{
uchar i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
void T0_init() //定时50ms初始化
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
}
void T0_ser() interrupt 1 //定时1s中断服务程序
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
jishi++;
if(jishi==20)
{
jishi=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
}
if(fen==60)
{
fen=0;
shi++;
}
if(shi==24)
shi=0;
}
shanshuo++; //用于闪烁
if(shanshuo==10)
flag1=~flag1; //1HZ闪烁
}
void display_miao() //显示秒
{
wela=1; P0=wei[0]; wela=0;
dula=1; P0=duan[miao%10]; dula=0;
delay(1);
wela=1; P0=wei[1]; wela=0;
dula=1; P0=duan[miao/10]; dula=0;
delay(1);
}
void display_fen() //显示分
{
wela=1; P0=wei[2]; wela=0;
dula=1; P0=duan[fen%10]; dula=0;
delay(1);
wela=1; P0=wei[3]; wela=0;
dula=1; P0=duan[fen/10]; dula=0;
delay(1);
}
void display_shi() //显示时
{
wela=1; P0=wei[4]; wela=0;
dula=1; P0=duan[shi%10]; dula=0;
delay(1);
wela=1; P0=wei[5]; wela=0;
dula=1; P0=duan[shi/10]; dula=0;
delay(1);
}
void display_mie() //灭
{
wela=1; P0=0x00; wela=0;
dula=1; P0=0x40; dula=0;
delay(5);
}
void tiaozheng() //时间调整
{
if(tiao==0)
{
delay(5);
if(tiao==0)
{
num++;
if(num%3==1) //调整按键按下的次数对3取余,为1表示调整时
{
flag4=0;
flag2=1;
}
else
flag2=0;
}
while(tiao==0); //等待按键释放
if(flag2==1) //此时调整时,时闪烁
{
if(tiao==0)
delay(5);
if(tiao==0) //分调整
{
num++;
if(num%3==2)
{
flag2=0;
flag3=1;
}
else
flag3=0;
}
while(tiao==0);
if(flag3==1) //秒调整
{
delay(5);
if(tiao==0)
{
num++;
if(num%3==0)
{
flag4=1;
flag3=0;
}
else
flag4=0;
}
while(tiao==0);
}
}
}
if(sure==0)
{
delay(5);
if(sure==0)
{
display_shi();
display_fen();
display_miao();
}
}
}
void tiao_shi()
{
while(flag2==1) //时闪烁
{
while(flag1==1)
display_mie();
while(flag1==0)
display_shi();
if(jia==0) //加键按下
{
delay(5);
if(jia==0)
cd=0; //短按
delay(100);
if(jia==0)
cd=1; //长按
}
if(cd==0) //短按则加1次
{
shi++;
if(shi==24)
shi=0;
}
if(cd==1) //长按则一直加
{
while(jia==0)
{
shi++;
if(shi==24)
shi=0;
}
}
}
}
void tiao_fen()
{
while(flag3==1) //分闪烁
{
while(flag1==1)
display_mie();
while(flag1==0)
display_fen();
if(jia==0) //加键按下
{
delay(5);
if(jia==0)
cd=0; //短按
delay(100);
if(jia==0)
cd=1; //长按
}
if(cd==0) //短按则加1次
{
fen++;
if(fen==60)
fen=0;
}
if(cd==1) //长按则一直加
{
while(jia==0)
{
fen++;
if(fen==60)
fen=0;
}
}
}
}
void tiao_miao()
{
while(flag4==1) //秒闪烁
{
while(flag1==1)
display_mie();
while(flag1==0)
display_miao();
if(jia==0) //加键按下
{
delay(5);
if(jia==0)
cd=0; //短按
delay(100);
if(jia==0)
cd=1; //长按
}
if(cd==0) //短按则加1次
{
miao++;
if(miao==60)
miao=0;
}
if(cd==1) //长按则一直加
{
while(jia==0)
{
miao++;
if(miao==60)
miao=0;
}
}
}
}
void main()
{
while(1)
{
T0_init();
display_shi();
display_fen();
display_miao();
tiaozheng();
tiao_shi();
tiao_fen();
tiao_miao();
}
}
这是自己写的程序,还没写减按键,已经运行不出来了,所以请教各位以前编程的案例 |