四個按鍵控制,可以實現暫停開始 加一 歸零
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit start=P2^7;
sbit stop=P2^6;
sbit plus_one=P2^5;
sbit resert=P2^4;
#define dpick P0
#define wpick P1
u16 num1=0; //1s的次數的計數值
u16 num60=0; //1min的次數的計數值
u16 zd_num=0; //進入中斷次數的計數值
//子函數
void delay(u16 num) //延時函數
{
u16 x,y;
for(x=num;x>0;x--)
for(y=110;y>0;y--)
{
;
}
}
u8 code table[]={0x3f,0x06 ,0x5b ,0x4f, 0x66, 0x6d, 0x7d ,0x07, 0x7f,
0x6f,0x77 ,0x7c, 0x39, 0x5e, 0x79, 0x71};
void Display(u16 a,u16 b,u16 c,u16 d) //定義顯示函數
{
dpick=table[a]; //秒的個位的段選
wpick=0x7f; //秒的個位的位選
delay(5);
dpick=table[b]; //秒的十位的段選
wpick=0xbf; //秒的十位的位選
delay(5);
dpick=table[c]+0x80; //分的個位的段選(帶小數點)
wpick=0xdf; //分的個位的位選
delay(5);
dpick=table[d]; //分的十位的段選
wpick=0xef; //分的十位的位選
delay(5);
}
void InitTimer0() //定時器初始化函數
{
TMOD=0x01; //選擇定時器0的工作方式1
TH0=(65535-50000) / 256; //計算初值 (定時50ms)
TL0=(65535-50000) % 256;
EA=1; //打開總中斷
ET0=1; //打開定時器中斷
TR0=0;
}
void TIMER0() interrupt 1 //定時器中斷服務函數
{
TH0=(65535-50000) / 256; //手動填充
TL0=(65535-50000) % 256;
zd_num++; //讓進入中斷次數值加1,用于判斷是否達到1s
}
//主函數
void main()
{
u16 s1,s10,min1,min10; //秒的個位,秒的十位,分的個位,分的十位
InitTimer0(); //初始化定時器
while(1)
{
if(start==0) //檢測啟動
{
delay(20);
if(start==0)
{
TR0=1; //定時器打開
while(!start);
}
}
if(stop==0) //檢測啟動
{
delay(20);
if(stop==0)
{
TR0=0; //定時器關閉
while(!stop);
}
}
if(plus_one==0)
{
delay(20);
if(plus_one==0)
{
zd_num=zd_num+20;
while(!plus_one);
}
}
if(resert==0)
{
delay(20);
if(resert==0)
{
zd_num=0;
TR0=0;
num1=0;
num60=0;
}
while(!resert);
}
if(zd_num>=20)
{
zd_num=0;
num1++;
if(num1>=60)
{
num1=0;
num60++;
if(num60>=60)
{
TR0=0;
num1=0;
num60=0;
zd_num=0;
}
}
}
s1=num1%10; //從秒的計數值里面分離秒的個位
s10=num1/10; //從秒的計數值里面分離秒的十位
min1=num60%10; //從分的計數值里面分離分的個位
min10=num60/10; //從分的計數值里面分離分的十位
Display(s1,s10,min1,min10); //顯示
}
}
|