#include <reg52.h>
#define uint unsigned int //數據類型宏定義,表示范圍從0~65535
#define uchar unsigned char //數據類型宏定義,表示值范圍從0~255
uchar aa, bb, cc;
uchar miao, fen, shi;
uchar a_1, a_2, a_3, a_4;
uchar num1, num2;
sbit a = P0 ^ 0;//定義管腳
sbit b = P0 ^ 1;//
sbit c = P0 ^ 2;//
sbit d = P0 ^ 3;//
sbit e = P0 ^ 4;//
sbit f = P0 ^ 5;//
sbit g = P0 ^ 6;//
sbit h = P0 ^ 7;//
sbit zuo_1 = P1 ^ 0;//定義管腳
sbit zuo_2 = P1 ^ 1;//
sbit zuo_3 = P1 ^ 2;//
sbit zuo_4 = P1 ^ 3;//
sbit s1 = P1 ^ 4;//定義按鍵
sbit s2 = P1 ^ 5;//
void chushihua();
void guanjiao(uchar n);
void yanshi(uint z);
void xianshi();
void jianpan();
void write_shi(uchar shu);
void write_fen(uchar shu);
void xiaodou();
void main()
{
chushihua();
for (;;)
{
if (miao == 60)
{
miao = 0; fen++;
}
write_fen(fen);
if (fen == 60)
{
fen = 0; shi++;
}
write_shi(shi);
if (shi == 24)
{
shi = 0;
}
}
jianpan();
xianshi();
}
void jianpan()//鍵盤掃描
{
if (s2 == 0) //判斷s2是否被摁下,如果是則進入if循環語句
{
xiaodou();
}
if (s2 == 0) //再次判斷s2是否被摁下
{
fen++;
}
if (s1 == 0) //判斷s1是否被摁下,如果是則進入if循環語句
{
xiaodou();
}
if (s1 == 0) //再次判斷s1是否被摁下
{
shi++;
}
}
void xianshi()//顯示函數
{
zuo_1 = 0;
guanjiao(a_1);
yanshi(2);
zuo_1 = 1;
guanjiao(11);
yanshi(1);
zuo_2 = 0;
guanjiao(a_2);
yanshi(2);
zuo_2 = 1;
guanjiao(11);
yanshi(1);
zuo_3 = 0;
guanjiao(a_3);
yanshi(2);
guanjiao(bb);
yanshi(2);
zuo_3 = 1;
guanjiao(11);
yanshi(1);
zuo_4 = 0;
guanjiao(a_4);
yanshi(2);
zuo_4 = 1;
guanjiao(11);
yanshi(1);
}
void chushihua()//初始化函數
{
TMOD = 0x01; //設定時器0為工作方式1
EA = 1; //開總中斷
ET0 = 1; //開定時器0中斷
TH0 = (65535 - 50000) / 256; //對定時器0
TL0 = (65535 - 50000) % 256; //賦予初值
TR0 = 1; //啟動定時器0
aa = 0, bb = 10, cc = 0, miao = 0, fen = 0, shi = 0;
zuo_1 = 1; zuo_2 = 1; zuo_3 = 1; zuo_4 = 1;
num1 = 0; num2 = 0;
}
void yanshi(uint z)//延時函數
{
uint x, y;
for (x = z; x>0; x--) //若for循環中數值為真,則維持循環,一旦為假,
for (y = 110; y>0; y--); //則退出循環語句,以此來達到延時的目的
}
void guanjiao(uchar n)//管腳顯示函數
{
switch (n)
{
case 0:a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; break;
case 1:b = 0; c = 0; break;
case 2:a = 0; b = 0; g = 0; e = 0; d = 0; break;
case 3:a = 0; b = 0; g = 0; c = 0; c = 0; d = 0; break;
case 4:f = 0; g = 0; b = 0; c = 0; break;
case 5:a = 0; f = 0; g = 0; c = 0; d = 0; break;
case 6:a = 0; f = 0; e = 0; d = 0; c = 0; g = 0; break;
case 7:a = 0; b = 0; c = 0; break;
case 8:a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; break;
case 9:a = 0; b = 0; c = 0; d = 0; f = 0; g = 0; break;
case 10:h = 0; break;
case 11:a = 1; b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; g = 1; f = 1; g = 1, h = 1; break;
case 12:h = 1; break;
}
}
void xiaodou()//消抖函數
{
uchar x;
for (x = 15; x > 0; x--) //若for循環中數值為真,則維持循環,一旦為假,則退出循環語句,以此來達到延時的目的
{
xianshi();
}
}
void write_shi(uchar shu)//寫小時函數
{
uchar shiwei, gewei; //定義十位和個位數據類型
shiwei = shu / 10; //將一個數進行十位和
gewei = shu % 10;//小時的拆分
a_4 = shiwei;
a_3 = gewei;
}
void write_fen(uchar shu)//寫分鐘函數
{
uchar shiwei, gewei; //定義十位和個位數據類型
shiwei = shu / 10; //將一個數進行十位和
gewei = shu % 10; //分鐘的拆分
a_2 = shiwei;
a_1 = gewei;
}
void timer()interrupt 1//中斷服務函數
{
TH0 = (65535 - 50000) / 256; // 對定時器0的高8位
TL0 = (65535 - 50000) % 256; //和低8位賦予初值
aa++; //定時器0每溢出一次aa的值加1,時間為50000*12/12M=0.05S
if (aa >= 10)
{
bb = 10, cc = 0;
if (aa == 20)
{
aa = 0; miao++; bb = 12, cc = 1;
}
}
}
|