本次驱动的是一块192*64点阵LCD屏,代码是从其他项目移植过来的,按理最多只需要调整写操作的延时就行的,所以编译下载后LCD屏幕毫无反映也在我的意料之中。为了延时更准确,我没有用常规的FOR循环,而是换用了MCC配置器中的DELAY_microseconds()函数,配合逻辑分析仪抓取的时序,将写操作的时钟控制在数据手册范围(如下图):
可尽管时序比较规范,但LCD显示屏却没有显示出正确字符,粗看上去象花屏一般:
反复检查代码和修改测试都没有解决问题,顿时有措手无策的感觉,后来经过仔细观察,发现屏幕上全屏显示出的是杂乱无章的字符,也就是说字符显示函数是基本正确的,只是调用部分出了问题:
此时才回忆起原来在测试Atmega4809和AVR128DA48现款AVR评估板时也遇到过相同的问题,也就是数组指针的传递问题。 我在调用时是将要显示的字符作为数组传递到显示函数中,代码如下:
LCD_write_BG(4,0,(uint8_t *)"Microchip AVR128DB48核心板");
在显示函数中接收这些参数:
void LCD_write_BG(uint8_t X,uint8_t Y,uint8_t *stru)
这在其他类型的单片机中使用没有发现过问题,但不知何故在AVR单片机中却不行。
找到原因后,我只好改写代码,每次仅显示一个字符,硬生生地将原本的一行代码拆解成N行:
通过拆解之后,屏幕上终于成功显示出了正确的字符:
|