找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机MAX7219显示芯片级联的显示程序问题

[复制链接]
跳转到指定楼层
楼主
ID:846569 发表于 2020-12-14 00:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用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. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844772 发表于 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;
         

        }
回复

使用道具 举报

板凳
ID:752974 发表于 2021-1-18 11:27 | 只看该作者
只要级联都是使用同一个时钟,写第一个7219时,第一个7219内部的数据移到了第二个7219,如此。所以这种器件要级联使用,每次写数据必须全部刷新。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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