我用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);
- }
- }
- }
復制代碼 |