做点阵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点阵屏显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)