怎么用状态机做一个简单的秒表(实现按键按下启动在按下就暂停,还有长按清零),芯片是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在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 |