OpenEdv-开源电子网

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

【原子哥,各位大神!】想利用八段数码管做一个电子表

[复制链接]

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
发表于 2014-9-25 17:51:23 | 显示全部楼层 |阅读模式
5金钱
想利用八段数码管做一个电子表。
数码管一个有四片。
最后一片显示秒数。利用延时函数成功实现了,到9的时候,需要进位,想让倒数第二片数码管显示进位的数,但是问题出现了,按理第四片到9,第三片就应该变成1,然后第四片循环,直到下一次到9,第三片才变成2,以此类推。为什么我没有办法让第三片数码管停止在一个数不动,就是等到需要进位的时候第三片的状态完全跟第四片一样了!
[mw_shl_code=c,true] u8 const CharCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码表 //数码管显示 int main(void) { // u8 i; // u8 t; u8 a; //秒个位(第四片) u8 b; //秒十位(第三片) Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 SEG_Init(); //数码管初始化 SEG_DATAOUT(0); //取段码数据 KEY_Init(); /* 数码管第四片显示秒的个位数 */ b=0; for(a=1;;a++) { if(a==10) { delay_ms(1000); a=0; b=b+1; { SEG_DATAOUT(CharCode<<8); PC8=0; } { SEG_DATAOUT(CharCode[0]<<8); PC9=0; } } else if(a<=9) { delay_ms(1000); SEG_DATAOUT(CharCode[a]<<8); PC9=0; } }[/mw_shl_code]


最佳答案

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

楼主,你这完全没有做扫描。。。 能按你的思路显示才怪。 数码管显示,最简单就是做扫描,你开个定时器中断,让定时器不停的扫描4个数码管,输出不同的内容,注意,频率起码也要30Hz以上吧,也就是每秒要扫描30遍,否则会看到闪烁。 把数码馆扫描显示搞定了,你这个要求是分分钟就达到了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-25 17:51:24 | 显示全部楼层
楼主,你这完全没有做扫描。。。
能按你的思路显示才怪。
数码管显示,最简单就是做扫描,你开个定时器中断,让定时器不停的扫描4个数码管,输出不同的内容,注意,频率起码也要30Hz以上吧,也就是每秒要扫描30遍,否则会看到闪烁。
把数码馆扫描显示搞定了,你这个要求是分分钟就达到了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
 楼主| 发表于 2014-9-25 17:51:57 | 显示全部楼层
求助啊!!!!
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-9-25 19:10:52 | 显示全部楼层
逻辑好像不对
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

29

主题

340

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2013-12-17
在线时间
100 小时
发表于 2014-9-25 19:19:40 | 显示全部楼层
这最简单的吧,51上到处都是数码管程序,随便找一个一看就知道怎么写了,你写的程序有点乱啊。
就算有一天梦想成真,而你做好准备了吗?
回复

使用道具 举报

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
 楼主| 发表于 2014-9-25 19:25:41 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
老师 给讲讲呗。。。  就是进位的时候,两片数码管怎么显示不同的数字
回复

使用道具 举报

23

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-7-28
在线时间
4 小时
 楼主| 发表于 2014-9-25 19:26:31 | 显示全部楼层
回复【4楼】老虎的菜:
---------------------------------
51 的看不懂啊   你也是黑龙江的???  能给我讲一讲思路么,就是在进位的时候,怎么同时显示不同数字
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-9-26 12:48:47 | 显示全部楼层
回复【5楼】Mr_Head:
---------------------------------
同意原子哥答案,数码管就是扫描的,不扫描不行,好好想想肿么扫描吧,生么共阳、共阴的,让它显示数字再说
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

29

主题

340

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2013-12-17
在线时间
100 小时
发表于 2014-9-26 13:16:06 | 显示全部楼层
回复【6楼】Mr_Head:
---------------------------------
你这用中断好吗,就用延时 主函数啥都不用干了
就算有一天梦想成真,而你做好准备了吗?
回复

使用道具 举报

13

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-2-15
在线时间
0 小时
发表于 2014-9-26 13:18:24 | 显示全部楼层
这是数码管动态显示的内容吧,51这一章的原理看懂就明白问题在哪了
回复

使用道具 举报

2

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1884
金钱
1884
注册时间
2011-9-16
在线时间
423 小时
发表于 2014-9-27 22:14:13 | 显示全部楼层
以前玩过51的代码,参考下吧,其中P10,11,12是控制74HC138译码器的,这里可直接改为你COM端口



 #include<reg52.h>



#define uint unsigned int
#define uchar unsigned char
 sbit 10=P1^0;
sbit 11=P1^1;
sbit 12=P1^2;
sbit beep=P3^4;
sbit ir=P3^3;
sbit relay=P3^5;
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
display(uint ,uint ,uint ,uint );
delay(uint);
uchar flag;
uint a;
uint b;
uchar c=50;
void main()
{ TMOD=0X20;
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  SM0=0;
  SM1=1;
  REN=1;
  EA=1;
  ES=1;
while(1)
{display(a/1000,a%1000/100,a%100/10,a%10);
         b++;
if(flag==1)
{
ES=0;
flag=0;
SBUF=a+1;
while(!TI);
TI=0;
ES=1;}

     if(ir==0)
      c=50;
     if(ir==1)
      c=30;



 if(b==c) 
 {
  beep=!beep;
  b=0;
  a=a+1;
  if(a%10==0)
  relay=!relay;
 

 }
      
      
    
  }

}
void serail() interrupt 4
{a=SBUF-48;
flag=1;
 RI=0;
}
display(uint b,uint c,uint d,uint e)
{
     
P2=tabledu;
    10=0;
        11=0;
    12=1;
delay(10);

P2=tabledu[c];
     P10=1;
        11=0;
        12=1;
delay(10);
P2=tabledu[d];
     P10=0;
        11=1;
        12=1;
delay(10);
    P2=tabledu[e];
    P10=1;
        P11=1;
    P12=1;
   delay(10);
}
delay(uint x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=255;b>0;b--);
}
回复

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2014-4-9
在线时间
10 小时
发表于 2014-9-27 22:58:52 | 显示全部楼层
楼主先要明白这么驱动数码管“同一时间”只有1位亮的,四片快速轮着亮人眼才觉得是同时在亮,不能点一位然后延时1秒。
一般可以开1个1毫秒的定时器,这1毫秒显示第一片内容, 下一毫秒显示第二片内容,.......
或者用个for循环扫描
大海啊,全是水; 骏马啊,四条腿。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-6-14
在线时间
2 小时
发表于 2017-7-5 11:16:08 | 显示全部楼层
动态显示,利用人眼的视觉暂停特性,每一位端口输出几个毫秒的时间。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 02:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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