單片機C語言程序設(shè)計:10s 的秒表
/* 名稱:10s 的秒表
說明:首次按鍵計時開始,再次按鍵暫停,第三次按鍵清零。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^7;
uchar
i,Second_Counts,Key_Flag_Idx;
bit Key_State;
uchar
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延時
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//處理按鍵事件
void Key_Event_Handle()
{
if(Key_State==0)
{
Key_Flag_Idx=(Key_Flag_Idx+1)%3;
switch(Key_Flag_Idx)
{
case 1:EA=1;ET0=1;TR0=1;break;
case 2:EA=0;ET0=0;TR0=0;break;
case 0:P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
}
}
}
//主程序
void main()
{
P0=0x3f; //顯示 00
P2=0x3f;
i=0;
Second_Counts=0;
Key_Flag_Idx=0; //按鍵次數(shù)(取值 0,1,2,3)
Key_State=1; //按鍵狀態(tài)
TMOD=0x01; //定時器 0 方式 1
TH0=(65536-50000)/256; //定時器 0:15ms
TL0=(65536-50000)%256;
while(1)
{
if(Key_State!=K1)
{
DelayMS(10);
Key_State=K1;
Key_Event_Handle();
}
}
}
/T0 中斷函數(shù)
void DSY_Refresh() interrupt 1
{
TH0=(65536-50000)/256; //恢復(fù)定時器 0 初值
TL0=(65536-50000)%256;
if(++i==2)
{
i=0;
Second_Counts++; //50ms*2=0.1s 轉(zhuǎn)換狀態(tài)
P0=DSY_CODE[Second_Counts/10];
P2=DSY_CODE[Second_Counts%10];
if(Second_Counts==100) Second_Counts=0; //滿 100(10s)后顯示 00
}
}
擴展閱讀:TIMER0與TIMER1控制條形LED