打印

数码管显示函数不稳定,不知道是怎么回事?

[复制链接]
3210|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
areshan|  楼主 | 2010-10-11 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void display_point(float data)
{
  uchar a=0,b=0,c=0,d=0,e=0,f=0,g=0;
  a=(int)data/1000; //千位
  b=((int)data%1000)/100;//百位
  c=((int)data%100)/10;//十位
  d=(int)data%10;//个位
  e=(int)(data*10.0)%10;//1位小数
  f=(int)(data*100.0)%10;//2位小数
  g=(int)(data*1000.0)%10;//3位小数
  if(a!=0)
{
  PORTB=num[a];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD5);//关闭百十个片选
  PORTD&=~(1<<PD4);//打开千位片选
  delay(100);
  PORTB=num[10];
  PORTB=num[b];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD4);
  PORTD&=~(1<<PD5);
  delay(100);
  PORTB=num[10];
  PORTB=num[c];
  PORTD|=(1<<PD7)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD6);
  delay(100);
  PORTB=num[10];
  PORTB=num[d];
  PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD7);
  delay(100);
  PORTB=num[10];
}
else if(b!=0)
{
  PORTB=num[b];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD5);//关闭百十个片选
  PORTD&=~(1<<PD4);//打开千位片选
  delay(100);
  PORTB=num[10];
  PORTB=num[c];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD4);
  PORTD&=~(1<<PD5);
  delay(100);
  PORTB=num[10];
  PORTB=numdot[d];
  PORTD|=(1<<PD7)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD6);
  delay(100);
  PORTB=num[10];
  PORTB=num[e];
  PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD7);
  delay(100);
  PORTB=num[10];
  }
else if(c!=0)
{
  PORTB=num[c];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD5);//关闭百十个片选
  PORTD&=~(1<<PD4);//打开千位片选
  delay(100);
  PORTB=num[10];
  PORTB=numdot[d];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD4);
  PORTD&=~(1<<PD5);
  delay(100);
  PORTB=num[10];
  PORTB=num[e];
  PORTD|=(1<<PD7)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD6);
  delay(100);
  PORTB=num[10];
  PORTB=num[f];
  PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD7);
  delay(100);
  PORTB=num[10];
  }
else
{
  PORTB=numdot[d];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD5);//关闭百十个片选
  PORTD&=~(1<<PD4);//打开千位片选
  delay(100);
  PORTB=num[10];
  PORTB=num[e];
  PORTD|=(1<<PD7)|(1<<PD6)|(1<<PD4);
  PORTD&=~(1<<PD5);
  delay(100);
  PORTB=num[10];
  PORTB=num[f];
  PORTD|=(1<<PD7)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD6);
  delay(100);
  PORTB=num[10];
  PORTB=num[g];
  PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD4);
  PORTD&=~(1<<PD7);
  delay(100);
  PORTB=num[10];
  }
}

请大家帮我看看上面数码管显示浮点型变量不正确,但是输入的是常量displsy_point(1.23456),是正常的,不知道怎么回事?
用的是AVR8,ICC的编译器,没有上面的代码还是40%的ROM使用率,编译上面的代码后,ROM使用一下提升了%10。。。。。。。。
大家有好的显示浮点数的代码吗????谢谢,帮我该代码!!!!

相关帖子

沙发
ayb_ice| | 2010-10-12 08:27 | 只看该作者
本帖最后由 ayb_ice 于 2010-10-12 08:28 编辑

首先要确定最大整数位是几位,最大小数位有几位,如果是要显示任意浮点数,那就太长了

使用特权

评论回复
板凳
免证入网| | 2010-10-12 08:51 | 只看该作者
你这个函数cpu跑起来很累的,最好显示前把一个数的各位数字撤开放进一个数组里,然后显示每一位。这样就不会像你的程序那样每次显示都要进行扯开动作,更要命的是你的程序扯开竟然还要浮点运算。这样cpu在浮点运算和显示之间来回疲于奔命……

使用特权

评论回复
地板
areshan|  楼主 | 2010-10-12 09:10 | 只看该作者
单独显示没有问题,这样显示好像让整个系统都慢了好多。还加了两个定时中断。不知道中断对上面的显示有没有影响????????????????????

使用特权

评论回复
5
code-03| | 2010-10-12 15:38 | 只看该作者
对avr没怎么研究、路过学习、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

粉丝