#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;
}
|