笔者最近在弄金鹏的液晶屏,现在这个年代了,不跑点液晶屏程序实在是说不过去,如果能上3G模块,wifi模块那就更加好了。 这个液晶屏相对于其它液晶屏,它没有什么特别特殊的地方,前段时间,笔者用了一个不带字库的液晶屏,那叫一个痛苦,每次显示字符或者汉字还要算出它的字符码,而且它的逻辑比较难懂,不过最后写了一个函数,即在横坐标,纵坐标确定的后,写一个字符,液晶屏程序的封装就应该这样简单! 这个液晶屏的时序相信大家都看过,也都有自己的程序,笔者这次用的是LPC1700系列中的LPC1766,但是根据自己的程序结合着PDF上的时序,对照了很长时间,觉得一点问题都没有,最后还是出不来一个汉字,无奈之下,只能求助自己的导师,导师说,这个液晶屏许多人都做不出来,不是没有理解时序,而是时序对的情况下,写的代码也要匹配,否则看似时序对,其实也不能运行。 时序的问题,大家看pdf就一目了然了,pdf连接如下:http://wenku.baidu.com/view/789a261ca300a6c30c229ff7.html 下面附上LPC1766的初始化和时序代码,希望对大家有帮助: [cpp] view plain copy
- #define LCD_REQ (1 << 28)
- #define LCD_BUSY (1 << 27)
[html] view plain copy
- void LCDInit(void)
- {
- FIO1CLR |= LCD_REQ; //REQ置为低电平
- myDelay(10); //延迟,等待信号稳定
- FIO1CLR |= (0xff << 18); //将输出数据端口置为0
- }
[html] view plain copy
- void sendOneByte(uint8_t dat)
- {
- while(FIO1PIN & LCD_BUSY); //如果忙就一直等待,后期需要加延迟
- FIO1SET |= (dat <<18); //在P1.18~P1.25上输出为1的数据
- myDelay(10); //延迟等待数据稳定
- FIO1SET |= LCD_REQ; //REQ置为高,告诉LCD可以取数据
-
- while((FIO1PIN & LCD_BUSY )== 0); //等待LCD响应接收数据
- FIO1CLR |= LCD_REQ; //REQ置为低,撤销请求信号
-
- myDelay(200);
- FIO1CLR |= (0xff << 18);
- }
笔者用的是P1.18~P1.26表示DB0~DB7,P1.27为BUSY端,设置为输入,P1.28为REQ端 而这个字库也有一定的规律,比如“分“这个字,程序会解释为两个字节是183,,214(一个汉字为两个字节,高字节为183,低字节为214),而在字库的区位表中,它对应的是(23,54)聪明的你或许已经看出来它的规律了,没错它就是把汉字被程序解释后,高字节和低字节都减去160,就可以得到你输入的汉字,这是非常方便的 这里真是要给NXP一点建议,一个引脚输出高低,你至于每次都要用IOSET和IOCLR吗?这样很不方便,不如P1.18=1 就输出高电平这样来的直接,这虽然是51单片机的方法,但是是一个可取的方法,是值得学习的, 而且一个引脚难道不是输出就是输入码?难道它不能双端的,能输出能输入吗?在通讯中,这个是很重要的,能够大大减少负担,不然每次都要来回切换输入输出的方向,真的很烦人,编程应该方便程序员,而程序员编写的产品应该来方便大众!
|