Ⅰ 为什么51单片机总线控制LCD12864的时候P0口可不要上拉电阻,而用位操作的时候必须接上拉
P0仅作为地址读写时,不用加上拉电阻;但如果P0同时作为I/O口使用,则要加上拉电阻。不过,现在很多单片机(如STC等),它可以通过软件设置其I/O口的为弱上拉、强上拉或高阻模式,针对这类单片机则可以不加上拉电阻。
Ⅱ 【51单片机】LCD12864显示字符和图片
本次所使用的显示屏为AMPIRE 128x64 Graphical LCD with KS0108 controllers。它自身并不带字库,因此,如果想要在显示屏上显示字符,必须通过取模软件自制字库。
AMPIRE12864显示屏由左右两个半屏组成,分别由两片控制器控制,控制引脚为CS1和CS2。每个控制器内部有64*64位的RAM缓存区,每个半屏有8页、64列,每页包含8行。一个中文字符的显示需要16*16个点,因此整个显示屏最多可显示32个中文字符,每两页显示一行,共可显示4行。
AMPIRE12864的控制指令包括:
1、显示开关设置:将D设置为0可以关闭显示(指令为0x3F);设置D为1则可以开启显示(指令为0x3E)。显示开关不影响显示存储器的内容。
2、显示起始行设置:通过设置L5~L0来指定显示起始行,可表示1-64行(当L5~L0为0时,指令为0xC0)。执行此命令后,设置的行将显示在屏幕第一行。显示起始行存储在Z地址计数器中,具有循环计数功能,每扫描一行就自动加一。通过定时长、等间距地修改此指令,可使显示屏内容呈现向上或向下平滑滚动的显示效果。
3、页面地址设置:使用P2~P0来指定页地址,可表示1-8页(当P2~P0为0时,指令为0xB8)。该指令规定了后续读写操作将在哪一页进行,除非重新设置该地址,否则均在该页进行。页地址存储在X地址计数器中,读写数据对页地址没有影响。
4、列地址设置:通过设置C5~C0来指定列地址,可表示1-64列(当C5~C0为0时,指令为0x40)。执行该指令后,后续的读写操作将在该列进行。列地址存储在Y地址计数器中,具有自动加一功能,每一次读写数据后自动加一。进行连续读写时,列地址只需设置一次即可。
5、读取状态字:通过检查BUSY、ON/OFF和RESET来判断控制器的状态。BUSY=1表示控制器正在处理指令或数据,不再接受除读状态字以外的操作,单片机需要等待;BUSY=0表示控制器准备就绪,可接受指令。ON/OFF=1表示显示状态为关状态;ON/OFF=0表示显示状态为开状态。RESET=1表示显示屏处于复位状态;RESET=1表示显示屏处于正常工作状态。
6、读写数据:写指令时,将RS设置为0,R/W设置为0,D0~D7为指令码,E在下降沿时写入指令。写数据时,将RS设置为1,R/W设置为0,D0~D7为数据,E在下降沿时写入数据。读状态时,将RS设置为0,R/W设置为1,E在下降沿时读取显示屏状态,D0~D7为状态码。
为了在AMPIRE12864上显示字符和图片,需要通过取模软件提取字符和图片的字模。提取字符和图片字模的过程如下:
1、首先,将图片使用Windows自带的画图软件打开,调整图片大小(例如64x64像素),并另存为单色位图(bmp格式)。
2、然后,打开取模软件(如PCtoLCD2002),导入保存的单色位图图像,设置好字模生成选项后,点击生成字模即可。
(注:AMPIRE12864的像素点在低电平时显示蓝色,高电平显示黑色,因此在取模时应选择阳码;取模方式可选择列行式;每行显示点阵数据根据图像大小来选择,这里选择64。)
对于汉字字模提取,应遵循先左后右、先上后下的顺序提取字模。一个汉字需要16*16点,占据2页、16列,因此应先提取这一页的16列数据,再提取下一页的16列数据,形成一个汉字的字模数据,显示时按照顺序写入对应DDRAM地址即可。
最后,下面是一个简单的示例代码,用于说明如何在AMPIRE 128x64 LCD上显示字符和图片:
main.c代码:
LCD12864.c代码:
LCD12864.h代码:
Ⅲ LCD12864的屏总是在闪,我是用51单片机做的,屏带字库,补充里是整个程序,怎么解决谢谢
看了你的程序,问题在while里面。没必要循环初始化你的LCD,将初始化程序放到主函数中。你的显示函数中也已经包含了清屏指令,不需要在while里面再次加入清屏指令。如果一定要用,建议你在所有清屏指令后加入的延时够大。清屏指令过多,延时太少的话,相当于清屏之后又写入,再清屏再写入,你看到的就是闪了。