Protues中单片机驱动lcd12864液晶显示屏仿真:Protues中lcd12864是无字库的,要让它显示一个数字或者汉字或者图片,都需要先对其取模。那么首先介绍介绍一款比较好用的取模软件,百度搜索“zimoV2.2”就可以了。下面先介绍这个取模软件的使用方法:1.打开软件,界面如下:2.通常我们显示汉字用的是16×16的像素大小,而显示数字用的是16×8的格式,那么选择文字输入区字体选择,弹出的界面选择如下:3.其次在“其他选项”中,选择如下:4.上面设置好之后我们就可以在文字输入区输入汉字了,以“Ctrl”+“Enter”结束:5.然后点击“C51格式”,在点阵生成区就会出现相应的模如下,我们可以把每个汉字对应的模存放在相应的数组中:上面为取模软件的使用方法,下面开始正式教给读者单片机驱动lcd12864液晶显示屏的方法,在这之前,需要对无字库lcd12864液晶显示屏有个基础的了解,相关引脚如下:管脚名称LEVER管脚功能描述VSS0电源地VDD+5.0V电源电压V0-液晶显示器驱动电压D/I(RS)H/LD/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据R/WH/LR/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DREH/LR/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0DB0H/L数据线DB1H/L数据线DB2H/L数据线DB3H/L数据线DB4H/L数据线DB5H/L数据线DB6H/L数据线DB7H/L数据线CS1H/LH:选择芯片(右半屏)信号CS2H/LH:选择芯片(左半屏)信号RETH/L复位信号,低电平复位VOUT-10VLCD驱动负电压LED+-LED背光板电源LED--LED背光板电源通过控制CS1和CS2可以用来使能左半屏和右半屏,两个半屏的页和列都是相同的,如下图:根据上图,如果我们需要在某个位置显示相应内容,如在左半屏的第0页和第2页的第0列至第15列的区域里显示汉字“农”。按照上面的描述,我们就不需要在深究lcd12864液晶显示屏的内部原理以及相关指令,我们需要一个封装好的C模块文件(API),直接调用对应的函数即可。具体如下:(1)假设有一个已经编写好的函数LCDWriteNum(charleftright,charpage,charcolumn,charnum[]),参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),参数page用来选择在哪一页显示(0~7),参数column用来选择在哪一列显示(0~64),参数num[]即为待显示数字的模。这样我们要在12864的左半屏第2页和第3页的第3列至第10列的16×8区域里显示数字5,可以调用函数LCDWriteNum(‘L’,2,3,num5[])即可(num5[]数组为数字5的模)。(2)假设有一个已经编写好的函数LCDWriteNumBlack(charleftright,charpage,charcolumn,charnum[]),参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),参数page用来选择在哪一页显示(0~7),参数column用来选择在哪一列显示(0~64),参数num[]即为待显示数字的模。这样我们要在12864的左半屏第2页和第3页的第3列至第10列的16×8区域里以黑色背景来显示数字5,可以调用函数LCDWriteNumBlack(‘L’,2,3,num5[])即可(num5[]数组为数字5的模)。(3)假设有一个已经编写好的函数LCDWriteChinese(charleftright,charpage,charcolumn,charchinese[]),参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),参数page用来选择在哪一页显示(0~7),参数column用来选择在哪一列显示(0~64),参数num[]即为待显示汉字的模。这样我们要在12864的左半屏第2页和第3页的第3列至第10列的16×8区域里显示汉字“农”,可以调用函数LCDWriteChinese(‘L’,2,3,nong[])即可(nong[]数组为汉字“农”的模)。(4)假设有一个已经编写好的函数LCDWriteChineseBlack(charleftright,charpage,charcolumn,charchinese[]),参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),参数page用来选择在哪一页显示(0~7),参数column用来选择在哪一列显示(0~64),参数num[]即为待显示汉字的模。这样我们要在12864的左半屏第2页和第3页的第3列至第10列的16×8区域里以黑色背景来显示汉字“农”,可以调用函数LCDWriteChineseBlack(‘L’,2,3,nong[])即可(nong[]数组为汉字“农”的模)。下面附上lcd12864模块代码:lcd12864.h文件内容:#ifndef__LCD12864_H#define__LCD12864_H#includereg51.h#defineLCDDispOff0x3e#defineLCDDispOn0x3f#definePageAdd0xb8//页地址#defineLCDColAdd0x40//列地址#defineStartLine0xc0//行地址#defineLCDDataP0sbitLCDCs1=P2^0;//片选1sbitLCDCs2=P2^1;//片选2sbitLCDRet=P2^2;//复位端sbitLCDRw=P2^3;//“数据/指令”选择sbitLCDRs=P2^4;//“读/写”选择sbitLCDEn=P2^5;//“读/写”使能/*函数声明,供模块内部使用*/staticvoidLCDDelay(chart);//延时函数staticvoidCheckState();//检测忙标志staticvoidwrite_com(charcmdcode);//写指定staticvoidwrite_data(charLCDDispdata);//写数据/*函数声明,外部调用*/voidLCDInit();//12864初始化voidLCDClear();//12864清屏voidLCDWriteChinese(charleftright,charpage,charcolumn,charchinese[]);//12864指定页指定列显示一个汉字voidLCDWriteChineseBlack(charleftright,charpage,charcolumn,charchinese[]);//12864指定页指定列显示一个汉字,以黑色背景白色文本显示voidLCDWriteNum(charleftright,charpage,charcolumn,charnum[]);//12864指定屏指定页指定列显示一个数字voidLCDWriteNumBlack(charleftright,charpage,charcolumn,charnum[]);//12864指定屏指定页指定列显示一个数字,以黑色背景白色文本显示#endiflcd12864.c文件内容:#includelcd12864.hvoidLCDDelay(chart){chari,j;for(i=0;it;i++)for(j=0;j10;j++);}voidCheckState(){chardat;LCDRs=0;LCDRw=1;do{dat=0x00;LCDEn=1;LCDDelay(2);LCDEn=0;dat=0x80&dat;}while(!(dat==0x00));}voidwrite_com(charcmdcode){CheckState();LCDRs=0;LCDRw=0;LCDData=cmdcode;LCDDelay(2);LCDEn=1;LCDDelay(2);LCDEn=0;}voidwrite_data(charLCDDispdata){CheckState();LCDRs=1;LCDRw=0;LCDData=LCDDispdata;LCDDelay(2);LCDEn=1;LCDDelay(2);LCDEn=0;}voidLCDInit(){LCDDelay(100);LCDCs1=1;LCDCs2=1;LCDDelay(100);write_com(LCDDispOff);write_com(PageAdd+0);write_com(StartLine+0);write_com(LCDColAdd+0);write_com(LCDDispOn);}voidLCDClear(){chark,j;LCDCs1=0;LCDCs2=0;write_com(PageAdd+0);write_com(LCDColAdd+0);for(k=0;k8;k++){write_com(PageAdd+k);for(j=0;j64;j++){write_com(LCDColAdd+j);write_data(0x00);}}}voidLCDWriteChinese(charleftright,charpage,charcolumn,charchinese[]){chari=0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}elseif(leftright=='R'){LCDCs1=1;LCDCs2=0;}for(i=0;i2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j16;j++){write_data(chinese[16*i+j]);}}}voidLCDWriteChineseBlack(charleftright,charpage,charcolumn,charchinese[]){chari=0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}elseif(leftright=='R'){LCDCs1=1;LCDCs2=0;}for(i=0;i2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j16;j++){write_data(~chinese[16*i+j]);}}}voidLCDWriteNum(charleftright,charpage,charcolumn,charnum[]){chari=0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}elseif(leftright=='R'){LCDCs1=1;LCDCs2=0;}for(i=0;i2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j8;j++){write_data(num[8*i+j]);}}}voidLCDWriteNumBlack(charleftright,charpage,charcolumn,charnum[]){chari=0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}elseif(leftright=='R'){LCDCs1=1;LCDCs2=0;}for(i=0;i2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j8;j++){write_data(~num[8*i+j]);}}}现在我们可以小试牛刀了,把上面两个文件加入工程里,在