问题简要描述:在刷液晶的时候出现了不应该出现的点。
硬件平台:基于C8051F060的单片机系统,外扩32K内存,及128*64LCD,以及其它。 软件平台:SILICON LAB IDE,调用KEIC51编译器内核,版本是V7.06
问题详细描述: 1、顺利调通了人机界面部分。 2、AD采样部分也已经独立测试通过。 3、现在需要把AD部分的程序添加到整个系统当中,然后问题就出现了,在液晶显示的过程当中出现了坏点。
其实我添加的代码只是参与了编译,我还没有调用它。因此在逻辑上,我认为添加的代码是不会影响到它的。剔除掉AD部分的代码可是一切都正常的啊。我查看了资源还是够用的。在仔细跟踪出现乱码的代码部分,如下:
/********************************************************************* Description:清除区域 Input: x0:左上角x坐标 x1:右下角x坐标 y0:左上角y坐标 y1:右下角y坐标 Output:
Return:
Gloable: Calls: GUI_DrawHLine_();画线,反色
Called By: Others:
Modify Record: *********************************************************************/ void GUI_ClearRect(UINT8 x0,UINT8 x1,UINT8 y0,UINT8 y1) { UINT8 i; for(i=y0;i<=y1;i++) { GUI_DrawHLine_(x0, x1,i); // Display(); } }
/********************************************************************* Description:画水平线,实线,反显,用于擦出区域调用 Input:
x0:起点x坐标 x1:终点x坐标 y:y坐标 Output:
Return:
Gloable: DisBuffer[]:图形缓冲
Calls:
Called By: Gui_Clearall(); Others:
Modify Record: *********************************************************************/ void GUI_DrawHLine_(UINT8 x0,UINT8 x1,UINT8 y) { // 000000XX XXXXXXXX .... XXXXXXXX XX000000 Location_Bit // | | // | | // Location_Byte0 Location_Byte1 UINT16 Location_Byte0,Location_Byte1; UINT8 Location_Bit; UINT16 i; //Location_Byte0=(y/8)*X_PIXEL+x0; //Location_Byte1=(y/8)*X_PIXEL+x1; Location_Byte0=(y/8)*(X_PIXEL)+x0; Location_Byte1=(y/8)*(X_PIXEL)+x1; Location_Bit=(y%8);
for(i=Location_Byte0;i<=Location_Byte1;i++) { DisBuffer&=(~(0x01<<Location_Bit)); // uart0_send(DisBuffer); } // Display(); _nop_(); }
从表面上看来,出现问题的地方是这两个函数,我不知道这是不是只是表像。
这是一段擦除一片矩形区域的代码。擦除是按行擦除的,一行一行的擦除,我擦出每一行后再输出图形缓冲到LCD看效果,在其中某连续的几行出现了问题,图形缓冲出现了不应该有的变化(不是程序的作为啊),可以肯定LCD没有坏,我把图形缓冲还发到了串口来观察,现象和LCD显示效果是一致的。
那么到底是什么改变了图形缓冲的内容呢?这个时候我的定时器中断以及外部中断都屏蔽了啊,即使没有屏蔽,这些中断响应也没有做任何改变图形缓冲内容的工作。
从网上看了一些关于KEIL BUG的**,说对0XFD字符的过滤,我不知道这个过滤会出现什么样的后果。我在网上搜了一个补丁,还是不管用,补丁版本似乎有些不对,平台用的是V7.06,而补丁说是支持V7.00,不知道是不是补丁没有起作用?但是在单独调试人机界面的时候是没有出问题的,为什么不在那个时候过滤呢?
实在是找不出还有什么别的原因了,希望大家献计献策啊,不尽感激! |