OpenEdv-开源电子网

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

【原子哥,大神们】stm32的数码管时钟

[复制链接]

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
发表于 2014-9-26 14:09:23 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include <stm32f10x_lib.h> #include "sys.h" #include "usart.h" #include "delay.h" #include "seg.h" #include "key.h" u8 const CharCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码表 //数码管显示 int main(void) { int i; int a; int m,q,p,n; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 SEG_Init(); //数码管初始化 SEG_DATAOUT(0); //取段码数据 KEY_Init(); while(1) { for(i=1;i<=3600;i++) { n=i%3600; m=n/60; //此处m相当于显示分钟位 q=m%10; //q相当于显示分钟数个位 m=m/10; //此处m相当于显示分钟数十位 p=i%60; //p相当于显示秒数十位 p=p/10; n=n%10; //n相当于显示秒数个位 delay_ms(1000); //printf("%d,%d,%d,%d,%d\n",i,m,q,p,n); for (a=0;a<=3;a++) { if(a==0) { SEG_DATAOUT(CharCode[m]<<8); PC6=0; PC7=1; PC8=1; PC9=1; } else if(a==1) { SEG_DATAOUT(CharCode[q]<<8); PC6=1; PC7=0; PC8=1; PC9=1; } else if(a==2) { SEG_DATAOUT(CharCode[p]<<8); PC6=1; PC7=1; PC8=0; PC9=1; } else if(a==3) { SEG_DATAOUT(CharCode[n]<<8); PC6=1; PC7=1; PC8=1; PC9=0; } delay_ms(3); } } } } [/mw_shl_code]
这是我根据昨天向大神们请教以后写出来的代码
为什么烧写到板子里,数码管能正常显示数字,但是一闪一闪的,只能看清最后一位的数字是几,其余位的闪的太快,看不清!怎么破!

最佳答案

查看完整内容[请看2#楼]

扫描完所有的数码管不能大于16ms,否则能感觉到闪了,这是常识,4个数码管一个停留时间不能超过4ms,你可以在循环开头delay 1MS,后面以这个时间来变量计数实现你要的delay,这样,数码管也扫描了,你要的1S时间也出来了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-26 14:09:24 | 显示全部楼层
扫描完所有的数码管不能大于16ms,否则能感觉到闪了,这是常识,4个数码管一个停留时间不能超过4ms,你可以在循环开头delay 1MS,后面以这个时间来变量计数实现你要的delay,这样,数码管也扫描了,你要的1S时间也出来了。
回复

使用道具 举报

29

主题

340

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2013-12-17
在线时间
100 小时
发表于 2014-9-26 14:29:02 | 显示全部楼层
第一你用延时1000ms,这个不靠谱,得用定时器中断做,第二你那个ifa=的东西都去掉把for(a=0)的也去掉,直接写下去就行
就算有一天梦想成真,而你做好准备了吗?
回复

使用道具 举报

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
 楼主| 发表于 2014-9-26 17:29:19 | 显示全部楼层
回复【2楼】老虎的菜:
---------------------------------
延时1000ms的意思就是 我想每隔1s  i就增加1,因为我做的是时钟啊。。
第二个。。没懂你啥意思。。可否解释解释
回复

使用道具 举报

29

主题

340

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2013-12-17
在线时间
100 小时
发表于 2014-9-26 19:13:47 | 显示全部楼层
是的,可是你这没做 就是mcu什么都不用干了 就在延时上耗着了,用中断的好处就是,mcu可以干别的事情,中断来了就加1就行,你直接写显示秒分时就行了,为什么还要加那些东西呢?不罗嗦吗。a=0显示秒的个位数 a=1显示秒的十位数。你直接按顺序写下来不就行了嘛,要那些a有什么用呢
就算有一天梦想成真,而你做好准备了吗?
回复

使用道具 举报

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
 楼主| 发表于 2014-9-26 20:21:31 | 显示全部楼层
回复【3楼】TinyBoy:
---------------------------------
谢谢你!!非常感谢 你解决了我的困惑!!!!!大赞你!!!
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-28 08:07:51 | 显示全部楼层
回复【6楼】Mr_Head:
---------------------------------
用直接delay的方式弄出来了,你就可以用定时器来扫描了,这样每次扫描的时间一定是相同的,就不会有任何闪烁了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 21:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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