单片机做数码管的动态显示,消影消不掉,怎么回事?求指教!

 我来答
GUEL86
2013-01-03 · TA获得超过5857个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2834万
展开全部

#include<reg52.h>           //  供参考
#define uchar unsigned char
#define uint unsigned int
 uchar code table[18]={
       0x3F,//"0"
       0x06,//"1"
       0x5B,//"2"
       0x4F,//"3"
       0x66,//"4"
       0x6D,//"5"
       0x7D,//"6"
       0x07,//"7"
       0x7F,//"8"
       0x6F,//"9"
       0x77,//"A"
       0x7C,//"B"
       0x39,//"C"
       0x5E,//"D"
       0x79,//"E"
       0x71,//"F"
       0x40, //"-"
       0x00 //"空"
      };

uchar num,miao,miaoge,miaoshi,feng,fengge,fengshi,shi,shishi,shige;
sbit second=P3^3;
sbit minuate=P3^4;
sbit hour=P3^5;

/***延时***/
void delay(uint x)    //延时Xms  晶振频率12Mhz 
{  uint i,j;         
 for(i=x;i>0;i--)
   for(j=120;j>0;j--);
}
/***中断初始化***/
void start()                              //初始化函数
{
 TMOD=0x01;       //设置定时器0的工作方式1(0000 0001)
 TH0=(65536-50000)/256;    //装初值50ms一次中断
 TH0=(65536-50000)%256;   
 EA=1;        //开总中断
 ET0=1;        //开定时器0中断
 TR0=1;        //启动定时器0
}
/***显示函数***/
void display()
{
 P0=0x7f;         // 秒个位显示
 P2=table[miaoge];
 delay(5);

 P0=0xbf;         //分个位显示
 P2=table[miaoshi];
 delay(5);

 P0=0xdf;        //间隔符号
 P2=table[16];
 delay(5);

 P0=0xef;        // 分个位显示
 P2=table[fengge];
 delay(5);

 P0=0xf7;         // 分十位显示
 P2=table[fengshi];
 delay(5);

 P0=0xfb;         //间隔符号
 P2=table[16];
 delay(5);

 P0=0xfd;        //时个位显示
 P2=table[shige];
 delay(5);

 P0=0xfe;       //时十位显示
 P2=table[shishi];
 delay(5);
}
/***设置时间***/
TimeUpDown() 
{
                //秒设置
  if(second==0)
  {
   delay(5);                    //消除抖动
   if(second==0)
   {
    miao++;
    if(miao==60)               //上限越界显示为0
    miao=0;
    while(second==0);
   }
  }
  if(minuate==0)              //分设置
  {
   delay(5);                  //消除抖动
   if(minuate==0)
   {
    feng++;
    if(feng==60)              //上限越界显示为0
    feng=0;
    while(minuate==0);
   }
  }
  if(hour==0)                 //时设置
  {
   delay(5);                  //消除抖动
   if(hour==0)
   {
    shi++;
    if(shi==24)               //上限越界显示为0
    shi=0;
    while(hour==0);
   }
  }
 }
/***主函数***/
void main()
{
 start();
    while(1)
 {
  display();   
   TimeUpDown();
  }
}
/***T0***/
void T0_time() interrupt 1
{
 TH0 = (65536-50000)/256;             
 TL0 = (65536-50000)%256;
 num++;
 if(num==20)         
  { 
   num=0;
   miao++;
     }
 if(miao==60)
    {
   miao=0;
   feng++;
    }
 if(feng==60)
   {
   feng=0;
 shi++;
    }
 if(shi==24)
   {
   shi=0;
   }
 shige=shi%10;
 shishi=shi/10;
 fengge=feng%10;
 fengshi=feng/10;
 miaoge=miao%10;
 miaoshi=miao/10;
}

111
2024-12-20 广告
作为合肥鑫义达科技有限公司的工作人员,我认为工业级LCD显示屏之所以被广泛使用,主要归因于其高可靠性、耐用性和多功能性。在工业环境中,设备需长时间运行并面临恶劣条件,如温度变化、震动和尘埃,而工业级LCD显示屏采用特殊材料和工艺,能有效抵御... 点击进入详情页
本回答由111提供
lycdl
高粉答主

2013-01-03 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2万
采纳率:94%
帮助的人:5263万
展开全部
1、先查看一下每位的显示时间,不能太短了,至少在1ms,否则就会出现重影。
2、因输出段码和位码的时间差过长了,调整一下程序,尽量做到输出段码和输出位码的两条指令紧跟着,中间不要加其他指令。也可以在输出新的段码之前,输出位码断开所有的显示,然后再输出新的段码,紧跟着再输出对应的位码。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
johnwanz
2013-01-03 · TA获得超过781个赞
知道小有建树答主
回答量:716
采纳率:80%
帮助的人:247万
展开全部
更新显示时,
1. 请先消除原有显示
2. 设定新的显示内容

如果有问题,就调整1.的时间,或是扫瞄频率
追问
第一个管子完了,我关闭位选,再扫描的第二个管子,但是还是看看数码管不该亮的段有微微余晖
追答
不太懂你说关闭位选。

还在选择第一个管的时候,就要进行清除动作。

这是硬体特性的问题,不是逻辑或控制问题。

参考资料: 自己

参考资料: 自己

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e9f676ee8
2013-01-03 · TA获得超过713个赞
知道小有建树答主
回答量:717
采纳率:66%
帮助的人:590万
展开全部
要是明显闪烁就把频率调快,要是重影了就调慢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
戊如焮T
2013-01-03 · 超过13用户采纳过TA的回答
知道答主
回答量:60
采纳率:0%
帮助的人:44.2万
展开全部
把扫描频率调高点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式