|
#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的數(shù)字碼
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) //延時(shí)函數(shù),數(shù)字是幾代表時(shí)延時(shí)少毫秒
{
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) //數(shù)碼管顯示函數(shù)
{
uchar temp=0x00,x1,x2,x3,x4,x5,x6;
while(aa!=20) //數(shù)碼管循環(huán)掃描
{
/////////////////////////////
if(k1num=1) //功能鍵按下 該為閃爍
{
x1=num1;
if(bb<10) //前500ms關(guān)閉第一個(gè)數(shù)碼管
num1=temp;
else //后500ms顯示第一個(gè)數(shù)碼管的數(shù)
num1=x1;
}
P0=duanma[num1]; //顯示小時(shí)的十位
duanxuan=1;
duanxuan=0;
P0=weima[1];
weixuan=1;
weixuan=0;
delayms(2);
/////////////////////////////////////
if(k1num=1)
{
x2=num2;
if(bb<10) //前500ms關(guān)閉第二個(gè)數(shù)碼管
num2=temp;
else //后500ms顯示第二個(gè)數(shù)碼管的數(shù)
num2=x2;
}
P0=duanma[num2]; //顯示小時(shí)的個(gè)位
duanxuan=1;
duanxuan=0;
P0=weima[2];
weixuan=1;
weixuan=0;
delayms(2);
/////////////////////////////////////////////////
P0=0X40; //在右數(shù)第三個(gè)數(shù)碼管輸出“——”符號(hào)
duanxuan=1;
duanxuan=0;
P0=weima[3];
weixuan=1;
weixuan=0;
delayms(2);
P0=0XFF;//清屏
////////////////////////////////////////
if(k1num=2)
{
x3=num3;
if(bb<10) //前500ms關(guān)閉第四個(gè)數(shù)碼管
num3=temp;
else //后500ms顯示第四個(gè)數(shù)碼管的數(shù)
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關(guān)閉第五個(gè)數(shù)碼管
num4=temp;
else //后500ms顯示第五個(gè)數(shù)碼管的數(shù)
num4=x4;
}
P0=duanma[num4]; //顯示分鐘的個(gè)位
duanxuan=1;
duanxuan=0;
P0=weima[5];
weixuan=1;
weixuan=0;
delayms(2);
///////////////////////////////////////
P0=0x40; //左數(shù)第6個(gè)數(shù)碼管輸出“——“ 符號(hào)
duanxuan=1;
duanxuan=0;
P0=weima[6];
weixuan=1;
weixuan=0;
delayms(2);
P0=0xff;//清屏
///////////////////////////////
if(k1num=3)
{
x5=num5;
if(bb<10) //前500ms關(guān)閉第七個(gè)數(shù)碼管
num5=temp;
else //后500ms顯示第七數(shù)個(gè)碼管的數(shù)
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關(guān)閉第八個(gè)數(shù)碼管
num6=temp;
else //后500ms顯示第八個(gè)數(shù)碼管的數(shù)
num6=x6;
}
P0=duanma[num6]; //顯示秒鐘的個(gè)位
duanxuan=1;
duanxuan=0;
P0=weima[8];
weixuan=1;
weixuan=0;
delayms(2);
}
}
void init() //中斷初始化函數(shù)
{
aa=0;
miao=0;
fen=10;
shi=18;
TMOD=0X01;
TH0=(65536-46080)/256; //晶振為11.05926MHZ 計(jì)50ms
TL0=(65536-46080)%256; //0.05s=(1/晶振)*12*計(jì)數(shù)值,解得計(jì)數(shù)值=46080
EA=1; //開(kāi)總中斷
ET0=1; //允許定時(shí)器0中斷
TR0=1; //定時(shí)器0開(kāi)始工作
}
/*void guanbiao(uchar k1num,uchar numx) //數(shù)碼管位閃爍函數(shù)
{
uchar k;
if(k==k1num) //功能鍵按下 該為閃爍
{
x1=num1;
if(bb<10) //前500ms關(guān)閉第一個(gè)數(shù)碼管
num1=temp;
else //后500ms顯示第一個(gè)數(shù)碼管的數(shù)
num1=x1;
}
} */
void scankey()
{
if(k1==0) //光標(biāo)指示
{
delayms(5);
if(k1==0) //延時(shí)去抖
{
while(!k1); //等待按鍵放開(kāi)
k1num=1; //指示在小時(shí)兩位
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按下時(shí)加1
{
delayms(5);
if(k2==0)
{
while(!k2);
if(k1num==1) //光標(biāo)在小時(shí)位
{ 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按下時(shí)減1
{
delayms(5);
if(k3==0)
{
while(!k3);
if(k1num==1) //光標(biāo)在小時(shí)位
{ 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; //取個(gè)位
fenshi=fen/10;
fenge=fen%10;
shishi=shi/10;
shige=shi%10;
display(shishi,shige,fenshi,fenge,miaoshi,miaoge);
}
}
void timer_() interrupt 1 //定時(shí)器中斷函數(shù)
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256; //定時(shí)50ms
aa++;
bb++;//用于閃爍
if(bb==20)
bb=0;
}
|
評(píng)分
-
查看全部評(píng)分
|