为了方便的观察测试结果,我习惯使用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; //i用于循环写入8位数据,dat用于缓存数据
CS_0(); //使能片选
if(C==1) //判断要写入的是指令还是数据
{
CD_1(); //等于1 就是数据
}
else
{
CD_0(); //等于0 就是指令
}
dat=data; //缓存数据
for(i=0;i<8;i++) //循环发送8位数据
{
if((dat&0x80)==0x80) //判断最高位是否为1
{
SDT_1(); //为1 拉高总线写入1
}
else
{
SDT_0(); //为0 拉低总线写入0
}
SCK_0(); //产生一个时钟
// Delay(5);
LED_On(1);
LED_Off(1);
LED_On(1);
LED_Off(1);
LED_Toggle(1);
LED_On(1);
LED_Off(1);
SCK_1(); //时钟结束
// Delay(8);
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显示的特定镜头: