标题: MAX7219多片级联驱动点阵单片机程序编写经历 [打印本页]

作者: YHF1996    时间: 2019-4-22 16:51
标题: MAX7219多片级联驱动点阵单片机程序编写经历
      大家好,我给大家分享一个自己写的MAX7219级联驱动程序!
      我在那个宝上买了一个四级联点阵模块,花了好多时间写出了它的驱动程序(作为菜鸟我很难受)。
       我刚开始一下没弄明白,在网上找了一个程序,(就是那几张手机截图),照着搞了一遍,能显示,但问题很多,比如会闪烁,有一片会有重影,而且代码我觉得啰嗦而且还要延时,细看发现分四片写入,而且还要写入大量的NO-OP数据OX00。所以我只好自己写了一个驱动程序,看了会数据手册,发现这不就是类似74HC595的东西嘛!于是我自己写了一个程序,非常简洁明了,非常稳定,如彩图所示,我测试过STC15在1T的情况下4~35MHZ频率,都没有任何问题,其实那两个nop都不需要了,只是想求个稳,希望对有需要的人有用,大神的话就不了说了,我只不过是一个刚入坑单片机不久的菜鸟!都是大神们玩剩下的了,唉!

IMG_20190422_155558.png (393.64 KB, 下载次数: 232)

IMG_20190422_155558.png

IMG_20190422_155903.png (336.17 KB, 下载次数: 196)

IMG_20190422_155903.png

IMG_20190422_155958.png (377.12 KB, 下载次数: 193)

IMG_20190422_155958.png

IMG_20190422_160108.png (184.06 KB, 下载次数: 224)

IMG_20190422_160108.png

IMG_20190422_134338.jpg (813.05 KB, 下载次数: 221)

IMG_20190422_134338.jpg

Screenshot_20190422-161024.jpg (142.81 KB, 下载次数: 220)

Screenshot_20190422-161024.jpg

Screenshot_20190422-160929.jpg (179.99 KB, 下载次数: 224)

Screenshot_20190422-160929.jpg

Screenshot_20190422-160949.jpg (234.82 KB, 下载次数: 212)

Screenshot_20190422-160949.jpg

Screenshot_20190422-161013.jpg (278.87 KB, 下载次数: 212)

Screenshot_20190422-161013.jpg

Screenshot_20190422-161005.jpg (251.82 KB, 下载次数: 214)

Screenshot_20190422-161005.jpg

作者: 51hei团团    时间: 2019-4-22 18:03
好东东 能分享下 代码的工程包吗
作者: YHF1996    时间: 2019-4-22 21:17
51hei团团 发表于 2019-4-22 18:03
好东东 能分享下 代码的工程包吗

都在这了!就只有这么点就可以!
作者: by64214    时间: 2019-11-29 23:06
谢谢分享  程序简洁  明了   学习的好模板


main.c
  1. #include <reg52.h>
  2. #include "intrins.h"
  3. #include "Max7219.h"

  4. uchar code laji[][8]={
  5. {0x18,0x24,0x42,0x42,0x7E,0x42,0x42,0x42},//A
  6. {0x7C,0x42,0x42,0x7C,0x42,0x42,0x42,0x7C},//B
  7. {0x3C,0x42,0x40,0x40,0x40,0x40,0x42,0x7C},//C
  8. {0x7C,0x42,0x42,0x42,0x42,0x42,0x42,0x7C},//D
  9. };
  10. /*n毫秒的延时程序*/
  11. /*void Delay_xms(uint x)
  12. {
  13.   uint i,j;
  14.   for(i=0;i<x;i++)
  15.   for(j=0;j<112;j++);
  16. }*/
  17. void main()
  18. {
  19.   uchar i,j;
  20.   //Delay_xms(50);
  21.   MAX7219Init();  
  22.   while(1)
  23.   {
  24.                 for(j=0;j<8;j++)
  25.     {
  26.       for(i=0;i<number;i++)
  27.       {
  28.         Max7219WR(j+1,laji[i][j]);
  29.             }
  30.       CS=1; _nop_(); CS=0;
  31.                         //Delay_xms(100);
  32.     }  
  33.   }
  34. }


  35. Max7219.h
  36. #ifndef _Max7219_H_
  37. #define _Max7219_H_

  38. #define uchar unsigned char
  39. #define uint  unsigned int
  40. #define number  4 //点阵级联个数
  41. #define lum     5 //亮度级别,0-F,共16级

  42. //定义Max7219端口
  43. sbit CLK = P2^2;  //时钟 Max7219_pin
  44. sbit CS  = P2^1;  //锁存
  45. sbit DIN = P2^0;  //数据

  46. //向MAX7219 写入地址和数据
  47. void Max7219WR(uchar addr,uchar dat)
  48. {
  49.   uchar n=8;
  50.         CLK=0;
  51.         CS=0;   //CS=0有效,CS=1锁存
  52.         /*发送数据 高位先发*/
  53.         while(n--)
  54.         {
  55.           DIN = addr & 0x80;
  56.                 CLK=1;
  57.                 addr <<= 1;
  58.                 CLK=0;
  59.         }
  60.         n=8;
  61.         /*发送数据 高位先发*/
  62.         while(n--)
  63.         {
  64.           DIN = dat & 0x80;
  65.                 CLK=1;
  66.                 dat <<= 1;
  67.                 CLK=0;
  68.         }
  69. }
  70. void MAX7219Init()
  71. {
  72.   uchar i,j;
  73.         for(i=0;i<5;i++)  //
  74.         {
  75.           for(j=number;j>0;j--)
  76.                 switch(i)
  77.                 {
  78.                   case 0:Max7219WR(0x09, 0x00); break; //译码方式:BCD码 不译码
  79.                         case 1:Max7219WR(0x0A, lum);  break; //亮度 0-15 共16级
  80.                         case 2:Max7219WR(0x0B, 0x07); break; //扫描界限;8位显示
  81.                         case 3:Max7219WR(0x0C, 0x01); break; //掉电模式:0,普通模式:1
  82.                         case 4:Max7219WR(0x0F, 0x00); break; //显示测试:1;测试结束,正常显示:0
  83.                 }
  84.                 CS=1; _nop_(); CS=0; //每写入四次给一个锁存脉冲
  85.         }
  86. }
  87. #endif
复制代码


作者: sh-fluke    时间: 2020-1-9 08:14
好东东 能分享下代码的工程包吗?
作者: MANHAMCHAN    时间: 2020-4-27 10:55
按你的程序建了工程,点阵要么不亮要么闪烁几下就不亮了
作者: dlj123    时间: 2020-12-23 01:07
能发一下程序吗?
作者: by64214    时间: 2020-12-23 08:58
我上面的程序  就是楼主发的全部程序图片  仿真显示正常,实物未检验
作者: glinfei    时间: 2021-1-15 10:29
本帖最后由 glinfei 于 2021-2-1 16:16 编辑
MANHAMCHAN 发表于 2020-4-27 10:55
按你的程序建了工程,点阵要么不亮要么闪烁几下就不亮了

程序没问题,我也试过了,不过我用的某多多的最小系统,跟你出现同样问题的原因竟然是它的EN管脚竟然没拉高。
作者: 人人学会单片机    时间: 2021-1-15 11:47
TM公司的芯片 要比MAX7219 好用多了。
作者: kaixuan520    时间: 2021-1-28 21:07
网上的代码很累赘,无论几块max7219,写一波数据,然后CS=1;  CS=0;,比单个写好
作者: dlj123    时间: 2021-2-1 23:31
大神把程序发出来啊
作者: hefq    时间: 2021-2-2 09:46


作者: suqianfu    时间: 2021-2-23 09:15
软件延时简直就是单片机的大敌啊。好,简洁,方便。那个送数函数while,改为for循环应该效果一样。
作者: suqianfu    时间: 2021-2-23 09:18
老大,如果要滚动显示怎么处理呢?
作者: YHF1996    时间: 2021-3-14 12:00
dlj123 发表于 2021-2-1 23:31
大神把程序发出来啊

你好!我的另一篇帖子已上传工程包
作者: zyw497947507    时间: 2021-11-7 16:12
如何实现滚动呢?有人会吗
作者: asd2580    时间: 2022-2-27 20:52
楼主,有16X16显示汉字的驱动吗?
作者: woliuyuexun    时间: 2023-7-20 09:59
谢谢 by64214 ,成功点亮四块ABCD。
作者: Q__Q    时间: 2023-7-20 11:56
好东西,非常感谢,先收藏了,今天回去学习研究下,用这个做个动态显示的应该怎么写
作者: suqianfu    时间: 2023-9-10 14:26
zyw497947507 发表于 2021-11-7 16:12
如何实现滚动呢?有人会吗

加上定时器移位地址或数据,就可以做左右滚动或者上下滚动了。
作者: suqianfu    时间: 2023-9-10 17:03
人人学会单片机 发表于 2021-1-15 11:47
TM公司的芯片 要比MAX7219 好用多了。

TM的芯片自带时钟,不受外部时钟中断而爆亮。这点很好,能保证光点亮度均匀。7219估计跟两片595寄存器组合起来差不多,数据的扫描输出估计应该受时钟信号波动而变动。
作者: isyido    时间: 2024-1-7 11:40
等于多个级联,不是11111111,22222222,333333333,44444444一个一个的刷新,而是1234,1234,1234....这样一列一列刷新的?




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