打印

中断显示时为什么会有暗8显示

[复制链接]
2054|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
frankeng|  楼主 | 2010-2-25 10:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是个菜鸟,现在用LPC931做数码轮流显示,发现每个数码管都会暗显示8,不管是有数字显示还是没显示时都有,白天看不明显,晚上看上去就很明显了,不知道为什么,请前辈们指教,谢谢。
#include<reg931.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char data disp_buffer[6];  // 显于缓冲区基地址
unsigned char data *buffer;  
uchar count=0;
unsigned char disbit[]={
0x04,0x02,0x01,0x80,0x40,0x08,0x00
};
unsigned char code discode[]={
        0x28,//        0x03,  /*0*/
        0xEB,//        0x9f,  /*1*/
        0x32,//        0x25,  /*2*/
        0x62,//        0x0d,  /*3*/
        0xE1,//        0x99,  /*4*/
        0x64,//        0x49,  /*5*/
        0x24,//        0x41,  /*6*/
        0xEA,//        0x1f,  /*7*/
        0x20,//        0x01,  /*8*/
        0x60,//        0x09,  /*9*/
        0xff//                              /*null*/
        };

uint a=9876,b=10245,c=32768;
void hextobcd(uint hexs,uchar j)
{
uint va;
uchar i;
    va = 10000;                             
    for(i=j-1;i;i--)
    {
        disp_buffer[i] = 0;               
        while ((hexs>=va)&&(va>9))
  {
            hexs -= va;                    
            disp_buffer[i]++;              
        }
        va /= 10;                        
    }
    disp_buffer[0]=hexs;                    
            
}
void delays(uchar j)
{
uchar i,k;
while(j--)
for(i=0;i<120;i++)
{
  for(k=0;k<120;k++);
}
}
void time0() interrupt 1 using 1
{ TR0=0;
  P0=disbit[6];   //关闭位选
     P0=disbit[5-count];
  P2=discode[buffer[count]];
  if(count==6)
  count=0;      //定时器0在每次被触发时,改变LCD显示。
  else count++;  //从第一位到第六位循环显示

TH0=0xf3;
TL0=0xff;
TR0=1;
}
void led(uchar flag )
{

  switch(flag)
  {
   case 1:
     hextobcd(a,5);
     buffer=disp_buffer;
     break;
      case 2:
     hextobcd(b,5);
     buffer=disp_buffer;
     break;
   case 3:
     hextobcd(c,5);
     buffer=disp_buffer;
     break;
   
  }
  delays(200);   //显示约2S
  disp_buffer[0]=disp_buffer[1]=disp_buffer[2]=disp_buffer[3]=disp_buffer[4]=disp_buffer[5]=10;  //关闭所有显示
  delays(100);  //停约1S

}
main()
{

TMOD=0x01;
TH0=0xf3;  //7.373MHz晶振,5ms定时
TL0=0xff;
TR0=1;
ET0=1;
ET1=1;
EA=1;

    while(1)
    {
       led(1);
       led(2);
       led(3);
}


}

相关帖子

沙发
yytdragon| | 2010-2-25 10:28 | 只看该作者
首先免责声明下我没看程序。。。凭经验的话,如果硬件设计上是共用数据线的话,那就适当的降低下刷新频率,同时在显示完一个数后,清空一下数据线就可以了

使用特权

评论回复
板凳
frankeng|  楼主 | 2010-2-25 11:05 | 只看该作者
不知道共用数据线啥意思,硬件是不同的I/O口控制不同的位,而段是共用的P2口。刷新频率也试着降了,也试着升了,好像效果一样。显示前也要关了一下位选,还是那样,所以就彻底不知道怎么回事了。

使用特权

评论回复
地板
zds0901| | 2010-2-25 12:37 | 只看该作者
把电路图发上来看看,也可能是硬件的问题

使用特权

评论回复
5
frankeng|  楼主 | 2010-2-25 12:52 | 只看该作者
硬件没问题,是一个前辈留下的,擦除原来的程序之前显示是好好的。

使用特权

评论回复
6
mohanwei| | 2010-2-25 13:32 | 只看该作者
本帖最后由 mohanwei 于 2010-2-25 14:14 编辑

以下代码顺序有问题:
P0=disbit[6];   //关闭位选
P0=disbit[5-count];
P2=discode[buffer[count]];

应改为:
P0=disbit[6];   //第一步:关闭所有位选
//这里可以根据情况插入几个NOP,因为有的开关器件速度不够高
P2=discode[buffer[count]];//第二步:送出新的显示数据
P0=disbit[5-count];//第三步:选通1个LED
至于能否工作,还要取决于你的程序是否能跟硬件电路对应上……

使用特权

评论回复
7
frankeng|  楼主 | 2010-2-25 13:42 | 只看该作者
好的,谢谢前辈们的指点,晚上回去试试。

使用特权

评论回复
8
zdjtcl1| | 2010-2-26 09:10 | 只看该作者
应该是扫描频率和缓冲的事,就是说每次送完数据后,在显示下一个之前要把这个的显示清掉,就是让现在显示的关了,完事再送下一个数码管的数据(段和位)

使用特权

评论回复
9
frankeng|  楼主 | 2010-2-26 10:22 | 只看该作者
谢谢各位,昨天晚上终于弄出来了,原来I/O口模式设置有问题,应该把推挽输出改为开漏模式。但为什么这样还没想通,位选都有10K的上拉,用8550控制各位数码管。

使用特权

评论回复
10
WANGJJ888| | 2010-2-26 11:18 | 只看该作者

使用特权

评论回复
11
yytdragon| | 2010-3-1 10:37 | 只看该作者
fent

使用特权

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

本版积分规则

4

主题

14

帖子

0

粉丝