标题:
关于单片机MAX7219显示芯片级联的显示程序问题
[打印本页]
作者:
HSY666NB
时间:
2020-12-14 00:40
标题:
关于单片机MAX7219显示芯片级联的显示程序问题
我用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)
附鄙人单片机代码:
#define Max7219_pinDIN P1_7
#define Max7219_pinCS P1_6
#define Max7219_pinCLK P1_5
void Write_Max7219_byte(unsigned char DATA) //写入8位数据
{
unsigned char i;
for(i = 8;i >= 1;i--)
{
Max7219_pinCLK = 0;
Max7219_pinDIN = DATA&0x80;
DATA = DATA << 1;
Max7219_pinCLK = 1;
}
}
void Write_Max7219(unsigned char address,unsigned char dat,unsigned char num_Max7219)//向某个数码管写入16位数据
{
Max7219_pinCS = 1;
Delay_us(1);
Max7219_pinCS = 0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
if(num_Max7219 >= 1) Write_Max7219_byte(init[0][0]),Write_Max7219_byte(init[0][0]);
if(num_Max7219 >= 2) Write_Max7219_byte(init[0][0]),Write_Max7219_byte(init[0][0]);
if(num_Max7219 >= 3) Write_Max7219_byte(init[0][0]),Write_Max7219_byte(init[0][0]);
Max7219_pinCS = 1;
}
void Init_MAX7219(void) //初始化所有MAX7219
{
unsigned char i,j;
for(j = 0;j < 4;j ++)
{
for(i = 0;i < 14;i ++)
{
Max7219_pinCS = 0;
Write_Max7219(init[i][0],init[i][1],j);
}
}
}
复制代码
作者:
glinfei
时间:
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;
}
作者:
munuc_w
时间:
2021-1-18 11:27
只要级联都是使用同一个时钟,写第一个7219时,第一个7219内部的数据移到了第二个7219,如此。所以这种器件要级联使用,每次写数据必须全部刷新。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1