标题: 关于单片机MAX7219显示芯片级联的显示程序问题 [打印本页]

作者: HSY666NB    时间: 2020-12-14 00:40
标题: 关于单片机MAX7219显示芯片级联的显示程序问题
我用MAX7219级联了一共四个点阵屏,函数写成了:Write_Max7219(3,0XFF,0);//0表示要显示第一块点阵屏,3表示显示当前显示屏的第三列(左数右),0xFF为这列中有哪些二极管亮。
首先初始化(对四个MAX7219都发了初始化的一大堆代码)

这个时候MAX7219是全部不亮的
然后我发送:
Write_Max7219(3,0XFF,0);
Write_Max7219(4,0XFF,0);
Write_Max7219(5,0XFF,0);


这样看来应该是只有第一块点阵屏的3、4、5列全亮,但是实际上,亮成了图一的样子,

也就是说:
当发送Write_Max7219(3,0XFF,0);的时候第一块MAX7219正确地让第三列全亮了,
当发送Write_Max7219(4,0XFF,0);的时候第一块MAX721让第三列全亮了之后,该芯片又从DOUT口发送了让第二块点阵屏的第三列全亮的代码;
我就想知道这是为啥,它就不能乖乖接收到信号然后别打扰后头的芯片干活吗。

并且并且!如果我初始化(即发送Init_MAX7219())后发送的是这样的代码:
        Write_Max7219(3,0XFF,0);
        Write_Max7219(4,0XFF,0);
        Write_Max7219(5,0XFF,0);        
        
        Write_Max7219(3,0XFF,0);


他会亮成图2的样子
,我真奇怪这是为啥,烦请大佬们帮忙看看是不是代码出了问题,单片机工作频率是16Mhz,用逻辑分析仪24M测出来信号频率是1Mhz,并没有超出MAX7219的检测上限(10Mhz)


附鄙人单片机代码:
  1. #define Max7219_pinDIN        P1_7
  2. #define Max7219_pinCS        P1_6
  3. #define Max7219_pinCLK        P1_5


  4. void Write_Max7219_byte(unsigned char DATA)         //写入8位数据
  5. {
  6.         unsigned char i;
  7.         for(i = 8;i >= 1;i--)
  8.         {                  
  9.                 Max7219_pinCLK = 0;
  10.                 Max7219_pinDIN = DATA&0x80;
  11.                 DATA = DATA << 1;
  12.                 Max7219_pinCLK = 1;
  13.         }                                 
  14. }


  15. void Write_Max7219(unsigned char address,unsigned char dat,unsigned char num_Max7219)//向某个数码管写入16位数据
  16. {
  17.         Max7219_pinCS = 1;
  18.         Delay_us(1);
  19.         Max7219_pinCS = 0;
  20.         Write_Max7219_byte(address);
  21.         Write_Max7219_byte(dat);
  22.         if(num_Max7219 >= 1)        Write_Max7219_byte(init[0][0]),Write_Max7219_byte(init[0][0]);
  23.         if(num_Max7219 >= 2)        Write_Max7219_byte(init[0][0]),Write_Max7219_byte(init[0][0]);
  24.         if(num_Max7219 >= 3)        Write_Max7219_byte(init[0][0]),Write_Max7219_byte(init[0][0]);
  25.         Max7219_pinCS = 1;
  26. }

  27. void Init_MAX7219(void)  //初始化所有MAX7219
  28. {
  29.         unsigned char i,j;
  30.         for(j = 0;j < 4;j ++)
  31.         {
  32.                 for(i = 0;i < 14;i ++)
  33.                 {
  34.                         Max7219_pinCS = 0;
  35.                         Write_Max7219(init[i][0],init[i][1],j);
  36.                 }
  37.         }
  38. }
复制代码

作者: glinfei    时间: 2021-1-16 16:43
看不到你的图,但我能想出你显示的情况,不知道解决没?
是19行开始,Write_Max7219 那有问题 主要是 Write_Max7219_byte(init[0][0]);个数和位置不对
把你的IF那几句改成下边这样。
switch (num_Max7219)
   {
     case 0: Max7219WR(addr,dat);
                Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        break;
        case 1:        Write_Max7219_byte(0x00);
                Write_Max7219_byte(0x00);
                        Max7219WR(addr,dat);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        break;
        case 2:        Write_Max7219_byte(0x00);
                Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Max7219WR(addr,dat);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);  
                        break;
        case 3:        Write_Max7219_byte(0x00);
                Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Write_Max7219_byte(0x00);
                        Max7219WR(addr,dat);  break;
         

        }

作者: munuc_w    时间: 2021-1-18 11:27
只要级联都是使用同一个时钟,写第一个7219时,第一个7219内部的数据移到了第二个7219,如此。所以这种器件要级联使用,每次写数据必须全部刷新。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1