为了方便的观察测试结果,我习惯使用LCD来显示,代码是从之前测试其他开发板移植过来的,按惯例只要修改引脚宏定义,然后调整一下时钟的延时就OK了,其他代码都是多次测试通过了的。可这次却遇到了一个奇怪的问题——调整延时丝毫不起作用,无论我如何修改延时的空循环次数,引脚的时序却一成不变。改换延时函数名称、改变延时函数的位置,各种方法都尝试过,依旧不能解决问题,最后只好用多个控制LED亮灭的代码才实现延时的目的。
下面是我的延时函数:
- void Delay(uint8_t xms)
- {
- uint8_t x,y,z;
- for(x=xms;x>0;x--){
- for(y=200;y>0;y--){
- for(z=200;z>0;z--);
- }
- }
-
- }
在其他项目中只有两个循环,第二个循环一般在110之内,这次测试改成200次都无效果,再加一个循环也无济于事,甚至于我注释掉循环代码,时序毫无变化,就如同这行代码从未执行一样。下图为逻辑分析仪抓取的时序图,时钟高电平时间为0.625微秒,低电平时间为0.2917微秒,正常情况应该分别为5微秒。
下图为注释掉延时代码行的时序图,竟然与上图毫无变化:
下面是LCD写数据的函数,最后是通过操控LED来达到延时效果:
- void WriteData(unsigned char data, unsigned char C)
- {
- unsigned char i,dat;
- CS_0();
- if(C==1)
- {
- CD_1();
- }
- else
- {
- CD_0();
- }
- dat=data;
- for(i=0;i<8;i++)
- {
- if((dat&0x80)==0x80)
- {
- SDT_1();
- }
- else
- {
- SDT_0();
- }
- SCK_0();
-
- LED_On(1);
- LED_Off(1);
- LED_On(1);
- LED_Off(1);
- LED_Toggle(1);
- LED_On(1);
- LED_Off(1);
-
- SCK_1();
-
- LED_On(1);
- LED_Off(1);
- LED_On(1);
- LED_Toggle(1);
- LED_On(1);
- LED_Off(1);
-
- dat<<=1;
- }
- CS_1();
- }
LCD驱动虽然完成了,但这个延时函数无效的原因仍未找到,不知道其他坛友会不会也遇到类似问题。
下面是通过操控LED达到延时目的后的时序图:
下图为测试实验时的照片:
这是LCD显示的特定镜头: