为了完全的弄明白关于静态数码管的串行显示原理故写了如下的程序<br />MCU:C8051F020<br />MC74HC164N<br />6个数码管 用的SPI的串行输出<br />char code <br />table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};<br />void Display(char *buf)<br />{<br /> char ch;<br /> int i;<br /> for(i=5;i>=0;i--)<br /> {<br /> ch=buf;<br /> if((ch>='0')&&(ch<='9'))<br /> {ch-='0';}<br /> else ch=10;<br /> <br /> SPI0DAT=table[ch];<br /> while(!SPIF); <br /> SPIF=0; //调试时候用的定位行<br /> if(i==2)Delay(1000);<br /> }<br /><br />}<br />延时程序用的定时器3来实现的(为了练手用的定时器3)<br />int Delay(int time)<br />{<br /> timer=time;<br /> TMR3CN=0x04;<br /> while(timer);<br /> TMR3CN=0x00;<br />}<br />主程序调用为 Display("654321");<br />照此程序全速执行 其显示结果为 先显示 4321** (**为不确定的) <br /> 1s后显示为 432165<br /> (????此处即有点不明白了,按照74ls的移位的原理来说不是应该显示为 654321 吗)<br />此后为了解决问题, 进行了调试 在上面所示的定位行处 按了4次 执行到当前行 LED显示为 4321**<br /> 此时ch=0x04 i==0x02 <br /> 问题即将发生了 由于i==2 进入延时子程序,当跳出子程序后 ch的值改变为0xE8了<br /> (???怎么变了呢,内存溢出,堆栈出错?)<br /> 此后 再执行ch=buf时候 也不能正确的赋值了<br /> 照此调试完后 显示为 654321 <br /> (???怎么全速和单调的显示结果不一样了呢)<br /> <br /> 到此请各位看官不吝金言,给小弟指点下,问题出在哪里呢,或者我该去加强哪一方面的能力以获得解决问 题和避免此问题的再次发生的能力.<br /> |
|