max7219和74hc595驱动模块,有什么区别。做点阵的话。用那个模块比较好。

max7219和74hc595驱动模块,有什么区别。做点阵的话。用那个模块比较好。,第1张

点阵MAX7219合适,MAX7219有8x8的数据寄存器,可以自动扫描显示一张静态图形。而74HC595,只有8位的数据寄存器,显示一张静态图形,需要靠单片机程序编写扫描来完成。简而言之,MAX7219里的寄存器可以记住64个点阵的亮灭,这就形成8x8点阵图了,而74HC595只能记住单行的,要编程序重复一行行扫描才能形成8x8的点阵图。

你试试看我更改后的程序

void LieHC595(uchar SendVal,uchar SendVal2)

{

   uchar i;

   for(i=0;i<8;i++)

   {

      if((SendVal<<i)&0x80)LSer=1;

      else LSer=0;

      LSck=0;

      _nop_();//短暂延时产生一定宽度的脉冲信号

      _nop_();//短暂延时

      LSck=1;

   }

   for(i=0;i<8;i++)

   {

      if((SendVal2<<i)&0x80)LSer=1;

      else LSer=0;

      LSck=0;

      _nop_();//短暂延时产生一定宽度的脉冲信号

      _nop_();//短暂延时

      LSck=1;

   }

   LRck=0;

   _nop_();//短暂延时

   _nop_();//短暂延时

   LRck=1;//0到1:锁存器输出

   _nop_();//短暂延时

   _nop_();//短暂延时

   LRck=0;//1到0:锁存器锁存

}

void word()

{

   uchar i;   

   while(1);

   {

      HSer=0; 

      for(i=0;i<16;i++)//行计数

      {

         //列转换

         HSck=0;    //位移时钟 

            _nop_();//短暂延时产生一定宽度的脉冲信号

            _nop_();//短暂延时

         HSck=1;

         

         _nop_();//短暂延时

         HRck=1;//0到1:锁存器输出

            _nop_();//短暂延时

            _nop_();//短暂延时

         HRck=0;//1到0:锁存器锁存

         

         HSer=1;

         

         //数据显示        

         LieHC595(table[i2],table[i2+1]);//更新该列显示数据

         delay2ms();      

         LieHC595(0x00,0x00);//清除该列显示

         //如果1为灭则将上行改为 LieHC595(0xff,0xff);

      }

   }

}

#include<reg52h>

sbit HC595_DS = P2^0;

sbit HC595_STCP = P2^1;

sbit HC595_SHCP = P2^2;

sbit HC595_OE = P2^3;

void HC595_WriteByte(unsigned char value)

{

unsigned char i;

for(i=0;i<8;i++)

{

HC595_SHCP = 0;

HC595_DC = value&(0x80>>i);

HC595_SHCP = 1;

}

}

void Lattice_WriteData(unsigned char buffer,unsigned char value,value1)

{

while(buffer)//列扫描

{

HC595_WriteByte(buffer++);

}

HC595_WriteByte(value);//行数据低八位

HC595_WriteByte(value1);//行数据高八位

HC595_STCP = 0;

HC595_STCP = 1;

}

unsigned char buffer[8]={0x01,0,0,0,0,0,0,0};//64列

void main()

{

HC595_OE = 0;

HC595_OE = 1;

//假设行低电平有效,列高电平有效,显示效果为第一行,第一列坐标为(0,0)的像素点亮,其他均不亮

Lattice_WriteData(buffer,0xfe,0xff);

while(1)

{

}

}

//如有问题,可再咨询

你的那个有点混乱,都不知道要干嘛,你看看这个

/

/                                                                

/ 单片机开发系统演示程序                                                  

/                                                                

/                                                                

//

#include <reg52h>                                    //51芯片管脚定义头文件

#include <intrinsh>                                //内部包含延时函数 _nop_();

#define uchar unsigned char

#define uint  unsigned int

sbit  SDATA_595=P1^5;                                 //串行数据输入  ----接板卡上的SPI

sbit  SCLK_595 =P1^6;                               //移位时钟脉冲  ---接板卡上的SPO

sbit  RCK_595  =P1^7;                               //输出锁存器控制脉冲 ----接板卡上SPK

sbit  CS_LED8   =P1^1;                                //数码管片选 --------接板卡上的CS

sbit  CS_1302   =P1^4;                                //ds1302片选

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,

                    0x6d,0x7d,0x07,0x7f,0x6f,

                    0x77,0x7c,0x39,0x5e,0x79,0x71};    //数码管编码(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F)(共阴极数码管)

uchar  dis[8];                                        //显示缓冲区

void  delay(uint );

void  display();

/

                                                      

 延时函数                                             

                                                      

/

void  delay(uint dt)

{

   uint i;

   uchar bt;

   for(i=0;i<dt;i++)

   for(bt=0;bt<200;bt++);

 }

/

                                                      

    定时中断函数                                       

                                                      

/

void timer0(void)    interrupt 1

{

    TH0=0XFC;

    TL0=0X66;

    display();

}

/

                                                      

 显示函数                                               

                                                      

/

void display()

{

    uchar num,c,i;

    for(i=0;i<8;i++)

    {

        num=dis[i];

        CS_LED8=0;

        for(c=0;c<8;c++)                            //写入显示数据

        {

            SCLK_595=0;

            num=num<<1;

            SDATA_595=CY;

            SCLK_595=1;

            SCLK_595=0;

        }

        num=~(1<<i);

        for(c=0;c<8;c++)                            //写入数码管序号

        {

            SCLK_595=0;

            num=num<<1;

            SDATA_595=CY;

            SCLK_595=1;

            SCLK_595=0;

        }

        RCK_595=0;

        _nop_();                                    //短延时

        _nop_();

        RCK_595=1; 

        _nop_();

        _nop_();

        RCK_595=0;                                    //显示数据输出

        delay(1);

        CS_LED8=1;

    }

}

/

                                                      

 主函数                                               

                                                      

/

main(void)

{

    uchar k;

    TMOD|=0x01;

    TH0=0XFC;

    TL0=0X66;                                        //定时器初始化

    TR0=1;

    EA=1;

    ET0=1;

//    IP=0X10;

    

    CS_1302=0;                                        //屏蔽1302的信号

    for(k=0;k<8;k++)

    {

        dis[k]=table[k];                            //将显示内容送入显示缓冲区

    }

    

    while(1);

} //end of main()

74HC595有4个端口很重要:串行输入端、时钟输入端、使能端和串行输出端。如果要级联,那么就是上一级的输出端接下一级的输入端,时钟和使能端分别共用。这样就可以多个级联在一起了。那么点阵显示就是8个位的数据端+n个公共端。如果是两个74HC595级联就是8×8点阵,如果是3个级联就可以是8×16点阵,也就是说一个74HC595做数据端,其他74HC595做公共端控制。然后就是点阵显示,可以串行输出数据接着再串行输出公共端控制(具体看点阵的接法),关键是先数据和公共端都输出后再做使能控制,这样就可以防止串行动作时出现显影。

这是16X16的,自己一改就好了

//74HC595练习程序

//串入并出实现16流水灯效果

//20091228

#include"reg52h"

sbit shcp=P2^0; //数据在上升沿进入移位寄存器

sbit date1=P2^1; //串行数据输入端

sbit clock=P2^2; //上升沿时将数据输出到并行端口

unsigned char tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

unsigned char tab1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

void delay(unsigned int delay)

{

unsigned char i;

for(;delay>0;delay--)

for(i=0;i<125;i++);

}

void send_data(unsigned char date) //发送数据

{

unsigned char i;

for(i=0;i<8;i++) //把每一位数据移入寄存器

{

shcp=0;

date=date<<1;

date1=CY;

shcp=1;

delay(20);

}

}

void main()

{

unsigned char k;

for(k=0;k<16;k++)

{

send_data(tab[k]);

send_data(tab1[k]);

{clock=0;clock=1;};

}

}

以上就是关于max7219和74hc595驱动模块,有什么区别。做点阵的话。用那个模块比较好。全部的内容,包括:max7219和74hc595驱动模块,有什么区别。做点阵的话。用那个模块比较好。、单片机和74HC595级联驱动的点阵为什么会有闪烁,595不是微秒级的吗、51单片机+10片 74hc595 控制16*64点阵屏显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9451820.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存