怎么用状态机做一个简单的秒表(实现按键按下启动在按下就暂停,还有长按清零),芯片是stm32, 我的主要程序和思路如下:
可以参考一下我的:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
//端口定义
sbit key=P2^7; //按键
//全局变量定义
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0~f段码
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar data dis_buf[6]; //显示缓存
uchar Cnt250us=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//计时变量
bit stop=0; //停止标志
/***********按键扫描程序****************/
void keyscan()
{
static uint count1=0; //计数变量
static bit key_sign=0; //按键自锁标志
if(!key) //检测按键为0
{
count1++; //计数延时消抖
if(count1>40 && key_sign==0)//消抖
key_sign=1; //按键自锁标志置1,防止重复响应
if(count1==2000) //长按0.5秒
{
count1=2001;
Cnt250us=0;
Cnt10ms=0;
Cnt1s=0;
Cnt1min=0;
stop=0;
}
}
else
{
if(count1<2000&&key_sign==1)//短按
{
stop=~stop;
}
count1=0; //计数变量清0
key_sign=0; //按键自锁标志清0
}
}
/***********定时器初始化程序****************/
void Timer0Init() //250微秒@12.000MHz
{
TMOD |= 0x02; //设置定时器模式
TL0 = 0x06; //设置定时初值
TH0 = 0x06; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/***********共阴数码管显示程序****************/
void display()
{
static uchar i=0; //计数变量
P0=0x00;//消隐
P2&=0xc0;//清低6位
P2|=~(0x01<<i);//送位码
P0=dis_buf[i];//送段码
i++;
i%=6;
}
/***************主程序****************/
void main()
{
Timer0Init(); //定时器初始化
while(1)
{
if(TF0)
{
TF0=0; //清除TF0标志
Cnt250us++; //中断变量Cntus自+1
if(Cnt250us>=40) //10ms
{
Cnt250us=0; //清0
if(stop==1) //启动
Cnt10ms++; //10毫秒计数
if(Cnt10ms>=100)
{
Cnt10ms=0;
Cnt1s++; //秒计数
}
if(Cnt1s>=60)
{
Cnt1s=0;
Cnt1min++; //分计数
if(Cnt1min>=100)
Cnt1min=0;
}
}
keyscan(); //按键扫描
//数据分解放入显示缓存
dis_buf[0]=table[Cnt1min/10];
dis_buf[1]=table[Cnt1min%10]|0x80;//加点
dis_buf[2]=table[Cnt1s/10];
dis_buf[3]=table[Cnt1s%10]|0x80;//加点
dis_buf[4]=table[Cnt10ms/10];
dis_buf[5]=table[Cnt10ms%10];
display(); //显示程序
}
}
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |