1546233990614.jpg (4.13 MB, 下載次數: 49)
下載附件
2018-12-31 13:30 上傳
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint yi,er,si,wu,qi,ba;//數碼管所顯示的位置
uint num, b; k;//時分秒
uint num1;//定時器參數
uchar code table1[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x40};//0到9和G數組
sbit dula=P2^6;//段選
sbit wela=P2^7;//位選
sbit s1=P3^0;//按鍵
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
void delay(uint z)//ms延時函數
{
uint i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}
void key()
{
if(s1==0)
{
delay(20);
if(s1==0)
b++;
while(!s1);
}
if(s2==0)
{
delay(20);
if(s2==0)
k++;
while(!s2);
}
if(s3==0)
{
delay(20);
if(s2==0)
num1++;
while(!s3);
}
if(s4==0)
{
delay(20);
if(s4==0)
{ b=0;k=0;num1=0; }
while(!s4);
}
}
void display(uchar yi, uchar er, uchar si,uchar wu,uchar qi,uchar ba)
{
//第一位數碼管
P0=0XFF;
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table1[yi];
dula=0;
delay(1);
//第二位數碼管
P0=0XFF;
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table1[er];
dula=0;
delay(1);
//第三位數碼管,橫杠
P0=0XFF;
wela=1;
P0=0xfb;
wela=0;
dula=1;
P0=table1[10];
dula=0;
delay(1);
//第四位數碼管
P0=0XFF;
wela=1;
P0=0xf7;
wela=0;
dula=1;
P0=table1[si];
dula=0;
delay(1);
//第五位數碼管
P0=0XFF;
wela=1;
P0=0xef;
wela=0;
dula=1;
P0=table1[wu];
dula=0;
delay(1);
//第六位數碼管,橫杠
P0=0XFF;
wela=1;
P0=0xdf;
wela=0;
dula=1;
P0=table1[10];
dula=0;
delay(1);
//第七位數碼管
P0=0XFF;
wela=1;
P0=0xbf;
wela=0;
dula=1;
P0=table1[qi];
dula=0;
delay(1);
//第八位數碼管
P0=0XFF;
wela=1;
P0=0x7f;
wela=0;
dula=1;
P0=table1[ba];
dula=0;
delay(1);
}
//主函數
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;
while(1)//等待中斷
{
key();
display(yi,er,si,wu,qi,ba);
}
}
void T0_time()interrupt 1{
TH0=(65536-46083)/256; //重裝初值
TL0=(65536-46083)%256; //50ms
num++;
if(num==20)//當num到達20次是為1000ms也就是1s
{
num=0; //清零
num1++;//秒自加
if(num1==60)//當num1到達60次是為60s也就是1分鐘
{
num1=0;//清零
k++;//分自加
}
if(k==60)//當k到達60次是為60分鐘也就是1小時
{
k=0;//清零
b++;//時自加
}
if(b==24)//當k到達24次是為24小時
{
b=0;//此時為00點
}
yi=b/10;//求模運算
er=b%10;//求余運算
si=k/10;
wu=k%10;
qi=num1/10;
ba=num1%10;
}
}
|