OpenEdv-开源电子网

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

我按照定时中断方式,做了一个按键扫描,及数码管显示的程序。框架如下,希望各位大牛拍砖!!!

[复制链接]

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
发表于 2018-5-25 14:47:27 | 显示全部楼层 |阅读模式
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
                       
                        TIM3_it_count++;

                        //加入数码管显示程序

                        if(!(TIM3_it_count%20))   //0.5mS进一次中断,需要0.5*20=10ms执行一次该程序
                                {
                                        KEY_set_ctr();          //按键控制程序       
                                        KEY_up_ctr();          //       
                                        KEY_down_ctr();          //
                                        KEY_lift_ctr();          //
                                }
                        if(!(TIM3_it_count%40))   //0.5mS进一次中断,需要0.5*40=20ms执行一次该程序
                                {
                                    //其他功能函数
                                }
                        if(!(TIM3_it_count%100))   //0.5mS进一次中断,需要0.5*100=50ms执行一次该程序
                                {
                                        BEEP=1;  //50MS,关一次蜂鸣器

                                }
                        if(!(TIM3_it_count%200))   //0.5mS进一次中断,需要0.5*200=100ms执行一次该程序
                                {
                                   //其他功能函数
                                }
                        if(!(TIM3_it_count%1000))   //0.5mS进一次中断,需要0.5*1000=5s执行一次该程序
                                {
                                    //其他功能函数
                                }                               
                }
}

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

使用道具 举报

36

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2014-6-4
在线时间
89 小时
发表于 2018-5-26 11:01:22 | 显示全部楼层
你这个代码,一看就是网上抄的,据说很牛逼的代码,不要反感别人给你的意见,好好看看我说的那几个名词,几年后再回过头看看我说的是啥
一路狂奔!
回复 支持 0 反对 1

使用道具 举报

36

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2014-6-4
在线时间
89 小时
发表于 2018-5-25 14:56:52 | 显示全部楼层
你这个也算是框架,一板砖拍死你,多看看别人的代码,看看什么是软时钟,什么是状态机,什么是消息池,什么是事件
框架 定时器中断,定时时间基准, 特定的软时钟任务扫描按键,按键使用状态机实现,模块从上到下,独立封装,什么乱七八糟的定时器逻辑业务,使用软时钟可以搞定。
软时钟可以搞硬的也可以搞软的。你能看懂多少?
一路狂奔!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4867
金钱
4867
注册时间
2017-7-6
在线时间
718 小时
发表于 2018-5-25 15:07:47 | 显示全部楼层
厉害啦 大佬  数码管啥的都放中断 牛
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
 楼主| 发表于 2018-5-25 15:15:13 | 显示全部楼层
南帝 发表于 2018-5-25 14:56
你这个也算是框架,一板砖拍死你,多看看别人的代码,看看什么是软时钟,什么是状态机,什么是消息池,什么 ...

正在学习摸索。所以需要大佬指导,谢谢
回复 支持 反对

使用道具 举报

3

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2017-7-25
在线时间
188 小时
发表于 2018-5-25 15:54:02 | 显示全部楼层
一般是中断中置标志,主程序中判断标志后处理吧
耗时的一般不放中断中处理
回复 支持 反对

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2018-5-25 16:16:22 | 显示全部楼层
除法尽量不要放中断里面,如果非要实现类似的效果,可以用多变量累加的方法
另外耗时间的任务可以放到主循环里,用标志位同步
回复 支持 反对

使用道具 举报

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
 楼主| 发表于 2018-5-25 16:30:06 | 显示全部楼层
xianshasaman 发表于 2018-5-25 16:16
除法尽量不要放中断里面,如果非要实现类似的效果,可以用多变量累加的方法
另外耗时间的任务可以放到主循 ...

谢谢
回复 支持 反对

使用道具 举报

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
 楼主| 发表于 2018-5-26 08:16:52 | 显示全部楼层
南帝 发表于 2018-5-25 14:56
你这个也算是框架,一板砖拍死你,多看看别人的代码,看看什么是软时钟,什么是状态机,什么是消息池,什么 ...

void KEY_scan(void)
{         
        u16 KEY_numb=GPIO_ReadInputData(GPIOB);  //读端口GPIOB输入        
        KEY_numb=KEY_numb&0xf000;    //只保留PB12-PB15状态值
        //当PB12按下时 KEY_numb=0xe000
        //当PB13按下时 KEY_numb=0xd000
        //当PB14按下时 KEY_numb=0xb000
        //当PB15按下时 KEY_numb=0x7000

        KEY_numb = KEY_numb^0xf000;    //异或GPIOB高4位,                  
        KEY_Trg  = KEY_numb&(KEY_numb^KEY_Cont);  //KEY_Trg标记了按键按一次的键值   
        KEY_Cont = KEY_numb;                      //KEY_Cont断是否为连续按下      
               
}
求指导,我这样对不对
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-6-12
在线时间
22 小时
发表于 2018-5-26 11:29:20 | 显示全部楼层
TIM3_it_count你这个变量要清零呀,什么类型的?
回复 支持 反对

使用道具 举报

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
 楼主| 发表于 2018-5-29 12:53:17 | 显示全部楼层
Knight_2015 发表于 2018-5-26 11:29
TIM3_it_count你这个变量要清零呀,什么类型的?

嗯,在别的地方清零
回复 支持 反对

使用道具 举报

62

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-11-15
在线时间
85 小时
发表于 2018-6-16 00:49:12 | 显示全部楼层
南帝 发表于 2018-5-25 14:56
你这个也算是框架,一板砖拍死你,多看看别人的代码,看看什么是软时钟,什么是状态机,什么是消息池,什么 ...

老哥  ,你说的这几个术语我从网上没有找到资料  ,可否指点  
回复 支持 反对

使用道具 举报

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
 楼主| 发表于 2020-12-28 09:21:25 | 显示全部楼层
xianshasaman 发表于 2018-5-25 16:16
除法尽量不要放中断里面,如果非要实现类似的效果,可以用多变量累加的方法
另外耗时间的任务可以放到主循 ...

非常感谢
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-11-13
在线时间
4 小时
发表于 2021-1-6 15:30:20 | 显示全部楼层
我看的懂,觉得少很多东西
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2021-1-6 15:47:04 | 显示全部楼层
能查询完成的,就不用中断来完成.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 03:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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