看了你的问题,想你是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位
}