钻石会员
  
主题
帖子
积分11732
阅读权限50
注册时间2013-9-14
最后登录1970-1-1
在线时间 小时
|
本帖最后由 gongzhu 于 2014-8-2 16:58 编辑
最近玩max7219,单个显示是没有问题的,并联也没有问题,现在级联(3块)的时候出现了一个怪问题,发送第一块max7219的数据时,常会传到后级上去。
1、如果第一个max更新的话,后两个也会更新成一样的数据。
2、如果3个同时更新,第二、三个会在更新的时候闪烁下,特难看。
3、如果第一块不更新,第二三块更新是没有任何问题的。
下载了两个案例,因为是静态从前往后显示的,并未更新,所以调试是看不出问题的,一旦动态更新就出现以上问题。
按经验应该是时序上面的问题,最近常加夜班,头昏脑涨,犯迷糊,希望大神给指点指点:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit din = P3 ^ 5;
sbit load = P3 ^ 6;
sbit clk = P3 ^ 7;
uchar number;//初始化单片机,不多说了,number是待会要显示的数
void write(uchar pos, num) //先输出8位地址,再输出8位数据
{
uchar LEDnum = pos, i;
clk = 0;
din = 0;
load = 1;
load = 0; //小心的按照时序图来到这一步,要用DIN输出地址了
for(i = 0; i < 8; i++)
{
lednum = lednum << 1; //移位到CY
din = CY; //输出CY
clk = 1; //上升沿锁定!
clk = 0; //恢复0等待下一数据
}//for
lednum = num; //把数据准备好写入
for(i = 0; i < 8; i++) //重复一遍写入数据
{
lednum = lednum << 1;
din = CY;
clk = 1;
clk = 0;
}//for
load = 1; //最后LOAD上升作为收尾
}
void send(uchar op)//发送语句的for部分,第二、三、四片写入数据专用
{
uchar lednum = op, i;
for(i = 0; i < 8; i++) //只完成DIN发送数据部分即可
{
clk = 0;
lednum = lednum << 1;
din = CY;
clk = 1;
}//for
}
write2(uchar pos, num) //第二片7219写入数据函数,原理是LOAD成为低电平16.5 个周期后DOUT从头开始输出地址和数据,而7219会保留收到的最后一组地址和数据(16字节)!
{
load = 0; //LOAD降低,准备输入地址、数据
send(pos);//地址
send(num);//数据
send(0);//输入空操作
send(0);//输入空操作
load = 1; //收尾LOAD升高
}
write3(uchar pos, num) //同理,多输出一对空操作数
{
load = 0;
send(pos);
send(num);
send(0);
send(0);
send(0);
send(0);
load = 1;
}
void init()
{
write(0x0c, 1); //开启正常工作模式 1正常 0关闭芯片
write(0x0f, 0); //显示测试 正常工作0 全亮1
write(0x09, 0xff); //解码方式 0xff全译码,全译码就是输出数据0x07就显示7!
write(0x0b, 0x07); //8只LED全用
write(0x0a, 2); //亮度为10
write2(0x0c, 1); //开启正常工作模式 1正常 0关闭芯片
write2(0x0f, 0); //显示测试 正常工作0 全亮1
write2(0x09, 0xff); //解码方式 0xff全译码
write2(0x0b, 0x06); //8只LED全用
write2(0x0a, 2); //亮度为10
write3(0x0c, 1); //开启正常工作模式 1正常 0关闭芯片
write3(0x0f, 0); //显示测试 正常工作0 全亮1
write3(0x09, 0xff); //解码方式 0xff全译码
write3(0x0b, 0x07); //8只LED全用
write3(0x0a, 2); //亮度为10
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
init();//初始化3片7219,里面的write,write2,write3就是分别向3片7219写入数据的程序!
for(number = 1; number < 9; number++) //简单的循环,让3片7219都显示出1~8,顺序相反
{
write(number, number-1);
write2(number, 9 - number);
write3(number, number);
}
while(1)//进入无限循环
{
Delay500ms();
for(number = 1; number < 9; number++) //简单的循环,让四片7219都显示出1~8,顺序相反
{
write(number, number-1); // 只循环此句的话,3块max全部更新成一样的数据
//write2(number, 9- number);
//write3(number, number+1);
}
};
}
原文章,号称西门子手册:
max7219芯片4片级联C51程序与电路.pdf
(882.59 KB, 下载次数: 319)
|
|