51单片机带字库LCD12864液晶屏显示

51单片机带字库LCD12864液晶屏显示 目录1.LCD12864介绍1.1 带字库LCD128641.2 LCD12864管脚介绍1.3 功能设定1.4 清屏指令1.5 进入设定点1.6 显示状态开关设置1.7 显示区间1.8 不带字库LCD128642.硬件设计3.软件设计4.实验现象1.LCD12864介绍LCD12864跟LCD1602是一样的只是在行列数和显示像素上区别不同12864可以显示128个像素行有128个像素总共有64行所以根据像素点可以知道它是128 * 64个像素所以也叫12864显示屏。这种显示屏跟1602也是有区别的比如LCD12864它是以像素点的128 * 64个像素点而1602它是字符型一个液晶屏它显示是由5 * 7或者5 * 10为一个字符在字符与字符之间有一个间隔而且行与行之间也有一个间隔所以对于1602来说它不能完整显示一幅图因为它的每一个字符与每一个字符都有一个间隙而12864是完整的像素点也就是说在显示屏上面一行有128个像素点总共有64行它是构成完整的像素点那么可以根据要显示的东西进行点亮或者熄灭这就可以显示完整的图像了通常显示一个汉字需要16 * 16个像素点因此根据12864是128*64个像素点的话所以一行可以显示128 / 16 8个汉字可以显示64 / 16 4行一个汉字是2个字节一个字符是一个字节所以一个汉字相当于2个字符从上面左边图也可以看出第一行是2012-10-06这里两个字符相当于可以显示一个汉字20一个汉字12一个汉字-1一个汉字0- 一个汉字06一个汉字字符这里相当于可以显示5个汉字加上后面星期六三个汉字一共8个汉字一共显示了4行。除了可以显示汉字外还可以显示图形右边图这种可以从上图看出左边汉字字体和右边汉字字体不一样右边显示的字体更大不是左边那种字体中规中矩的那么右边的字体如何操作的呢这是因为12864左边图显示的汉字是以固定的模式来显示12864它是带字库的根据字库提取的数据显示的就是左边图这种汉字而右边图的字体汉字是通过我们自己用户去取模得到的一个汉字数据来发送到对应的坐标点上来显示而用户自己去取模的话可以根据需求我显示什么样的字体或者多大的都可以通过取模软件都可以实现通过对应的一个坐标点显示就行了。如果说是自己取模的话显示的字数或者是行数不一定是四行和一行八个字了比如右边这个图里面的字体明显比较大的可以看出一行最多显示5个汉字这么大的所以说并不是显示的一行汉字数量并不是严格意义上的八个严格意义的一行显示8个汉字是使用了我们LCD12864内部字库里面的数据我只能显示八个汉字或者16个字符 字符就是数字或者符号或者字母等等而我们取模的可以根据取模的字体大小来决定我是显示多少个如果说我取模的是比较小号的字体那么我们可能一行显示16个汉字或者一行显示10个等等。1.1 带字库LCD12864可以看出左边图这里显示的汉字是12864内部芯片自动取好的汉字的模那么我吧显示的数据存进去就行了对于12864显示汉字我们自己要显示什么汉字就写什么汉字芯片内部会自动转换12864已经完成了这个处理。可以看下12864的背面这个是带字库的12864的背面实物图可以看出中间三个黑色的圆是控制器字库芯片都在这里面它完成了汉字的解码。我们要显示什么汉字就输入对应的汉字就可以了这种带字库的汉字呢体积会比较大屏幕比较大可以看到带字库12864最下面是它的管脚可以看到总共有20个管脚它的管脚命名可以看下。1.2 LCD12864管脚介绍1号管脚VSS电源负极2号管脚VDD电源正极(5V)3号管脚VO对比度偏压信号这个跟前面介绍1602是一样的通过电位器可以调节 在我们12864背面有一个这种电位器但是我们不要自己去调节要是自己调节不好会显示的很暗很暗字可能就看不清楚了对方厂家已经设置好了就不需要动它这个电位器就是调节VO对比度的。4号引脚RS这个是用来对数据和命令的选择跟1602是一样的如果是高电平设置1它是对数据的进行选择如果设置低电平设置0它是对命令进行选择。5号引脚R/W这个引脚跟1602是一样的如果是高电平是用来选择读如果是低电平用来选择写通常对12864都是写的功能。6号引脚E使能信号跟1602是一样的。7号-14号引脚DB0 - DB7八位并行口通过一组单片机端口就可以实现控制。15号引脚16号引脚片选信号低电平有效通常这个地方给它接入GND或者单片机引脚输出低电平它是对左右半屏的像素点的使能。17号引脚RST复位引脚低电平有效。通常情况下这个引脚接入5V就可以了始终处于工作的状态。18号引脚负压输入输出端电压信号19号引脚背光正极20号引脚背光负极1.3 功能设定第一位和第二位设置0 0这里是RS和RW都设置的0 0RS设置0就是设置命令RW设置0写的操作最后两位任意值以及中间也有一位任意值x通常设置 0DL设置数据总线位数如果设置1是8位如果设置0是4位通常情况我们DL使用的是8位所以设置1RE:设置指令集选择控制位设置1就是扩充指令集设置0就是基本指令集但我们使用的是基本的指令集所以设置0这样一来设置的指令是0011 0000对应16进制编码是0X301.4 清屏指令这个清屏指令跟1602完全一样对应的16进制是0X01清除DDRAM的数据并且吧光标定位到第一行第一个位置。1.5 进入设定点这个用来设置光标屏幕移动方向等等前面6位是固定的0000 01可变的是I/D和S。D设置光标移动。如果I/D设置1光标向右移动如果I/D设置0光标左移。通常情况设置1S设置画面屏幕移动如果设置高电平画面整体左移动如果设置低电平画面整体右移动我们通常设置0不移动也就是画面右移动。所以这8位设置 0000 0110对应的16进制是0X061.6 显示状态开关设置前面5位固定0000 1D设置12864显示开关如果设置0显示关闭设置1显示开我们通常设置打开所以设置1C:设置光标开关如果设置0关闭光标设置1开启光标我们不想要光标所以设置0B光标闪烁如果设置0关闭光标闪烁设置1开启光标闪烁由于我们设置关闭光标所以这个光标闪烁设置就没有意义那么就设置0最终的8位设置是 0000 1100 对应的16进制是0X0C1.7 显示区间一行8个行有8个一共64个字节这里分了一区二区三区四区其中一区和而去是可以显示的对应的12864里面是可以显示的12864一行可以显示8个汉字可以显示4行其中一个汉字可以包括两个字节也就是说在80H要显示字符的时候可以显示2个字符同样81H也可以显示2个字符但是要显示汉字的话80H和81H只能显示各是1个汉字。对应地址值第一行首地址是80第一行是80 - 87第二行首地址是90第二行是90 - 97第三行首地址是88第三行是88 - 8F第四行首地址是98第四行是98 - 9F这个是12864实际能显示区域的地址位置。1.8 不带字库LCD12864这张图就是不带字库的12864的显示屏不带字库的12864体积通常比较小不带字库的12864背面没有相应的控制器汉字芯片等等它通常是一块转接板将12864显示屏转接到开发板上面相当于吧12864控制管脚转接到下面来屏幕呢本身有一块排线焊接到PCB板子上转出来它的控制管脚连接到开发板上面进行显示。这种显示屏的操作就跟带字库的12864显示屏一样所有的显示都需要取模取模方法跟点阵取模是一样的不带字库的12864从外形上看呢它的体积比带字库的体积要小很多因此我们称之为mili LCD12864对于mili 12864要想显示汉字或者字符都需要取模软件来实现的因为这个mili 12864是不带字库要显示汉字字符都需要取模取模将这些数据通过单片机发送到12864对应的坐标点上因为它是128*64个像素点吧对应的像素点点亮那么对应的组成就显示了对应的汉字或者是字符这种显示方式要比我们带字库的显示方式要复杂一些如果说要吧带字库的12864要显示其他一些图像其他一些汉字或者字体大小的汉字也是需要取模的这种使用方式也是跟不带字库的12864使用方式是一样的它完全是通过取模软件去取模将取模得到的数据通过我们单片机写入到对应的坐标来显示我们取模到的数据汉字或者图形。那这种不带字库的12864内部是含有控制器的通过控制器来控制12864对应的一些指令比如说用到的ST7565pST7793等等通过对控制器寄存器的操作来对12864mili来进行显示这种显示屏通常需要初始化初始化也就是对一些寄存器一些设置才能对12864操作这种操作通常比带字库的12864要复杂一些。2.硬件设计12GND和VCC3调节对比度12864背面去调节通常我们不管4RS引脚 连接在P2.65WR引脚 连接P2.56 EN引脚 连接P2.77 - 14连接到8位P0口1516控制片选信号 P3.2和P3.3用来控制左右半屏的点阵使能信号这两个管脚控制左右半屏控制17复位引脚低电平有效连接了VCC18偏压输出1920背光电源正极和负极3.软件设计实现功能带字库的LCD12864显示汉字、字符信息。main.cmain.c#includepublic.h#includelcd12864.hvoidmain(){lcd12864_init();lcd12864_show_string(0,0,Hello world!);lcd12864_show_string(0,1,哈喽哈喽!);lcd12864_show_string(0,2,欢迎使用51开发板);lcd12864_show_string(0,3,好好学习天天向上);while(1){}}public.c#includepublic.hvoiddelay_10us(u16 us){while(us--);}voiddelay_ms(u16 ms){u16 i,j;for(ims;i0;i--)for(j110;j0;j--);}public.h#ifndef_public_H#define_public_H#includereg52.htypedefunsignedintu16;typedefunsignedcharu8;voiddelay_10us(u16 us);voiddelay_ms(u16 ms);#endiflcd12864.c#includelcd12864.h//写命令voidlcd12864_write_cmd(u8 cmd){LCD12864_RS0;//低电平写命令LCD12864_WR0;LCD12864_EN0;LCD12864_DATAPORTcmd;delay_ms(1);LCD12864_EN1;delay_ms(1);LCD12864_EN0;}//写数据voidlcd12864_write_data(u8 dat){LCD12864_RS1;//高电平写数据LCD12864_WR0;LCD12864_EN0;LCD12864_DATAPORTdat;delay_ms(1);LCD12864_EN1;delay_ms(1);LCD12864_EN0;}//初始化12864voidlcd12864_init(void){lcd12864_write_cmd(0X30);//设置12864 8位数据 2行 基本指令集lcd12864_write_cmd(0x0c);//设置12864 开启显示功能 是否使用光标 光标是否闪烁//这里设置的不使用光标 如果设置不使用光标 光标闪烁设置0和1无所谓这里设置0lcd12864_write_cmd(0X06);//设置光标移动方向和显示屏移动//这里每当写入一个数据后光标后移动一位以及屏幕整体不动进行设置lcd12864_write_cmd(0X01);//清屏指令设置}//清屏voidlcd12864_clear(void){lcd12864_write_cmd(0x01);}//在指定的坐标显示字符串voidlcd12864_show_string(u8 x,u8 y,u8*str){u8 i0;if(y0)y0;if(y3)y3;x0x0f;//如果x超过16初始化x 16,x0 x16那么x的值是本身switch(y){//起始地址 x偏移量case0:x|0x80;break;//第一行起始地址case1:x|0x90;break;//第二行起始地址case2:x|0x88;break;//第三行起始地址case3:x|0x98;break;//第四行起始地址}lcd12864_write_cmd(x);while((*str)!\0){lcd12864_write_data(*str);str;}}lcd12864.h#ifndef_lcd12864_H#define_lcd12864_H#includepublic.hsbit LCD12864_WRP2^5;sbit LCD12864_RSP2^6;sbit LCD12864_ENP2^7;#defineLCD12864_DATAPORTP0//写命令voidlcd12864_write_cmd(u8 cmd);//写数据voidlcd12864_write_data(u8 dat);//初始化12864voidlcd12864_init(void);//清屏voidlcd12864_clear(void);//在指定的坐标显示字符串voidlcd12864_show_string(u8 x,u8 y,u8*str);#endif4.实验现象