使用stc89c52單片機,電路很簡單,采用八位共陽數(shù)碼管,p0口為數(shù)碼管的段選,p2口為位選. 通過key1-key3來調(diào)整時間
重點:
1、函數(shù)的模塊化
2、中斷
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p2_0=P2^0;
sbit p2_1=P2^1;
sbit p2_2=P2^2;
sbit p2_3=P2^3;
sbit p2_4=P2^4;
sbit p2_5=P2^5;
sbit p2_6=P2^6;
sbit p2_7=P2^7;
sbit key0=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit p17=P1^7;
uint t=0;
uint key=0;
uchar set=0;
uchar second=00,minter=55,hour=11;
uchar second_1,second_2,minter_1,minter_2,hour_1,hour_2;
const uchar tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf} ; //0~~9數(shù)碼表
void delay() //延時延時子程序
{ uint i;
for(i=0;i<240;i++);
}
void time_0(void) interrupt 1 using 0 //內(nèi)部定時器0內(nèi)部定時50ms
{
TH0=0x3c;
TL0=0xb0;
t++; // t是記定時次數(shù)
}
void display(uchar secondd,uchar minterr,uchar hourr) //顯示始終時間的子程序
{
second_1=secondd/10;
second_2=secondd%10;
minter_1=minterr/10;
minter_2=minterr%10;
hour_1=hourr/10;
hour_2=hourr%10;
P0=tab[second_2];
p2_0=0;
delay();
p2_0=1;
P0=tab[second_1];
p2_1=0;
delay();
p2_1=1;
p2_2=0;
P0=0xbf;
delay();
p2_2=1;
P0=tab[minter_2];
p2_3=0;
delay();
p2_3=1;
P0=tab[minter_1];
p2_4=0;
delay();
p2_4=1;
p2_5=0;
P0=0xbf;
delay(); //延時 是為了使— “——”顯示出來,否則時間太快,—
p2_5=1;
P0=tab[hour_2];
p2_6=0;
delay();
p2_6=1;
P0=tab[hour_1];
p2_7=0;
delay();
p2_7=1;
}
void time()
{
//定時1s的時間是否到?
if(t==19) //1s到,則加一秒
{ t=0;
second++;
if(second==60) // 是否為60秒 ,是秒清零,分加一秒,不到則跳出
{
second=0;
minter++;
if(minter==60) // 分是否為60分,是 ,分清零,時加一;不是則跳出
{ minter=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
display(second,minter,hour); //調(diào)用顯示函數(shù) 來顯示時間時間
}
uint scan_key() //調(diào)整時間 按鍵 掃描 函數(shù)
{ //延時
delay(); //判斷 如果按鍵 按key3下則返回1 來調(diào)用 調(diào)整時間函數(shù),不為零則返回0 不變不調(diào)整
if(key0==0)
set=1;
if(key0==1)
set=0;
return set;
}
void set_time() //調(diào)整時間函數(shù)
{ uchar m;
if(key1==0) delay(); //調(diào)整小時,確定key1健按下
if(key1==0) hour++; // x小時數(shù)遞增
if(hour==24) hour=0; //小時數(shù)到24,從零開始
for(m=0;m<20;m++) //循環(huán)20次
{ time(); //調(diào)用顯示函數(shù) 來顯示時間時間
}
if(key2==0) delay(); //調(diào)整分鐘
if(key2==0) minter++;
if(minter==60) minter=0;
delay();
time(); //調(diào)用時間函數(shù) 來顯示時間時間
if(key0==0)
time();
}
void main() //主函數(shù) 設定 內(nèi)部時間定時
{
TMOD=0X01;
TH0=0X10;
TL0=0X00;
EA=1;
ET0=1;
TR0=1;
P2=0xff;
while(1)
{
if(key0==0) // p判斷 調(diào)整時間的按鍵是否按下 即 是否需要 調(diào)整時間
{
p17=0;
delay();
delay();
delay();
p17=1;
delay();
delay();
key=scan_key();
}
switch(key)
{ //定時1s的時間是否到?
case 0: time(); break;
case 1: set_time();break;
default :break;
}
}
}