#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit duanxuan=P2^6;
sbit weixuan=P2^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0-9的数字码
uchar code weima[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar aa,bb,shishi,shige,fenshi,fenge,miaoge,miaoshi,temp,shi,fen,miao,k1num=0;
void delayms(uint ms) //延时函数,数字是几代表时延时少毫秒
{
uint i,j;
for(i=ms;i>0;i--)
for(j=112;j>0;j--);
}
void display(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6) //数码管显示函数
{
uchar temp=0x00,x1,x2,x3,x4,x5,x6;
while(aa!=20) //数码管循环扫描
{
/////////////////////////////
if(k1num=1) //功能键按下 该为闪烁
{
x1=num1;
if(bb<10) //前500ms关闭第一个数码管
num1=temp;
else //后500ms显示第一个数码管的数
num1=x1;
}
P0=duanma[num1]; //显示小时的十位
duanxuan=1;
duanxuan=0;
P0=weima[1];
weixuan=1;
weixuan=0;
delayms(2);
/////////////////////////////////////
if(k1num=1)
{
x2=num2;
if(bb<10) //前500ms关闭第二个数码管
num2=temp;
else //后500ms显示第二个数码管的数
num2=x2;
}
P0=duanma[num2]; //显示小时的个位
duanxuan=1;
duanxuan=0;
P0=weima[2];
weixuan=1;
weixuan=0;
delayms(2);
/////////////////////////////////////////////////
P0=0X40; //在右数第三个数码管输出“——”符号
duanxuan=1;
duanxuan=0;
P0=weima[3];
weixuan=1;
weixuan=0;
delayms(2);
P0=0XFF;//清屏
////////////////////////////////////////
if(k1num=2)
{
x3=num3;
if(bb<10) //前500ms关闭第四个数码管
num3=temp;
else //后500ms显示第四个数码管的数
num3=x3;
}
P0=duanma[num3]; //显示分钟的十位
duanxuan=1;
duanxuan=0;
P0=weima[4];
weixuan=1;
weixuan=0;
delayms(1);
///////////////////////////////
if(k1num=2)
{
x4=num4;
if(bb<10) //前500ms关闭第五个数码管
num4=temp;
else //后500ms显示第五个数码管的数
num4=x4;
}
P0=duanma[num4]; //显示分钟的个位
duanxuan=1;
duanxuan=0;
P0=weima[5];
weixuan=1;
weixuan=0;
delayms(2);
///////////////////////////////////////
P0=0x40; //左数第6个数码管输出“——“ 符号
duanxuan=1;
duanxuan=0;
P0=weima[6];
weixuan=1;
weixuan=0;
delayms(2);
P0=0xff;//清屏
///////////////////////////////
if(k1num=3)
{
x5=num5;
if(bb<10) //前500ms关闭第七个数码管
num5=temp;
else //后500ms显示第七数个码管的数
num5=x5;
}
P0=duanma[num5]; //显示秒钟的十位
duanxuan=1;
duanxuan=0;
P0=weima[7];
weixuan=1;
weixuan=0;
delayms(2);
////////////////////////////////////////////
if(k1num=3)
{
x6=num6;
if(bb<10) //前500ms关闭第八个数码管
num6=temp;
else //后500ms显示第八个数码管的数
num6=x6;
}
P0=duanma[num6]; //显示秒钟的个位
duanxuan=1;
duanxuan=0;
P0=weima[8];
weixuan=1;
weixuan=0;
delayms(2);
}
}
void init() //中断初始化函数
{
aa=0;
miao=0;
fen=10;
shi=18;
TMOD=0X01;
TH0=(65536-46080)/256; //晶振为11.05926MHZ 计50ms
TL0=(65536-46080)%256; //0.05s=(1/晶振)*12*计数值,解得计数值=46080
EA=1; //开总中断
ET0=1; //允许定时器0中断
TR0=1; //定时器0开始工作
}
/*void guanbiao(uchar k1num,uchar numx) //数码管位闪烁函数
{
uchar k;
if(k==k1num) //功能键按下 该为闪烁
{
x1=num1;
if(bb<10) //前500ms关闭第一个数码管
num1=temp;
else //后500ms显示第一个数码管的数
num1=x1;
}
} */
void scankey()
{
if(k1==0) //光标指示
{
delayms(5);
if(k1==0) //延时去抖
{
while(!k1); //等待按键放开
k1num=1; //指示在小时两位
if(k1==0)
{
delayms(5);
if(k1==0)
{
while(!k1);
k1num=2; //指示在分钟两位
if(k1==0)
{
delayms(5);
if(k1==0)
{
while(!k1);
k1num=3; //指示在秒钟两位
}
}
}
}
}
if(k2==0) //k2按下时加1
{
delayms(5);
if(k2==0)
{
while(!k2);
if(k1num==1) //光标在小时位
{ shi++;
if(shi==24)
shi=0;
}
if(k1num==2)
{
fen++;
if(fen==60)
fen=0;
}
if(k1num==3)
{
miao++;
if(miao==60)
miao=0;
}
}
}
/* if(k3==0) //k3按下时减1
{
delayms(5);
if(k3==0)
{
while(!k3);
if(k1num==1) //光标在小时位
{ shi--;
if(shi==-1)
shi=23;
}
if(k1num==2)
{
fen--;
if(fen==-1)
fen=59;
}
if(k1num==3)
{
miao--;
if(miao==-1)
miao=59;
}
}
} */
}
}
void main()
{
init(); //初始化
while(1)
{
if(aa==20)
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
miaoshi=miao/10; //取十位
miaoge=miao%10; //取个位
fenshi=fen/10;
fenge=fen%10;
shishi=shi/10;
shige=shi%10;
display(shishi,shige,fenshi,fenge,miaoshi,miaoge);
}
}
void timer_() interrupt 1 //定时器中断函数
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256; //定时50ms
aa++;
bb++;//用于闪烁
if(bb==20)
bb=0;
}
|