打印

问一个数码管显示小数点位如何确定的问题

[复制链接]
5867|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongjia|  楼主 | 2007-4-3 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dongjia|  楼主 | 2007-4-3 10:51 | 只看该作者

我在线等!

我是个菜鸟,希望各位前辈能帮助我!

使用特权

评论回复
板凳
ayb_ice| | 2007-4-3 10:56 | 只看该作者

与其它显示位有区吗

与其它显示位有区吗

使用特权

评论回复
地板
程序匠人| | 2007-4-3 10:57 | 只看该作者

高位判零消隐

从高位到低位,逐个判断,如果是零,就消隐;并继续判下一位。如果不是零(或遇到个位),就不消隐,并结束判断

使用特权

评论回复
5
dongjia|  楼主 | 2007-4-3 11:00 | 只看该作者

我不太明白

看你的意思就是和其他显示位一样处理就可以了,对吗?
那高位为零不显示呢?

使用特权

评论回复
6
dongjia|  楼主 | 2007-4-3 11:04 | 只看该作者

我自己编了一个程序,但是太麻烦了,不知道谁能有更简单

unsigned char LedData[10]={0x7E/*0*/,0x48/*1*/,0x3D/*2*/,0x6D/*3*/,0x4B/*4*/,0x67/*5*/,
0x77/*6*/,0x4C/*7*/,0x7F/*8*/,0x6F/*9*/};//显示码
unsigned char DispBuf[]={0,0,0,0,1};//显示缓冲区
DispBuf[4]=q;
DispBuf[3]=result/1000;
DispBuf[2]=(result%1000)/100;
DispBuf[1]=((result%1000)%100)/10;
DispBuf[0]=((result%1000)%100)%10;
//显示程序
void Display(void)
{
unsigned char temp;
unsigned char k;
Dataswitch();//浮点数转数组程序
while(1)
{switch(P0)
 {
  case 0xfe:     //显示万位
  temp=DispBuf[4];
  if(temp==0)
   P1=0x00;  //输出数据0x00,代表什么也不显示
   k=1;
  else
   P1=LedData[temp];
   k=0;
  break;
  case 0xfd:   //显示千位
  temp=DisBuf[3];
  if(temp==0)
  {
   if(k)   //判断万位是否为零
   {
    P1=0x00;
    k=1;
   else
    P1=LedData[0];
    k=0;
   }
  else
   P1=LedData[temp];
   k=0;
  break;
  case 0xfb:   //显示百位
  temp=DisBuf[2];
  if(temp==0)
  {
   if(k)
   {
    P1=0x00;
    k=1;
   else
    P1=LedData[0];
    k=0;
   }
   else
    P1=LedData[temp];
    k=0;
   break;
   case 0xf7:  //显示十位
   temp=DispBuf[1];
   if(temp==0)
  {
   if(k)
   {
    P1=0x00;
    k=1;
   else
    P1=LedData[0];
    k=0;
   }
   else
    P1=LedData[temp];
    k=0;
   break;
   case oxef:  //显示个位
   temp=DispBuf[0];
   P1=LedData[temp];
   break;
   default:
   break
 }
 P0=(P0>>1)|0x80;
}
//浮点数转数组程序
void Dataswitch(result)
{
 unsigned char p;  //小数点位置标志位
 unsigned char q;  //符号标志位
 if(result<0)
 {
  q=0x20;
  result=0-result;
 else
  q=0x00;
 }
 if(result>9999)
 {
  DispBuf[4]=E;
  DispBuf[3]=r;
  DispBuf[2]=r;
  DispBuf[1]=o;
  DispBuf[0]=r;
 }
 else if(result>999.9)
 {
  p=0;
 }
 else if(result>99.99)
 {
  p=1;
  result*=10;
 }
 else if(result>9.999)
 {
  p=2;
  result*=100;
 }
 else if
 {
  p=3;
  result*=1000;
 }
 while(DispBuf[0]==0)
 {
  DispBuf[0]=DispBuf[1];
  DispBuf[1]=DispBuf[2];
  DispBuf[2]=DispBuf[3];
  DispBuf[3]=DispBuf[4];
  DispBuf[4]=0;
 }
}

使用特权

评论回复
7
dongjia|  楼主 | 2007-4-3 11:06 | 只看该作者

我总感觉这个程序太繁琐了

应该能用循环重新改一下,但是我不会,谁做过,分享一下。

使用特权

评论回复
8
ayb_ice| | 2007-4-3 11:12 | 只看该作者

随便说说

  动态显示对时间非常严格,估计你的程序这么繁锁会产生显示闪烁,一定要定时刷新...
  想想你的问题人是怎么想法解决的,程序就怎么解决...
  如果你都想不通,不可能写程序的...

使用特权

评论回复
9
xiaopet| | 2007-4-3 11:22 | 只看该作者

简单看了一下

LZ如果要不显示的话,可以在这个数组里:
unsigned char LedData[10]={0x7E/*0*/,0x48/*1*/,0x3D/*2*/,0x6D/*3*/,0x4B/*4*/,0x67/*5*/,
0x77/*6*/,0x4C/*7*/,0x7F/*8*/,0x6F/*9*/};//显示码
加一个,0XFF;
根据程序,你的数码管应该是共阴的,所以不想显示时就送一个0xff;
由于你的程序结构的原因,在数组里加应该起不了作用,那么就判断要不显示时,就直接送0XFF吧。

使用特权

评论回复
10
zgl7903| | 2007-4-3 20:58 | 只看该作者

试试使用sprintf函数看看

使用特权

评论回复
11
mohanwei| | 2007-4-3 21:52 | 只看该作者

sprintf是一个好东东,现在一般单片机都可以用的上。

使用特权

评论回复
12
平常人| | 2007-4-3 22:02 | 只看该作者

sprintf可以用,但它耗时且占地方,很多时候并不好用

使用特权

评论回复
13
huangqi412| | 2007-4-4 07:17 | 只看该作者

给你个显示小数点的,不过,消隐自己弄吧。

void smg(uchar *shx,uchar n,uchar sm,uchar dot) //动态扫描驱动
{ //显示缓冲指针,显示个数,扫描开始位置 小数点
uchar gsh;     //显示个数 从左开始显示
for(gsh=0;gsh<n;gsh++)//循环扫描
{
uchar tem;            //临时存放显示码
wkou=sm;              //位选
tem=xshtab[*shx++];   //段码
if((dot|sm)==0xff)      //如果对应位1,可以拼出ff。显示小数点
tem=tem+0x80;
dkou=tem;
ysh2ms();             //延时
sm=_crol_(sm,1);      //移位
}
wkou=0xff;            //关闭
}

使用特权

评论回复
14
dongjia|  楼主 | 2007-4-4 09:48 | 只看该作者

谢谢 喽

  

使用特权

评论回复
15
huangqi412| | 2007-4-4 21:33 | 只看该作者

不用,呵呵,

使用特权

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

本版积分规则

13

主题

38

帖子

0

粉丝