我用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);
- }
- }
- }
复制代码 |