OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4711|回复: 13

在51和STM32单片机上使用面向对象的编程,第三篇:状态机,按键控制开灯关灯也能爆炸

[复制链接]

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
发表于 2018-5-5 20:59:44 | 显示全部楼层 |阅读模式
本帖最后由 safu枫 于 2018-5-9 17:29 编辑

请问大家如何使用按键控制一盏灯的开关?是这样吗?
[mw_shl_code=c,true]if(灯为关)
{
   打开灯;
}
else if(灯为开)
{
   关闭灯;
}[/mw_shl_code]

那如果我要在有人且灯为关的 要爆炸呢?
[mw_shl_code=c,true]if(灯为关 && 有人)
{
    爆炸;
}
else if(灯为关)
{
打开灯;
}
else if(灯为开)
{
关闭灯;
}[/mw_shl_code]

那如果。。。够了,草泥马,一次说清楚。。。。(标志位这么多,判断分支这么多。。。。

不要急,我们现在使用状态机,不管客户需求怎么变,我们都能轻松应对,逻辑清楚
这篇得概念还是 抽象化
首先我们声明一个状态表结构体,并定义一个实时状态
[mw_shl_code=c,true]typedef struct Status
{
  void (* key_handle)();   //按键处理函数
}typ_Status;
typ_Status Status = Status_Close ;//初始状态为 关灯状态
[/mw_shl_code]

然后定义3种状态,然后编写对应三种状态下的按键处理函数
[mw_shl_code=c,true]typ_Status Status_Open =
{
close_led;
};
typ_Status Status_Close =
{
open_led;
};
typ_Status Status_CloseAndMan = //灯为关且有人
{
boom;//爆炸  
};[/mw_shl_code]

接下来编写具体的函数

[mw_shl_code=c,true]void close_led()
{
关闭灯;
Status = &Status_Close; //切换状态
}
void open_led()
{
打开灯;
Status = &Status_Open ; //切换状态
}
void boom()
{
爆炸;
爆炸了一切状态结束 GameOver;
}[/mw_shl_code]

[mw_shl_code=c,true]if(按下按键)
{
   Status .key_handle();  //根据当前状态自动调用按键处理,所以无论怎么样的逻辑都是调用这一个接口,这里不用变动。。是不是很方便啊
}[/mw_shl_code]


这里的爆炸的代码我先不写,要用到状态组合,我晚点更新吧。。

状态机.rar

5.72 MB, 下载次数: 291

第三篇

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2014-8-18
在线时间
43 小时
发表于 2018-5-9 15:18:22 | 显示全部楼层
关于STM32状态机的编程学习,可有什么推荐的?书或者网站啥的,非常感谢,Q:649025276
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-9 16:21:30 | 显示全部楼层
marcus 发表于 2018-5-9 15:18
关于STM32状态机的编程学习,可有什么推荐的?书或者网站啥的,非常感谢,Q:649025276

《C现代编程》 你加我QQ吧 627534198 有什么问题可以随时交流
回复 支持 反对

使用道具 举报

27

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-31
在线时间
252 小时
发表于 2018-5-26 14:22:02 | 显示全部楼层
顶一个,不过面向对象的话,keil可以直接用C++写啊
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-27 17:23:27 | 显示全部楼层
宫本无三四 发表于 2018-5-26 14:22
顶一个,不过面向对象的话,keil可以直接用C++写啊

KEIL4  51 系列单片机不支持吧?
回复 支持 反对

使用道具 举报

27

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-31
在线时间
252 小时
发表于 2018-5-28 09:42:02 | 显示全部楼层
safu枫 发表于 2018-5-27 17:23
KEIL4  51 系列单片机不支持吧?

这个不清楚,好久没用51了
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2018-5-28
在线时间
126 小时
发表于 2018-5-28 20:14:22 | 显示全部楼层
楼主好,状态机的代码好像不太对
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-29 10:12:32 | 显示全部楼层
Saul 发表于 2018-5-28 20:14
楼主好,状态机的代码好像不太对

哪里的不对呢?请指出
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2018-5-28
在线时间
126 小时
发表于 2018-5-30 09:44:57 | 显示全部楼层
safu枫 发表于 2018-5-29 10:12
哪里的不对呢?请指出

我的意思是这篇跟第二篇"强大的按键能爆炸"代码一样
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-30 10:27:16 | 显示全部楼层
Saul 发表于 2018-5-30 09:44
我的意思是这篇跟第二篇"强大的按键能爆炸"代码一样

不可能一样把,你看工程里面有一个 status.c的文件
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2018-5-28
在线时间
126 小时
发表于 2018-5-30 10:35:35 | 显示全部楼层
本帖最后由 Saul 于 2018-5-30 10:38 编辑
safu枫 发表于 2018-5-30 10:27
不可能一样把,你看工程里面有一个 status.c的文件

status只是一个文件,但是没有调用
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-30 10:48:22 | 显示全部楼层
Saul 发表于 2018-5-30 10:35
status只是一个文件,但是没有调用

key.c里面调用了 ,你 下到 开发板上试试
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-30 10:49:34 | 显示全部楼层
Saul 发表于 2018-5-30 10:35
status只是一个文件,但是没有调用

工程里面有一个 说明 PDF 你看一下
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2018-5-28
在线时间
126 小时
发表于 2018-5-30 10:50:55 | 显示全部楼层
safu枫 发表于 2018-5-30 10:48
key.c里面调用了 ,你 下到 开发板上试试

看到了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表