|
#include<reg51.h> // 包含51單片機(jī)寄存器定義的頭文件
unsigned char Tab[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char port[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char int_time ; //中斷次數(shù)計(jì)數(shù)變量
unsigned char second; //秒計(jì)數(shù)變量
unsigned char minute; //分鐘計(jì)數(shù)變量
unsigned char hour=12; //小時(shí)計(jì)數(shù)變量
unsigned char funtion_flag=0;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
void delay(void) //延時(shí)函數(shù),延時(shí)約0.6ms
{ unsigned char j;
for(j=0;j<180;j++);
}
/*延時(shí)程序*/
void delay_ms(unsigned int z)
{ unsigned int i,j;
for(i=0; i<z; i++)
for(j = 0; j < 110; j++);
}
/***********************************
函數(shù)功能:顯示秒的子程序 入口參數(shù):s
************************************/
void DisplaySecond(unsigned char s)
{ P2=port[6]; //P2.6引腳輸出低電平, DS6點(diǎn)亮
P0=Tab[s/10]; //顯示十位
delay(); delay(); delay();
P2=port[7]; //P2.7引腳輸出低電平, DS7點(diǎn)亮
P0=Tab[s%10]; //顯示個(gè)位
delay(); delay(); delay();
P2=0xff; //關(guān)閉所有數(shù)碼管
P0=0xff;
delay(); delay(); delay();
}
/**************************************
函數(shù)功能:顯示分鐘的子程序 入口參數(shù):m
***************************************/
void DisplayMinute(unsigned char m)
{ P2=port[3]; // P2.3引腳輸出低電平, DS3點(diǎn)亮
P0=Tab[m/10];//顯示個(gè)位
delay(); delay(); delay();
P2=port[4]; // P2.4引腳輸出低電平, DS4點(diǎn)亮
P0=Tab[m%10];
delay(); delay(); delay();
P2=port[5]; //P2.5引腳輸出低電平, DS5點(diǎn)亮
P0=0x40; //分隔符“-”的段碼
delay(); delay(); delay();
P2=0xff; //關(guān)閉所有數(shù)碼管
P0=0xff;
delay(); delay(); delay();
}
/**************************************
函數(shù)功能:顯示小時(shí)的子程序 入口參數(shù):h
***************************************/
void DisplayHour(unsigned char h)
{ P2=port[0]; //P2.0引腳輸出低電平, DS0點(diǎn)亮
P0=Tab[h/10]; //顯示十位
delay(); delay(); delay();
P2=port[1]; //P2.1引腳輸出低電平, DS1點(diǎn)亮
P0=Tab[h%10]; //顯示個(gè)位
delay(); delay(); delay();
P2=port[2]; //P2.2引腳輸出低電平, DS2點(diǎn)亮
P0=0x40; //分隔符“-”的段碼
delay(); delay(); delay();
P2=0xff; //關(guān)閉所有數(shù)碼管
P0=0xff;
delay(); delay(); delay();
}
void Key_Scanf(void)
{
if(KEY1==0)
{ delay_ms(10);
if(funtion_flag==0)
{ funtion_flag=1;
while(KEY1==0);
}
}
if(KEY1==0)
{ delay_ms(10);
if(KEY1==0)
{ if(funtion_flag==1)
{ funtion_flag=2;
while(KEY1==0);
}
}
}
if(KEY1==0)
{ delay_ms(10);
if(KEY1==0)
{
if(funtion_flag==2)
{ funtion_flag=3;
while(KEY1==0);
}
}
}
if(KEY1==0)
{ delay_ms(10);
if(KEY1==0)
{ if(funtion_flag==3)
{
funtion_flag=0;
while(KEY1==0);
}
}
}
if(funtion_flag==1) //小時(shí)調(diào)整
{ if(KEY2==0)
{ delay_ms(10);
hour++;
}
if(KEY3==0)
{ delay_ms(10);
if(KEY3==0)
{ hour--;
}
}
}
if(funtion_flag==2) //分鐘調(diào)整
{ if(KEY2==0)
{ delay_ms(10);
if(KEY2==0)
{ minute++;
}
}
if(KEY3==0)
{ delay_ms(10);
if(KEY3==0)
{ minute--;
}
}
}
if(funtion_flag==3) //秒調(diào)整
{ if(KEY2==0)
{ delay_ms(10);
if(KEY2==0)
{ second++;
}
}
if(KEY3==0)
{ delay_ms(10);
if(KEY3==0)
{ second--;
}
}
}
}
/********* 主函數(shù) ***************/
void main(void)
{
unsigned int i;
while(KEY4!=0);
TMOD=0x01; //使用定時(shí)器T0
EA=1; //開中斷總允許
ET0=1; //允許T0中斷
TH0=(65536-46083)/256; //定時(shí)器高八位賦初值
TL0=(65536-46083)%256; //定時(shí)器低八位賦初值
TR0=1;
int_time=0; //中斷計(jì)數(shù)變量初始化
second=0; //秒計(jì)數(shù)變量初始化
minute=0; //分鐘計(jì)數(shù)變量初始化
hour=12; //小時(shí)計(jì)數(shù)變量初始化
while(1)
{ while(funtion_flag==0) //無按鍵按下時(shí)顯示
{ DisplaySecond(second); //調(diào)用秒顯示子程序
delay();
DisplayMinute(minute); //調(diào)用分鐘顯示子程序
delay();
DisplayHour(hour);
delay();
Key_Scanf();
}
while(funtion_flag==1) //小時(shí)閃爍
{ DisplayHour(hour); //調(diào)用時(shí)顯示子程序
delay();
for(i=0;i<3;i++)
{ DisplaySecond(second); //調(diào)用秒顯示子程序
delay();
DisplayMinute(minute); //調(diào)用分鐘顯示子程序
delay();
}
Key_Scanf();
}
while(funtion_flag==2) //分閃爍
{ DisplayMinute(minute); //調(diào)用分顯示子程序
delay();
for(i=0;i<3;i++)
{ DisplaySecond(second); //調(diào)用秒鐘顯示子程序
delay();
DisplayHour(hour);
delay();
}
Key_Scanf();
}
while(funtion_flag==3) //秒閃爍
{ DisplaySecond(second); //調(diào)用秒顯示子程序
delay();
for(i=0;i<3;i++)
{ DisplayMinute(minute); //調(diào)用分鐘顯示子程序
delay();
DisplayHour(hour);
delay();
}
Key_Scanf();
}
Key_Scanf();
}
}
/***** 函數(shù)功能:定時(shí)器T0的中斷服務(wù)子程序 *****/
void interserve(void ) interrupt 1 using 1 //調(diào)用定時(shí)器0
{ int_time++;
if(int_time==20)
{ int_time=0; //中斷計(jì)數(shù)變量清0
second++; //秒計(jì)數(shù)變量加1
}
if(second==60)
{ second=0; //如果秒計(jì)滿60,將秒計(jì)數(shù)變量清0
minute++; //分鐘計(jì)數(shù)變量加1
}
if(minute==60)
{ minute=0; //如果分鐘計(jì)滿60,將分鐘計(jì)數(shù)變量清0
hour++; //小時(shí)計(jì)數(shù)變量加1
}
if(hour==24)
{ hour=0; //如果小時(shí)計(jì)滿24,將小時(shí)計(jì)數(shù)變量清0
}
TH0=(65536-46083)/256; //定時(shí)器重新賦初值
TL0=(65536-46083)%256;
}
|
|