看了你的问题,想你是IO口模拟的SPI通讯。当问到关于时序问题时,你得先说说你的MCU工作频率多少,别人才好跟你分析。首先你确定你的电路硬件有没有接错,确定无误再分析程序问题。一般逛坛子的人很少看你的源代码,天天看一堆程序都烦了,哪有心思还分析你的程序。所以你这种直接我什么搞不定,然后贴一段程序的很少将问题得到解决。如果你有示波器,可以抓个波形分析一下问题。解决问题的关键就在于仔细阅读数据手册。max7219我以前搞过,好像坛子里面也有问这个程序的。你可以找出来看看。如果你确实需要,给你一个我测试成功的代码。51单片机外接12M晶振。
#define _7219_CS P2_1 #define _7219_MOSI P2_0 #define _7219_CLK P2_2
#define SELECTED 0 #define UNSELECTED 1
/********************************************** * Function: void write_7219(unsigned char a, unsigned char b) * Input Variables: unsigned char a, unsigned char b * Return Variables: None * Usage: Write to 7219 **********************************************/ void write_7219( unsigned char addr, unsigned char dat ) { unsigned char i;
_7219_CS = SELECTED; //发送地址 for(i=0;i<8;i++) { _7219_CLK=0; //清零时钟总线 _7219_MOSI=(bit)(addr&0x80); //每次取高字节 addr<<=1; //左移一位 _7219_CLK=1; //时钟上升沿,发送地址 }
//发送数据 for(i=0;i<8;i++) { _7219_CLK=0; _7219_MOSI=(bit)(dat&0x80); dat<<=1; _7219_CLK=1; }
_7219_CS = UNSELECTED; }
/********************************************** * Function: Init7219() * Input Variables:void * Return Variables: None * Usage: Init 7219 **********************************************/ void Init7219() { write_7219(0x0c,0x00); // 关闭MAX7219,对7219进行配置 _nop_(); // nop _nop_(); // nop _nop_(); // nop write_7219(0x0a,0x05); // 调整亮度 write_7219(0x09,0xff); // 模式设置,全部解码操作 write_7219(1,0x0f); // blank write_7219(2,0x0f); // blank write_7219(3,0x0f); // blank write_7219(4,0x0f); // 四位数码全部blank write_7219(0x0c,0x01); // 启动7219 write_7219(0x0b,0x03); // 扫描位数 4位 } |