单片机c语言程序设计之10s的秒表(代码实例)
/* 名称:10s 的秒表
说明:首次按键计时开始,https://www.jiakang021.com再次按键暂停,第三次按键清零。
*/
#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; //按键次数(取值 0,1,2,3)
key_state=1; //按键状态
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 中断函数
void dsy_refresh() interrupt 1
{
th0=(65536-50000)/256; //恢复定时器 0 初值
tl0=(65536-50000)%256;
if(++i==2)
{
i=0;
second_counts++; //50ms*2=0.1s 转换状态
p0=dsy_code[second_counts/10];
p2=dsy_code[second_counts%10];
if(second_counts==100) second_counts=0; //满 100(10s)后显示 00
}
}
问天要地