LCD12864图象输入图片显示芯片结构分块与汉字显示不一样,图象显示过程是这样的:首先设置垂直地址,再设水平地址(连续写入两个字节(16bit)的数据来完成垂直与水平的坐标地址,然后在每个地址里写入16位数据)。垂直地址范围AC5...AC0,水平地址范围AC3…AC0,绘图RAM的地址计数器(AC)只会对水平地址(X轴)自动加1,当水平地址=0FH,时会重新设为00H,但并不会对垂直地址做进位自动加1,故当连续写入多次数据时,程序需自行判断垂直地址是否需重新设定。绘图RAM(GDRAM)绘图显示RAM提供128×8个字节的记忆空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会对水平地址(X地址)自动加一,当水平地址为0XFH时会重新设为00H;不会对垂直地址做进位自动加1.。在写入绘图RAM的期间,绘图显示必须关闭,整个写入绘图RAM的步骤如下:1、关闭绘图显示功能。write_cmd(0x34);//关绘图显示2、先将水平的位元组坐标(X)写入绘图RAM地址;3、再将垂直的坐标(Y)写入绘图RAM地址;4、将D15——D8写入到RAM中;5、将D7——D0写入到RAM中;6、打开绘图显示功能。write_cmd(0x36);//关绘图显示7、绘图显示的缓冲区对应分布请参考“GDRAM坐标”GDRAM地址坐标对于图象显示,这个地址表才是王道水平方向X—以字节单位(2字节16位)垂直方向Y—以位为单位屏幕分上下两屏,垂直坐标上下屏都为Y:00—1F(也即0X80+Y),以位为单位;水平坐标上半屏为X1:00—07(也即0X80+X1);下半屏为X2:08—0F(也0X80+X2)由图可以看到水平坐标一个单位是两字节(即16位D15~D0),X地址会自动加1,是直接加一个单位(即两字节16位),比如0001(也即0X80+000X80+01),从第一行第一列跳到第一行第二列。代码:voiddisplay_image(uchar*p){uchari,j;write_cmd(0x34);//扩充指令集动作write_cmd(0x34);//关绘图显示功能/*上半屏显示设置*/for(i=0;i32;i++)//上半屏{write_cmd(0x80+i);//垂直地址write_cmd(0x80);//水平地址for(j=0;j16;j++){write_data(*p);//连续写入16个字节p++;}}/*下半屏半屏显示设置*/for(i=0;i32;i++)//下半屏{write_cmd(0x80+i);//垂直地址write_cmd(0x88);//水平地址for(j=0;j16;j++)//连续写入16个字节{write_data(*p);p++;}}write_cmd(0x36);//开绘图显示write_cmd(0x30);//回到基本指令集}源程序:#includereg52.h#include12864.hX坐标(水平)方向以2字节Byte为单位,Y坐标(垂直)方向以1位Bit为单位,先连续写入垂直与水平坐标,再写入两字节数据到GDRAM。这里是这样进行的:i=0时,j=0,1时,写入两字节到垂直(0X80+00)水平(0X80+00)这格(D15~D0)里;然后X坐标地址自增1,地址变为垂直(0X80+00),水平(0X80+01)这格,在j=2,3时写入两字节,………一直到垂直(0X80+00)水平(0X80+07)这格,在j=14,15时写入两字节,此时循环for(j=0;j16;j++)结束跳出,刚好第一行128位写完数据;然后i++,开始写第二行……//函数名称:delay()//函数功能:延时voiddelay(){uchari;for(i=0;i50;i++);}//函数名称:判忙函数//函数功能:检测液晶是否处于忙碌状态voidcheck_busy(){ucharbusy_data;LCD_RS=0;LCD_RW=1;LCD_E=1;busy_data=LCD_BUS;//读取P0的数据while((busy_data&0x80)==0x80){busy_data=LCD_BUS;}delay();//延时作用,待数据稳定,下同LCD_E=0;}//函数名称:write_cmd(ucharcmd)//函数功能:写指令函数voidwrite_cmd(ucharcmd){check_busy();//判忙LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_BUS=cmd;delay();LCD_E=1;//高脉冲delay();LCD_E=0;}//函数名称:write_data(uchardat)//函数功能:写数据voidwrite_data(uchardat){check_busy();//判忙LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_BUS=dat;delay();LCD_E=1;//高脉冲delay();LCD_E=0;}//函数名称:LCD_init()//函数功能:对12864液晶进行初始化voidLCD_init(){LCD_PSB=1;//并行传输write_cmd(0x30);//基本指令集delay();write_cmd(0x0C);//显示状态开关delay();}//函数名称:Clear_Screen()//函数功能:清除整个液晶屏幕显示voidClear_Screen(){write_cmd(0x01);//清除显示delay();}//函数名称:clear_GDRAM()//函数功能:清除绘图显示缓冲区voidclear_GDRAM(){uchari,j;write_cmd(0x34);//扩充指令集动作write_cmd(0x34);//关绘图显示功能for(i=0;i32;i++)//上半屏{write_cmd(0x80+i);//垂直地址write_cmd(0x80);//水平地址,水平地址自动加1for(j=0;j16;j++){write_data(0x00);}}for(i=0;i32;i++)//下半屏{write_cmd(0x88+i);//垂直地址write_cmd(0x88);//水平地址,水平地址自动加1for(j=0;j16;j++){write_data(0x00);}}write_cmd(0x36);//开绘图显示write_cmd(0x30);//回到基本指令集}//函数名称:display_image(uchar*p)//函数功能:显示图片voiddisplay_image(uchar*p){uchari,j;write_cmd(0x34);//扩充指令集动作write_cmd(0x34);//关绘图显示功能/*上半屏显示设置*/for(i=0;i32;i++)//上半屏{write_cmd(0x80+i);//垂直地址write_cmd(0x80);//水平地址,水平地址自动加1for(j=0;j16;j++){write_data(*p);//连续写入16个字节p++;}}/*下半屏半屏显示设置*/for(i=0;i32;i++)//下半屏{write_cmd(0x80+i);//垂直地址write_cmd(0x88);//水平地址,水平地址自动加1for(j=0;j16;j++)//连续写入16个字节{write_data(*p);p++;}}write_cmd(0x36);//开绘图显示write_cmd(0x30);//回到基本指令集}图形取模方法:128*64的像素能显示的内容就有限,也无法要求它能多清楚,如果将一个彩色的图片转换为单色位图,效果就更差了,个人不建议用它来显示彩色的图片,如果真要用128*64的液晶显示,建议如下:1.尽量选择颜色比较单一的图片,当然一种颜色的效果最好不过了;(黑白色,PS处理即可)2.图片不能选择的太大,要不缩小了就看不清楚了;3.图片的调整可以这样(仅供参考):1调整图片的宽高比大致为2:1;2将图片缩小到128*64像素;3保存为单色位图;图片的大小缩放不太好操作,我通常是这样做的:你用画图程序打开你要显示的图片后,首先要操作的查看属性(点击菜单栏的图像-属性,单位选择为像素后,宽高值就出来了),比如:宽:603,高:444,这显然宽高比不是2:1,你就要调整了,444*2=888,现在为603,所以888/603=1.47,所以宽要放大为147%(点击菜单栏的图像-拉伸/扭曲,在拉伸里面的水平处改为147),现在就调整为2:1了;接下来就要将图片缩小到128*64像素,先计算缩放的比例,128/888=0.144,所以相同的操作(点击菜单栏的图像-拉伸/扭曲,在拉伸里面的水平处改为14,垂直里面也要改为14);最后就是保存为单色位图(文件-另存为-文件类型选择为:单色位图(.bmp))试过颜色比较单一的,效果还可以,复杂的彩色图片效果就很不理想了说明:在调整图片的宽高比大致为2:1的过程中图片会被拉伸变形,不过缩小到128*64像素后也不是太明显。也可以使用windows操作系统自带的绘图工具修改图片大小,并保存为.bmp格式文件,再利用自摸提取软件提取字模。例子如下:(该图片是利用Photoshop软件编辑而成的,像素128*64,经绘图工具保存为.bmp格式)字模提取软件操作步骤:///////////////////////////////////////////////////////////////////////////Bitmap点阵数据表////图片:C:\..\1.bmp,横向取模左高位,数据排列:从左到右从上到下////图片尺寸:128*64///////////////////////////////////////////////////////////////////////////unsignedcharcodenBitmapDot[]=//数据表{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x83,0x06,0x03,0xFF,0xFE,0x07,0xFE,0x7F,0x80,0x06,0x00,0x01,0x80,0x00,0x00,0x01,0x83,0x06,0x03,0xFF,0xFF,0x07,0xFE,0x7F,0xC0,0x0E,0x00,0x01,0x87,0xFF,0x00,0x01,0x83,0x06,0x03,0x03,0x03,0x00,0xC6,0x61,0x80,0x0C,0x00,0x01,0x87,0xFF,0x80,0x01,0x83,0x06,0x03,0xFF,0xFF,0x00,0xC6,0x61,0x80,0x0C,0x20,0x0F,0xF8,0x07,0x00,0x01,0x83,0x06,0x03,0xFF,0xFF,0x00,0xC6,0x63,0x80,0x18,0x30,0x0F,0xF8,0x0E,0x00,0x01,0x83,0x06,0x03,0x03,0x03,0x00,0xC6,0x63,0x00,0x38,0x70,0x03,0x18,0x1C,0x00,0x0F,0xFF,0xFF,0xC3,0x03,0x03,0x07,0xFE,0x63,0x00,0x30,0x60,0x03,0x18,0x38