找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4055|回复: 16
收起左侧

PIC16F877A单片机驱动max7219时点阵有残影闪烁

  [复制链接]
ID:45497 发表于 2019-10-12 21:20 | 显示全部楼层 |阅读模式
877a驱动max7219驱动4块8*8级联成4*32,显示时在第三块总是有残影,另外3块确没有,请问是代码问题吗?谢谢了!
51hei图片_20191012204718 (2)_LI.jpg 51hei图片_20191012204731 (2)_LI.jpg 51hei图片_20191012204745 (2).jpg

单片机源程序如下:
  1. #include <pic.h>
  2. __CONFIG(HS&WDTDIS&LVPDIS);

  3. #define INT8U   unsigned char
  4. #define _XTAL_FREQ 4000000UL

  5. //定义Max7219端口
  6. #define DIN RB0
  7. #define CS  RB1
  8. #define CLK RB2

  9. const INT8U disp1[10][8]={

  10. {0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0

  11. {0x18,0x28,0x08,0x08,0x08,0x08,0x08,0x08},//1

  12. {0x3c,0x42,0x42,0x02,0x1c,0x20,0x40,0x7E},//2

  13. {0x3c,0x42,0x42,0x0c,0x2,0x42,0x42,0x3c},//3

  14. {0x28,0x28,0x48,0x48,0x7e,0x8,0x8,0x8},//4

  15. {0x3e,0x40,0x40,0x7c,0x2,0x2,0x42,0x3c},//5

  16. {0x3e,0x42,0x40,0x7C,0x42,0x42,0x42,0x3c},//6

  17. {0x7E,0x02,0x4,0x8,0x8,0x8,0x8,0x8},//7

  18. {0x3c,0x42,0x42,0x3c,0x42,0x42,0x42,0x3c},//8

  19. {0x3c,0x42,0x42,0x42,0x3e,0x2,0x42,0x3c}//9
  20. };


  21. //-----------------------------------------------------------------------------
  22. //向MAX7219写入字节
  23. //-----------------------------------------------------------------------------
  24. void Write_Max7219_byte(INT8U DATA)         

  25. {
  26.         INT8U i;   
  27.         CS=0;                                //CS=0有效,CS=1锁存        
  28.         for(i=8;i>=1;i--)
  29.     {
  30.             CLK=0;
  31.             if(DATA & 0x80) DIN=1; else DIN=0;
  32.                 //DIN=(DATA&0x80);  //&10000000, 编译器对位操作的理解:非0即为1
  33.                 DATA=DATA<<1;
  34.                 CLK=1;                    //上升沿把数据送出去
  35.         }                                 
  36. }

  37. //------------------------------------------------------------------
  38. //向M第一片MAX7219写入数据
  39. //------------------------------------------------------------------
  40. void Write_Max7219_1(INT8U add1,INT8U dat1)
  41. {
  42.      CS=0;
  43.          Write_Max7219_byte(add1);           //写入地址,即数码管编号
  44.      Write_Max7219_byte(dat1);               //写入数据,即数码管显示数字
  45.          CS=1;                        
  46. }

  47. //---------------------------------------------------------------------
  48. //第二片MAX7219的写入数据
  49. //---------------------------------------------------------------------
  50. void Write_Max7219_2(INT8U add2,INT8U dat2)
  51. {
  52.         CS=0;
  53.         Write_Max7219_byte(add2);
  54.         Write_Max7219_byte(dat2);
  55.         CLK=1;
  56.         Write_Max7219_byte(0x00);  //片1写入空
  57.         Write_Max7219_byte(0x00);
  58.         CS=1;
  59. }

  60. //---------------------------------------------------------------------
  61. //第三片MAX7219的写入数据
  62. //---------------------------------------------------------------------
  63. void Write_Max7219_3(INT8U add3,INT8U dat3)
  64. {
  65.         CS=0;
  66.         Write_Max7219_byte(add3);
  67.         Write_Max7219_byte(dat3);
  68.         CLK=1;
  69.         Write_Max7219_byte(0x00); //片1写入空
  70.         Write_Max7219_byte(0x00);
  71.         Write_Max7219_byte(0x00); //片2写入空
  72.         Write_Max7219_byte(0x00);
  73.         CS=1;
  74. }

  75. //---------------------------------------------------------------------
  76. //第四片MAX7219的写入数据
  77. //---------------------------------------------------------------------
  78. void Write_Max7219_4(INT8U add4,INT8U dat4)
  79. {
  80.         CS=0;
  81.         Write_Max7219_byte(add4);
  82.         Write_Max7219_byte(dat4);
  83.         CLK=1;
  84.         Write_Max7219_byte(0x00); //片1写入空
  85.         Write_Max7219_byte(0x00);
  86.         Write_Max7219_byte(0x00); //片2写入空
  87.         Write_Max7219_byte(0x00);
  88.         Write_Max7219_byte(0x00); //片3写入空
  89.         Write_Max7219_byte(0x00);
  90.         CS=1;
  91. }
  92. //---------------------------------------------------------------------
  93. //初始化芯片
  94. //---------------------------------------------------------------------
  95. void Init_MAX7219(void)
  96. {
  97.          Write_Max7219_1(0x09, 0x00);       //译码方式:不译码
  98.          Write_Max7219_1(0x0a, 0x00);       //亮度最小
  99.          Write_Max7219_1(0x0b, 0x07);       //扫描界限;8个数码管显示
  100.          Write_Max7219_1(0x0c, 0x01);       //掉电模式:0,普通模式:1
  101.          Write_Max7219_1(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0

  102.         Write_Max7219_2(0x09, 0x00);       //译码方式:不译码
  103.          Write_Max7219_2(0x0a, 0x00);       //亮度最小
  104.          Write_Max7219_2(0x0b, 0x07);       //扫描界限;8个数码管显示
  105.          Write_Max7219_2(0x0c, 0x01);       //掉电模式:0,普通模式:1
  106.          Write_Max7219_2(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0

  107.          Write_Max7219_3(0x09, 0x00);       //译码方式:不译码
  108.          Write_Max7219_3(0x0a, 0x00);       //亮度最小
  109.          Write_Max7219_3(0x0b, 0x07);       //扫描界限;8个数码管显示
  110.          Write_Max7219_3(0x0c, 0x01);       //掉电模式:0,普通模式:1
  111.          Write_Max7219_3(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
  112.          
  113.          Write_Max7219_4(0x09, 0x00);       //译码方式:不译码
  114.          Write_Max7219_4(0x0a, 0x00);       //亮度最小
  115.          Write_Max7219_4(0x0b, 0x07);       //扫描界限;8个数码管显示
  116.          Write_Max7219_4(0x0c, 0x01);       //掉电模式:0,普通模式:1
  117.          Write_Max7219_4(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:
  118. }


  119. //---------------------------------------------------------------------
  120. //*********************主程序**************************
  121. //---------------------------------------------------------------------
  122. void main(void)
  123. {
  124.          INT8U i,j=0,k=0;;
  125.          TRISB=0;
  126.          PORTB=0x00;
  127.          
  128.         __delay_ms(50);
  129.          Init_MAX7219();  
  130.                         
  131.          while(1)
  132.          {
  133.                    for(i=1;i<9;i++)
  134.                    {                        
  135.                         Write_Max7219_1(i,disp1[j%10][i-1]);
  136.                         Write_Max7219_2(i,disp1[j/10%10][i-1]);
  137.                         Write_Max7219_3(i,disp1[j/100%10][i-1]);
  138.                         Write_Max7219_4(i,disp1[k][i-1]);
  139.                 }
  140.                 j+=1;
  141.                 if(j>254)
  142.                 {
  143.                         j=0;k+=1;
  144.                         if(k>9) k=0;
  145.                 }
  146.                    __delay_ms(300);
  147.          }

  148. }
复制代码



回复

使用道具 举报

ID:371546 发表于 2022-3-6 09:07 | 显示全部楼层
多级串联的时候,写入数据的过程中,不用的位要写NO-OP代码,这样就不会重影了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:371546 发表于 2022-3-6 09:05 | 显示全部楼层
本帖最后由 ldch88 于 2022-3-6 11:03 编辑

//-----------------------------------------------------------------------------
//向MAX7219写入字节
//-----------------------------------------------------------------------------
void Write_Max7219_byte(INT8U DATA)         

{
        INT8U i;   
        CS=0;                                //CS=0有效,CS=1锁存        
        for(i=8;i>=1;i--)
                {
                        CLK=0;
                        if(DATA & 0x80) DIN=1; else DIN=0;
                        DATA=DATA<<1;
                        CLK=1;                //上升沿把数据送出去
                }                                 
}
//------------------------------------------------------------------
//向M第一片MAX7219写入数据
//------------------------------------------------------------------
void Write_Max7219_1(INT8U add1,INT8U dat1)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add1);        //片1写入地址,即数码管编号
        Write_Max7219_byte(dat1);        //片1写入数据,即数码管显示数字
        CS=1;                        
}
//---------------------------------------------------------------------
//第二片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_2(INT8U add2,INT8U dat2)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add2);        //片2写入地址,即数码管编号
        Write_Max7219_byte(dat2);        //片2写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//第三片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_3(INT8U add3,INT8U dat3)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add3);        //片3写入地址,即数码管编号
        Write_Max7219_byte(dat3);        //片3写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//第四片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_4(INT8U add4,INT8U dat4)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add4);        //片4写入地址,即数码管编号
        Write_Max7219_byte(dat4);        //片4写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//第五片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_5(INT8U add5,INT8U dat5)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add5);        //片5写入地址,即数码管编号
        Write_Max7219_byte(dat5);        //片5写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//第六片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_6(INT8U add6,INT8U dat6)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add6);        //片6写入地址,即数码管编号
        Write_Max7219_byte(dat6);        //片6写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//第七片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_7(INT8U add7,INT8U dat7)
{
        //CS=0;
        Write_Max7219_byte(0x00);        //片8写入空
        Write_Max7219_byte(0x00);
        
        Write_Max7219_byte(add7);        //片7写入地址,即数码管编号
        Write_Max7219_byte(dat7);        //片7写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//第八片MAX7219的写入数据
//---------------------------------------------------------------------
void Write_Max7219_8(INT8U add8,INT8U dat8)
{
        //CS=0;
        Write_Max7219_byte(add8);        //片8写入地址,即数码管编号
        Write_Max7219_byte(dat8);        //片8写入数据,即数码管显示数字
        
        Write_Max7219_byte(0x00);        //片7写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片6写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片5写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片4写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片3写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片2写入空
        Write_Max7219_byte(0x00);
        Write_Max7219_byte(0x00);        //片1写入空
        Write_Max7219_byte(0x00);
        CS=1;
}
//---------------------------------------------------------------------
//初始化芯片
//---------------------------------------------------------------------
void Init_MAX7219(void)
{
        Write_Max7219_1(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_1(0x0a, 0x03);       //设定亮度
        Write_Max7219_1(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_1(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_1(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_2(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_2(0x0a, 0x03);       //设定亮度  
        Write_Max7219_2(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_2(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_2(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_3(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_3(0x0a, 0x03);       //设定亮度  
        Write_Max7219_3(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_3(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_3(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_4(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_4(0x0a, 0x02);       //设定亮度  
        Write_Max7219_4(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_4(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_4(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_5(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_5(0x0a, 0x03);       //设定亮度  
        Write_Max7219_5(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_5(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_5(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_6(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_6(0x0a, 0x03);       //设定亮度
        Write_Max7219_6(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_6(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_6(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_7(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_7(0x0a, 0x03);       //设定亮度  
        Write_Max7219_7(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_7(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_7(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
        
        Write_Max7219_8(0x09, 0x00);       //译码方式:不译码
        Write_Max7219_8(0x0a, 0x03);       //设定亮度  
        Write_Max7219_8(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219_8(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219_8(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:420836 发表于 2021-8-27 08:43 | 显示全部楼层
想知道问题是如何解决的。7 段 LED 显示编程时,必须先将之前的数字完全清除才能显示新的数字,以免出现重影。
回复

使用道具 举报

ID:332444 发表于 2021-8-26 17:00 | 显示全部楼层
消隐有软消隐与硬消隐,软消隐就是送灯熄灭的值,硬消隐控制芯片清零引脚的值.
回复

使用道具 举报

ID:332444 发表于 2021-8-26 16:56 | 显示全部楼层
基本就是消隐存在问题
回复

使用道具 举报

ID:215984 发表于 2021-8-26 16:37 | 显示全部楼层
楼主还上线吗?我也出现了此种情况,麻烦你告知原因,谢谢!
回复

使用道具 举报

ID:917386 发表于 2021-6-26 13:42 来自手机 | 显示全部楼层
请问怎么解决的
回复

使用道具 举报

ID:258542 发表于 2020-7-12 16:12 | 显示全部楼层
我和楼主碰到一样的问题了,弄了好几天都没解决,请问下楼主是您代码哪里的问题呢?
回复

使用道具 举报

ID:147616 发表于 2020-2-20 20:40 | 显示全部楼层
怎么解决的
回复

使用道具 举报

ID:649963 发表于 2019-11-26 15:06 | 显示全部楼层
代码问题,认真看可以发现残影都是其他出现的字体。
回复

使用道具 举报

ID:48140 发表于 2019-11-26 10:53 来自手机 | 显示全部楼层
怎么解决的?
回复

使用道具 举报

ID:45497 发表于 2019-10-15 14:14 | 显示全部楼层
代码问题,已解决了。
回复

使用道具 举报

ID:45497 发表于 2019-10-14 21:54 | 显示全部楼层
发现残影就是第一片的数据,不知是什么原因,看代码是应该没有显示的。
回复

使用道具 举报

ID:617981 发表于 2019-10-14 17:23 | 显示全部楼层
代码问题,认真看可以发现残影都是其他出现的字体。
回复

使用道具 举报

ID:45497 发表于 2019-10-14 14:19 | 显示全部楼层
请问有人碰到过吗?
回复

使用道具 举报

ID:45497 发表于 2019-10-12 21:22 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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