首页 > 编程知识 正文

MAX7219CWG引脚,max7219级联为什么要写空

时间:2023-05-04 11:42:42 阅读:120415 作者:3805

单片机可以驱动液晶屏,但在实际应用领域中,数码管仍然是主流的显示器件。

当提到多位数码管的显示时,通常谈论的是每位按顺序显示的动态显示技术。

该方法可以节省单片机的输出接口,但单片机软件负担较重,程序必须保证不间断的显示。 否则,就会出现亮度不均、闪烁或发光停止的现象。

MAX7219是一种专用的LED显示驱动芯片,能够动态驱动8位数字显示器。

也可以通过n个MAX7219级联以驱动8 * n位数字显示。

MAX7219和数字显示器之间的电路极其简单,甚至很少使用限流电阻。

MAX7219和单片机之间也只需要连接三根导线。

当单片机将数据发送到MAX7219时,它可以独立地进行动态扫描显示,单片机无需进一步干预。

对于单片机来说,所有这些数字显示器看起来都是静态显示的。

MAX7219可以说是驱动多位数码显示器的最佳选择。

DIP封装的MAX7219芯片如下:

MAX7219必须初始化。 根据规则,设定一些东西。

要用数字代码显示数字,可以设置解码和非解码两种方式。

用MAX7219驱动数码管的显示电路如下。

图片链接: http://Xiang ce.Baidu.com/picture/detail/feed f64 b 49 D2 e 5192469 b 151 b 556780582 b 97ee 9

MAX7219还可以驱动8 * 8点模块。 模拟的屏幕截图如下。

图片链接: http://Xiang ce.Baidu.com/picture/detail/BC 7297044 E6 f 36 DBC 04 ab 92b 5b 9e 00 dfdf 5d 30 e 9

在上面的位图中,运行着驱动数码管的程序,数码管的各段显示在各点上。

仔细查看点阵的显示,是否知道是标记为“51--7219”的段代码?

要在MAX7219中驱动点阵图形,只需采用非解码形式,仔细制作要显示的点阵图形,然后输出到MAX7219即可。

显示“I love U”的点阵画面如下。

为了显示上述画面而需要创建的点数据如下图所示。

明白了吗? 有一行。 必须从最下面移动到最上面,写点。

上面电路的显示步骤如下。

//====================================

#include reg52.h //引用标准库的头文件

#include intrins.h

#define uchar unsigned char

#定义uint unsigned int

#define DecodeMode0x09 //解码模式寄存器

#定义intensity0x0a//亮度寄存器

#定义扫描限制0 x0b//扫描位数寄存器

#define ShutDown0x0c //低功耗模式寄存器

#define DisplayTest0x0f //显示测试寄存器

#define ShutdownMode0x00 //低功耗方式

#定义常规操作0x 01//常规操作方法

#define ScanDigit0x07 //扫描位数设定,显示8位数码管

#define DecodeDigit0xff //解码设置,8位均为BCD码

#定义intensity grade0x0a//亮度级别设置

#define TestMode0x01 //显示测试模式

#define TextEnd0x00 //表示测试结束,返回正常动作模式

sbit DIN=P2^0; //MAX7219串行数据输入

sbit CLK=P2^2; //MAX7219串行时钟

sbit LOAD=P2^1; //MAX7219显示数据锁存控制

uchar disp _ buff [8]={ 9,1,2,7,10,10,1,5 }; //定义图形内存

/*******延迟时间t毫秒* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void Delay (单元) )。

{

uint i;

while(t----for ) I=0; i 125; I

++);
}
//**********向MAX7219写入一字节*****************
void SendChar (char ch)
{
    char i, temp;
    for (i = 0; i < 8; i++)  { //8位
      temp = ch & 0x80;        //取最高位
      CLK = 0;                 //时钟线置低
      if(temp)  DIN = 1;
      else      DIN = 0;
      ch = ch << 1;            //左移一位
      CLK = 1;     //上升沿,DIN的数据写入到7219
    }
}
//**********向MAX7219寄存器写入数据*************
void WriteWord (char addr, char num)
{
    LOAD = 0;        _nop_();
    SendChar(addr);  _nop_();
    SendChar(num);   _nop_();
    LOAD = 1;          //锁存
}
//**********把显存内容写入MAX7219***************
void Write7219 (void)
{
    char i;
    for (i = 0; i < 8; i++)  WriteWord(i + 1, Disp_Buff[i]);
    //7219的数据寄存器编号: 1~8
}
//**********MAX7219初始化***********************
void InitDisplay (void)
{
    WriteWord(ScanLimit, ScanDigit);      //设置扫描界限
    WriteWord(DecodeMode, DecodeDigit);   //设置译码模式
    WriteWord(Intensity, IntensityGrade); //设置亮度
    WriteWord(ShutDown, NormalOperation); //设置为正常工作模式
}
//----------------------------------------------
void main(void)
{  
    uchar  i, j, k;
    uchar code data_ilu[4][8] = { //I love U !
      0x00,0x00,0xc0,0xff,0xff,0xc0,0x00,0x00,  // I
      0x1c,0x3e,0x3f,0x9f,0x9f,0x3f,0x3e,0x1c,  //桃心
      0x00,0x7f,0xff,0x81,0x81,0xff,0x7f,0x00,  // U
      0x00,0x00,0x00,0xfd,0xfd,0x00,0x00,0x00}; // !

    InitDisplay();                     //MAX7219初始化
    WriteWord(DisplayTest, TestMode);  //显示测试,点亮所有LED
    delay(1000);                       //延时约1s
    WriteWord(DisplayTest, TextEnd);   //退出显示测试

    WriteWord(DecodeMode, 0x00);       //8位皆为非译码
 
    for (k = 0; k < 8; k++)  Disp_Buff[k] = 255;
    Write7219();                       //将缓存内容写入7219
    while(1)  {
      for (i = 0; i < 4; i++)  {
        for (j = 0; j < 8; j++)  {
          for (k = 7; k > 0; k--)  Disp_Buff[k] = Disp_Buff[k - 1];
          Disp_Buff[0] = data_ilu[i][j];
          Write7219();                 //将缓存内容写入7219
          delay(300);                  //延时约300ms
        }
        if (j == 8 && i != 3) delay(1000);
    } }
}
//================================================

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。