找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2963|回复: 6
打印 上一主题 下一主题
收起左侧

数码管有鬼影问题

[复制链接]
跳转到指定楼层
楼主
ID:228371 发表于 2017-10-15 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
那个老师知道。或者那个大佬明白给我讲解一下谢谢。为什么数码管输入5678显示6785;5还有鬼影。

  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned  int
  5. #define AT24C02_ADDR  0xa0
  6. #define PCF8591_ADDR  0X90
  7. #define  MAIN_Fosc    11.0592
  8. sbit we = P2^7;
  9. sbit du = P2^6;
  10. sbit SDA = P2^0;
  11. sbit SCL = P2^1;


  12. void delay_5us()  
  13. {
  14.         _nop_();
  15. }
  16. void delay(uint ms)
  17. {
  18. uchar i;
  19.   do
  20.   {
  21.     i = MAIN_Fosc / 9600;
  22.            while(--i);
  23.   }
  24.   while(--ms);
  25. }
  26. unsigned char leddata[]={

  27.                 0x3F,  //"0"
  28.                 0x06,  //"1"
  29.                 0x5B,  //"2"
  30.                 0x4F,  //"3"
  31.                 0x66,  //"4"
  32.                 0x6D,  //"5"
  33.                 0x7D,  //"6"
  34.                 0x07,  //"7"
  35.                 0x7F,  //"8"
  36.                 0x6F,  //"9"
  37.                 0x77,  //"A"
  38.                 0x7C,  //"B"
  39.                 0x39,  //"C"
  40.                 0x5E,  //"D"
  41.                 0x79,  //"E"
  42.                 0x71,  //"F"
  43.                 0x76,  //"H"
  44.                 0x38,  //"L"
  45.                 0x37,  //"n"
  46.                 0x3E,  //"u"
  47.                 0x73,  //"P"
  48.                 0x5C,  //"o"
  49.                 0x40,  //"-"
  50.                 0x80,  //??
  51.                 0x00  //???

  52.                          };
  53. unsigned char ledbit[]={
  54.                                                                                                         0xfe, //w1
  55.                                                                                                         0xfd, //w2
  56.                                                                                                         0xfb, //w3
  57.                                                                                                         0xf7, //w4
  58.                                                                                                         0xef, //w5
  59.                                                                                                         0xdf, //w6
  60.                                                                                                         0xbf, //w7
  61.                                                                                                         0x7f, //w8
  62.                       };
  63. void display(uint i)
  64. {
  65.    uint b,s,g,q;
  66.    q = i/1000;
  67.    b = i%1000/100;
  68.    s = i%100/10;
  69.    g = i%10;
  70.         
  71.   du = 1;
  72.         P0 = leddata[q];
  73.         du = 0;
  74.         delay(10);

  75.         we = 1;
  76.         P0 = 0xfe;
  77.         we = 0;
  78.         P0 = 0xff;
  79.                
  80.         du = 1;
  81.         P0 = leddata[b] ;
  82.         du = 0;
  83.         delay(5);

  84.         we = 1;
  85.         P0 = 0xfd
  86.         we = 0;
  87.         P0 = 0xff;

  88.         du = 1;
  89.         P0 = leddata[s];
  90.         du = 0;
  91.         delay(5);

  92.         we = 1;
  93.         P0 = 0xfb;
  94.         we = 0;
  95.         P0 = 0xff;

  96.         du = 1;
  97.         P0 = leddata[g];
  98.         du = 0;
  99.         delay(5);

  100.         we = 1;
  101.         P0 = 0xf7;
  102.         we = 0;
  103.         P0 = 0xff;
  104. }
  105. void main()
  106. {
  107.   while        (1)
  108.   {
  109.     display(5678);
  110.   }
  111. }
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:179958 发表于 2017-10-15 18:28 | 只看该作者
这个用定时器定时1ms,然后每ms对一个数码管进行一次刷新,这样更好吧
要去除鬼影,在刷新下一个数码管之前,先P0=0xFF可P0=0x00吧,程序就不细看了,,,,,
回复

使用道具 举报

板凳
ID:123289 发表于 2017-10-15 23:56 | 只看该作者
扫描时序未合理规划安排。
回复

使用道具 举报

地板
ID:213173 发表于 2017-10-16 09:08 | 只看该作者
本帖最后由 wulin 于 2017-10-16 10:22 编辑

你的显示程序延时位置不对,另外集中分解数据会耽误时间使个位亮度大于其他位。给你改了一下,你试试。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned  int
//#define AT24C02_ADDR  0xa0
//#define PCF8591_ADDR  0X90
#define  MAIN_Fosc    11.0592
sbit we = P2^7;
sbit du = P2^6;
//sbit SDA = P2^0;
//sbit SCL = P2^1;
/*
void delay_5us()  
{
        _nop_();
}
*/
void delay(uint ms)
{
        uchar i;
        do
        {
                i = MAIN_Fosc / 9600;
                while(--i);
        }
        while(--ms);
}

uchar leddata[]={

                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"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x80,  //??
                0x00  //???

                         };
uchar ledbit[]={
                            0xfe, //w1
                            0xfd, //w2
                            0xfb, //w3
                            0xf7, //w4
                            0xef, //w5
                            0xdf, //w6
                            0xbf, //w7
                            0x7f, //w8
                      };
void display(uint i)
{
//        uint b,s,g,q;
//        q = i/1000;
//        b = i%1000/100;
//        s = i%100/10;
//        g = i%10;
        P0 = leddata[i/1000];
        du = 1;
        du = 0;
        
        P0 = 0xfe;
        we = 1;
        we = 0;
        P0 = 0xff;
        delay(1);
        
        P0 = leddata[i%1000/100] ;
        du = 1;
        du = 0;
        
        P0 = 0xfd;
        we = 1;
        we = 0;
        P0 = 0xff;
        delay(1);
        
        P0 = leddata[i%100/10];
        du = 1;
        du = 0;
        
        P0 = 0xfb;
        we = 1;
        we = 0;
        P0 = 0xff;
        delay(1);
        
        P0 = leddata[i%10];
        du = 1;
        du = 0;        
        P0 = 0xf7;
        we = 1;
        we = 0;
        P0 = 0xff;
        delay(1);
}

void main()
{
        while(1)
        {
                display(5678);
        }
}
回复

使用道具 举报

5#
ID:239880 发表于 2017-10-16 13:19 | 只看该作者
刷新问题
回复

使用道具 举报

6#
ID:228371 发表于 2017-10-22 13:14 | 只看该作者
wulin 发表于 2017-10-16 09:08
你的显示程序延时位置不对,另外集中分解数据会耽误时间使个位亮度大于其他位。给你改了一下,你试试。
#i ...

谢谢
回复

使用道具 举报

7#
ID:1 发表于 2017-10-23 00:59 | 只看该作者
这是我6年前些的 单片机数码消隐问题的的解决方案:http://www.51hei.com/bbs/dpj-10971-1.html
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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