12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)

合集下载

12864液晶屏幕使用说明及程序

12864液晶屏幕使用说明及程序

12864使用说明一、串/并接口1.1 串口接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。

1.2 并行接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。

二、模块主要硬件构成说明控制器接口信号说明:2.1、RS,R/W的配合选择决定控制界面的4种模式:2.2、E信号●忙标志BFBF 标志提供内部工作情况.BF=1 表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0 时, 模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF 读到DB7 总线,从而检验模块之工作状态.●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192 个此触发器是用于模块屏幕显示开和关的控制。

DFF=1 为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。

DFF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。

●显示数据RAM(DDRAM)模块内部显示数据 RAM 提供 64×2 个位元组的空间,最多可控制 4 行 16 字(64 个字)的中文字型显示,当写入显示数据 RAM 时,可分别显示 CGROM 与CGRAM 的字型;此模块可显示三种字型,分别是半角英、数字型(16*8)、CGRAM 字型及 CGROM 的中文字型。

三种字型的选择,由在 DDRAM 中写入的编码选择,在0000H—0006H 的编码中(其代码分别是0000、0002、0004、0006 共4 个)将选择 CGRAM 的自定义字型,02H—7FH 的编码中将选择半角英数字的字型,至于A1 以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

AMPIRE12864的组成及应用程序(C语言写)

AMPIRE12864的组成及应用程序(C语言写)

先说AMPIRE12864的组成:可以看成是两个64*64的屏幕,通过CS1,CS2两个片选信号来控制,这两个都是低有效(元件面板上没反映出来这一点)RST是低有效,所以直接连到电源了(开始因为没连这个整了半天没反映。

)实际应用的时候应该还是要像单片机那样做个复位电路。

DBx,是并行的指令/数据输入/输出端。

E是使能信号。

控制时,应先置1,然后设置DB,最后E回0,结束一轮的信息交换。

RW,低为写入,高为读出。

RS ,低为指令,高为数据。

然后要说的就是坐标的问题:对于每一片(左边和右边),分成8行*64列,这是光标(想成一根8位的竖线)的放置单位。

而每一行的高度为8位,从上到下对应的是DB的低位到高位每写一个数据,光标自动向后移动,到行末的时候返回下一行行首注意我以前用的都是带字库的,这个LCD型号是AMPIRE12864,这个没有带字库的。

这个程序的编码完全是由本人自己动手写的,完全没用字符取模软件。

体会一开始,看见别人的编码,不知道是怎么编出来的(不知道是行扫描,还是列扫描),研究了半天,终于被我发现了规律,为了让大家少走弯路,我就告诉大家啊,然后可以试试自己编码。

编码列扫描,从上往下(BCD1248)如下图。

然后在是下一列。

由于本人语言文字有限,说的不是很明白,望大家见谅不懂的可以留言,一起探讨探讨好了不墨迹了,不懂的看程序吧程序#include<reg52.h> // 头文件#include"zifuku.h" // 字符库#define uchar unsigned char // 宏定义#define uint unsigned intsbit en=P2^0; // 使能端sbit rw=P2^1; // 指令/数据sbit rs=P2^2; // 读/写sbit cs2=P2^3; // 右屏sbit cs1=P2^4; // 左屏zhili(uchar zl) // 指令子函数{rs=0;rw=0;P0=zl;en=1;en=0;}shuju(uchar sj) //数据子函数{rs=1;rw=0;P0=sj;en=1;en=0;}xuanping(uchar p) //选屏子函数{if(p==0) //全屏{cs1=0;cs2=0;}if(p==1) //左屏{cs1=0;cs2=1;}if(p==2) //右屏{cs1=1;cs2=0;}}qingping() //清屏子函数{uchar x,y;xuanping(0); //选择全屏for(x=0xb8;x<0xc0;x++) //有8页{zhili(x); //每次页加1zhili(0x40); //列的起始地址for(y=0;y<64;y++) //64行{shuju(0); //数据清零}}}init() //初始化子函数{zhili(0x3f); //显示开zhili(0xc0); //行的起始地址,共64行zhili(0xb8); //页的起始地址,8页zhili(0x40); //列的起始地址,64列}lcd_xianshi(uchar p,hang,lie,shuzi) //显示子函数// p 为选屏变量hang 共8页(0-7)lie 共64(0-63)shuzi 为查表字符{uchar i;xuanping(p); //选屏shuzi=shuzi*32; //每32个字符为一组zhili(0xb8+hang*2); //1页为8 2页为16 zhili(0x40+lie*16); //一次扫描16列for(i=0;i<16;i++){shuju(tab[shuzi]); //查表格shuzi++;}zhili(0xb8+hang*2+1); //下半页zhili(0x40+lie*16); //一次扫描16列for(i=0;i<16;i++){shuju(tab[shuzi]); ////查表格shuzi++;}}main() //主函数{init(); //初始化函子数调用qingping(); //清屏子函数调用// 第 1 行lcd_xianshi(1,0,0,0);lcd_xianshi(1,0,1,1);lcd_xianshi(1,0,2,2);lcd_xianshi(1,0,3,3);lcd_xianshi(2,0,0,4);lcd_xianshi(2,0,1,5);lcd_xianshi(2,0,2,6);lcd_xianshi(2,0,3,7);// 第 2 行lcd_xianshi(1,1,0,8);lcd_xianshi(1,1,1,9);lcd_xianshi(1,1,2,10);lcd_xianshi(1,1,3,11);lcd_xianshi(2,1,0,12);lcd_xianshi(2,1,1,13);lcd_xianshi(2,1,2,14);lcd_xianshi(2,1,3,15);// 第 3 行lcd_xianshi(1,2,0,16);lcd_xianshi(1,2,1,17);lcd_xianshi(1,2,2,18);lcd_xianshi(1,2,3,19);lcd_xianshi(2,2,0,20);lcd_xianshi(2,2,1,21);lcd_xianshi(2,2,2,22);lcd_xianshi(2,2,3,23);while(1);}(表格)下面是自己添加的文件zifuku.h#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code tab[]={// 第一行0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0x0e,0x1c ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x41,0x40,0x80 ,0x18,0x1c,0x0e,0xfe,0xfc,0x00,0x7c,0xfc,0x80,0xfc,0xfc,0x00,0x00,0x00,0x7c,0xfe ,0x40,0x40,0x80,0x01,0x01,0x00,0x04,0x05,0x05,0x07,0x03,0xc0,0x20,0x40,0x20,0xc0 ,0xc6,0xc6,0xc6,0x00,0x00,0xe8,0xa8,0xf8,0xf0,0x00,0xf8,0xf8,0x10,0x18,0x00,0x00 ,0x01,0x01,0x01,0x00,0x00,0x01,0x01,0x01,0x81,0x80,0x81,0xc1,0xc0,0x40,0xc0,0xc0 ,0xc0,0xc0,0x00,0xc0,0xc0,0x00,0xc0,0xc0,0x00,0x00,0x06,0x09,0x12,0x09,0x06,0x00 ,0xe1,0xe1,0xe0,0xe1,0xe1,0xe0,0xe1,0xe1,0xe0,0xe0,0xe0,0x60,0x60,0x40,0x40,0x40 ,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c ,0xe0,0xe0,0xa0,0x90,0x8c,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x28,0x50,0x28 ,0x12,0x22,0x44,0x22,0x12,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x10,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x70,0xf0 ,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0xc4,0xe2,0xf1 ,0x38,0x18,0x0c,0x0c,0x0e,0x0e,0x0e,0x86,0x8e,0x0b,0x0b,0x0b,0x03,0x13,0x31,0x36 ,0x30,0x18,0x08,0x3c,0xf6,0xfe,0xfb,0x8d,0x0d,0x02,0xc2,0xcb,0x09,0x09,0x09,0x09 ,0x57,0xe7,0x87,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03 ,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0xc0,0xff,0xfc,0xf9,0xe1,0xc1,0x11,0x12,0x02 ,0x03,0x03,0x03,0x03,0x03,0x03,0x33,0x33,0x33,0x33,0xf3,0x03,0x03,0x03,0x03,0x03 ,0x02,0xc6,0xc5,0xc9,0xd9,0xf9,0xe3,0xc6,0x0e,0x0c,0x1c,0x38,0x38,0xf0,0xe0,0xc0 ,0x03,0x83,0x83,0xc3,0x63,0x33,0x91,0x91,0x89,0x08,0x04,0x84,0x84,0x84,0x85,0x87 ,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x12,0x24,0x12,0x0c,0x00,0x00,0x00,0x00,0x00 ,0x07,0x07,0x06,0x1e,0x38,0x78,0xe0,0xc0,0x80,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,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,0x78,0xfc,0xef,0xff,0x7b,0x1b,0x08 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x27,0x26,0x3c,0x30 ,0xf0,0xf8,0xfc,0xfe,0xff,0xef,0x0f,0x1f,0x1f,0x0f,0xff,0xff,0xfe,0xfc,0xf9,0xf2 ,0x3f,0x3f,0x3f,0x3f,0x3e,0x26,0x22,0x39,0x39,0x20,0x3c,0x3e,0x3f,0x3f,0x3f,0x3f ,0x04,0x00,0x03,0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x3e,0x38,0x38,0x39,0x39,0x38,0x38,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00 ,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x39,0x38,0x38,0x39,0x39,0x39 ,0x9e,0x7f,0x73,0x18,0x0e,0xf3,0xff,0xff,0xff,0xff,0xff,0x0f,0x1f,0x1f,0x0f,0x7f ,0x39,0x38,0x38,0x38,0x3e,0x3f,0x3f,0x3f,0x3f,0x3e,0x3e,0x31,0x39,0x39,0x30,0x34 ,0xff,0xff,0xfe,0xfc,0xfc,0xf8,0x18,0xfc,0xff,0xff,0x7e,0x1c,0x00,0x00,0x00,0x00 ,0x3e,0x3f,0x3f,0x3f,0x3f,0x3b,0x3a,0x33,0x33,0x31,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,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, };程序到处结束好了,以上程序写进去就可以看见自己的小车了哈哈。

12864LCD串行操作C程序

12864LCD串行操作C程序

12864LCD串行控制C程序下面是一个最简单的12864液晶串行控制程序,没什么花样,只是想帮助大家学习掌握控制一个串行的12864液晶的基本原理。

无论是12864的并行操作还是串行操作,12864液晶与12232液晶的操作时序几乎完全一样,打家学习的时候可以参考一下12232的时序图(方便理解),郭天祥的《51单片机C语言教程》156页中就讲到了12232液晶的使用例程。

一、时序图1、12232时序图2、12864时序图二、液晶引脚对应图三、12864液晶与单片机接口(程序中PSB没接,RST接高电平,NC悬空)四、程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit CS=P2^6;//片选信号线,接12864的RS端sbit SID=P2^5;//串行数据线,接12864的RW端sbit SCLK=P2^7;//串行时钟信号线,接12864的EN端//uchar a;uchar code word[]={"我好喜欢你啊"};//12864LCD显示内容//函数声明void lcd_init();//声明液晶初始化函数void write_com(uchar com);//声明'写入命令控制字节'函数void write_date(uchar dat);//声明'写入数据控制字节'函数void delayms(uint x);//声明延时函数//液晶初始化函数void lcd_init(){delayms(10);write_com(0x30);//基本指令操作write_com(0x0c); //显示开,关光标write_com(0x10);//设置地址计数器AC为00H,并将游标移到开头原点位置write_com(0x06);//游标及显示右移一位write_com(0x01);//清除液晶显示内容}//向12864写入命令函数/* 串行数据由三个字节构成,第一个为命令控制字节,第二个为由命令字节高四位低四位补零构成的字节,第三个为由命令字节低四位左移四位低四位补零后构成的字节*/void write_com(uchar com){uchar i;uchar i_data;i_data=0xf8;//0xf8是命令控制字节,它比表示写入的内容com是一个命令CS=1;//写入之前令片选信号CS为1(这是时序要求的)SCLK=0;//写入之前令时钟信号CLK为1(这也是时序要求的)for(i=0;i<8;i++)//写入命令控制字节{SID=(bit)(i_data&0x80);SCLK=1;SCLK=0;i_data=i_data<<1;}i_data=com;i_data&=0xf0;for(i=0;i<8;i++)//写入命令的高四位{SID=(bit)(i_data&0x80);//取得命令的最高位给液晶串行总线SCLK=1;SCLK=0; //每写一位SCLK都要有一个下降沿(时序要求)i_data=i_data<<1; //命令字节左移一位(取命令的次高位给液晶串行总线)}i_data=com;i_data<<=4;//命令字节左移4位,即把低四位移到高四位for(i=0;i<8;i++)//写入命令的低四位{SID=(bit)(i_data&0x80);//取得命令字节移位后的最高位给液晶串行总线SCLK=1;SCLK=0;i_data=i_data<<1; //移位后命令字节左移一位(每一次移位前的次高位给液晶串行总线)}CS=0; //写入命令控制字节后令片选信号CS为0delayms(10);}//向12864写入数据函数void write_date(uchar dat){uchar i;//第三个为由数据低四位左移四位后低四位补零构成的字节uchar i_data;i_data=0xfa;//(数据控制字节为0xfa)CS=1;SCLK=0;for(i=0;i<8;i++)//写入数据控制字节{SID=(bit)(i_data&0x80);//取得数据控制字节的最高位给液晶串行总线SCLK=1;SCLK=0;//每写一位SCLK都要有一个下降沿(时序要求)i_data=i_data<<1;//数据控制字节左移一位(取命令控制字节的次高位给液晶串行总线)}i_data=dat;i_data&=0xf0;//取数据字节的高四位for(i=0;i<8;i++)//写入数据的高四位{SID=(bit)(i_data&0x80);//(以下跟写入命令函数的注释同理)SCLK=1;SCLK=0;i_data=i_data<<1;}i_data=dat;i_data<<=4;for(i=0;i<8;i++)//写入数据的低四位{SID=(bit)(i_data&0x80);SCLK=1;SCLK=0;i_data=i_data<<1;}CS=0;delayms(10);}//延时函数void delayms(uint x) //延时x ms{uint i,j;for(j=x;j>0;j--)for(i=110;i>0;i--);}//主函数void main(){uchar b; //定义计算写入显示内容数量的变量lcd_init(); //初始化液晶write_com(0x90); //写入显示位置for(b=0;b<12;b++) //b要12是因为要显示6个中文{write_date(word[b]); //写入要显示的内容}while(1);}。

液晶12864的c语言驱动

液晶12864的c语言驱动
------------------------------------------------------------------------------*/
0x44,0x44,0xFC,0x54,0x4C,0x04,0xFE,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,
------------------------------------------------------------------------------*/
0x20,0x60,0x20,0x30,0x28,0x24,0xA2,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
------------------------------------------------------------------------------*/
0x00,0x40,0x22,0x12,0x0A,0x06,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,
0x40,0x40,0x7F,0x20,0x20,0x1F,0x11,0x11,0x01,0x00,0x07,0x18,0x20,0x40,0xF0,0x00,
/*------------------------------------------------------------------------------
0x10,0x10,0x0F,0x08,0x48,0x40,0x45,0x44,0x44,0x7F,0x44,0x44,0x44,0x45,0x40,0x00,
/*------------------------------------------------------------------------------

12864(ST7565P)液晶驱动

12864(ST7565P)液晶驱动

12864(ST7565P)液晶驱动显示概念含有ST7565P 芯片的液晶,是没有文库支持的功能,但是没有就没有啦!液晶可以给我画画,那么它就是好东西了。

液晶的“显示”,液晶的“扫描次序”全部都与CGRAM分配有很大的关系。

我们先了解“扫描次序”吧。

宏观上一副液晶是“64高x 128宽”。

微观上由芯片ST7565P驱动的一副12864 液晶是由“8个8 高x 128宽的页”组成。

至于液晶的“扫描次序”就与4个命令有关系。

上图表示了,当命令为0xA0列扫描是“自左向右”,如果命令式0xA1列扫描是“自右向左”。

总归,这两个命令控制了“列扫描次序”除了控制列扫描的命令以外,当然还有控制“页扫描次序”的命令。

如上图,命令0xC0 控制页扫描是“从下至上”,然而命令0xc8 控制页扫描“又上至下”。

无论页扫描的次序是“从上至下”还是“从下至上”,然而每一页的列填充,都是“低位开始高位结束”关于列扫描就有列填充的问题。

我们知道每“一页”都是由“8 高x 128宽”组成。

换句话说,这里没有“行扫描”的概念,因为“一页”都是由“一个字节数据,列填充128次”成为一页。

如上图中所示。

假设“页扫描次序”是由上至下,填充的值是0x0f,那么经过128次的“列扫描”以后,一页的扫描结果会是如上图所示。

关于ST7565P 芯片,命令,和液晶扫描它们之间的关系而已,我们简单来总结一下:(一)CGRAM分布是由8页组成。

(二)每一页是由一个字节填充和128次列扫描组成。

(三)列扫描次序与命令0xA0 与0xA1有关。

(四)页扫描次序与命令0xC0 与0xC8 有关。

(五)列填充字节的高位低位关系与页扫描命令有关。

(六)不存在行扫描概念。

上图所示是“页扫描”由上至下,“列扫描”由左至右,列填充值是0x0f。

在CGRAM分布方面。

CGRAM 可以说是由8 bits x 1024 words,如果以“页”去分配,也就是说8 page x 8 bits x 128 words ,那么“页”的偏移量就是128。

液晶12864的驱动(带注释)

液晶12864的驱动(带注释)

//写主函数的时候直接调用以下部分子函数就行了#include<reg51.h>#include"intrins.h"#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;sbit lcd_en=P2^7;sbit lcd_psb=P3^2; //串/并方式控制sbit lcd_rst=P3^7; //液晶复位端口void delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=120;j>0;j--);}void delay_nop(){_nop_();_nop_();_nop_();_nop_();}/* 以下是lcd忙碌检查函数,result为1时,忙;* result为0时,闲;可写指令与数据。

*/bit lcd_busy(){bit result;lcd_rs=0;lcd_rw=1;lcd_en=1;delay_nop();result=(bit)(P0&0x80);lcd_en=0;return(result);}/**** 以下是写指令函数**** */void lcd_wcmd(uchar cmd){while(lcd_busy());lcd_rs=0;lcd_rw=0;lcd_en=0;_nop_();_nop_();P0=cmd;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下是写数据函数**** */void lcd_wdat(uchar dat){while(lcd_busy());lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下lcd初始化函数**** */void lcd_init(){lcd_psb=1;lcd_rst=0;delay_ms(3);lcd_rst=1;delay_ms(3);lcd_wcmd(0x34);delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0c); //显示开,关光标delay_ms(5);lcd_wcmd(0x01); //清楚lcd显示的内容delay_ms(5);}/**** 以下是lcd清屏函数**** */void lcd_clr(){lcd_wcmd(0x01);delay_ms(5);}/* 以下是设定显示位置函数* 变量X表示行,Y表示列**/void lcd_pos(uchar x,uchar y){uchar pos;if(x==1) {x=0x80;}else if(x==2) {x=0x90;}else if(x==3) {x=0x88;}else if(x==4) {x=0x98;}pos=x+y;lcd_wcmd(pos);}/* 以下是设定显示位置函数* 变量i表闪烁次数*/void flash(uint i){delay_ms(1000);for(;i>0;i--){lcd_wcmd(0x08); //关闭显示delay_ms(500);lcd_wcmd(0x0c); //开显示delay_ms(500);}}。

51单片机带字库12864液晶动态汉字显示C语言源程序

51单片机带字库12864液晶动态汉字显示C语言源程序

51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。

其实和显示汉字的程序一样,只是稍做一下修改即可。

C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。

lcd12864c语言编程详解

lcd12864c语言编程详解

12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。

采用KS0107控制IC。

2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进行适度调整。

二、最大工作范围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温)6、保存温度(Tstg):-10~65℃三、电气特性(测试条件 Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75Vmin4、输出低电平(Vol):1.0Vmax5、工作电流:2.0mAmax四、接口说明12864-3A接口说明表五、指令描述1、显示开/关设置CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:设置屏幕显示开/关。

DB0=H,开显示;DB0=L,关显示。

不影响显示RAM(DD RAM)中的内容。

2、设置显示起始行CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:执行该命令后,所设置的行将显示在屏幕的第一行。

12864液晶显示C语言程序代码

12864液晶显示C语言程序代码
unsigned char code pic3[];
/******************************************************************/
/* 定义接口信息 */
DisplayGraphic(pic3); //显示图片3
delayms(200);
initinal(); //调用LCD字库初始化程序
delay(100); //大于100uS的延时程序
delay(100); //大于100uS的延时程序
TransferData(0x30,0); //Function Set
delay(37); ////大于37uS的延时程序
TransferData(0x08,0); //Display on Control
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(unsigned int n);
void DisplayLine(unsigned char line1,unsigned char line2);
delay(100); //大于100uS的延时程序
TransferData(0x10,0); //Cursor Display Control光标设置
delay(100); //大于100uS的延时程序
/*-----------------------------------------------
名称:LCD12864 字库液晶 芯片组st7920
日期:2009.5

12864液晶屏驱动程序

12864液晶屏驱动程序
unsigned char BMPheight;
BMPwith=*PicData;
PicData++;
BMPheight=(*PicData)/8;
PicData++;
//BMPLen=BMPheight/8*BMPwith
for(BMPheightLen=0;BMPheightLen<BMPheight;BMPheightLen++)
Series = Series << 1;
}
}
/***********************************
** 函数名称: Write_Data
** 功能描述: 传送数据
** 输 入: dat
** 输 出 : 无
** 全局变量:无
** 调用模块: Busy,
******************************************/
//图像反色显示 0 否 1是
bit LCD_DisplayReserve_Driver;
//定义LCD显示的全局变量
#define CS_Port P3_0
#define A0_Port P3_1
#define SI_Port P3_2
{
switch (PIN)
{
case CS :
CS_Port=1;
break;
case A0 :
A0_Port=1;
break;
case SI :
SI_Port=1;
break;
case SCL :
SCL_Port=1;

MSP430驱动12864液晶程序

MSP430驱动12864液晶程序

/*******************************************************************************名称:12864液晶操作程序功能:本c文件封装了对12864液晶的一些简单的基本读写操作.封装函数:void Lcd_WriteCmd(unsigned char a); //写指令void Lcd_WriteData(unsigned char a); //写数据intLcd_ReadCmd(); //读指令intLcd_ReadData(); //读数据void Lcd_Init(); //初始化液晶void Lcd_XY(unsigned char a,unsigned char b); //设定光标位置void Clear_GDRAM(void); //清除液晶GDRAM中的随机数据void Draw_PM(constuchar *ptr); //在整个液晶屏幕上画图void Draw_TX(ucharYaddr,ucharXaddr,constuchar * dp); //显示一个16*16大小的图形作者:胡静涛最后修改时间:2011年7月25号备注:该程序应在1M的系统时钟下运行,读忙信号函数已经被封装到除读指令函数以外的函数中.典型应用:Lcd_XY( 1 , 1 );i = 0;while( num1[i] != '\0' ){Lcd_WriteData( num1[i] );i++;}以上函数均进行测试可以正常使用*******************************************************************************/#include<msp430x26x.h>#include"12864LCD.h"//******************************************************************************//12864液晶读指令//典型应用读忙标志:while(Lcd_ReadCmd() & 0x80);//******************************************************************************int Lcd_ReadCmd(){int temp;unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)LCD12864_CMDDIR;LCD12864_DATADIR = 0X00;LCD12864_LCDRS_0;LCD12864_LCDWR_1;LCD12864_LCDEN_0;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();temp = LCD12864_DATAIN;LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) return temp;}//****************************************************************************** //12864液晶读数据//****************************************************************************** int Lcd_ReadData(){int temp;unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)while(Lcd_ReadCmd() & 0x80); //读忙信号LCD12864_DATADIR = 0X00;LCD12864_CMDDIR;LCD12864_LCDRS_1;LCD12864_LCDWR_1;LCD12864_LCDEN_0;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();temp = LCD12864_DATAIN;LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) return temp;}//****************************************************************************** //12864液晶写指令//****************************************************************************** void Lcd_WriteCmd(uchar a){unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)while(Lcd_ReadCmd() & 0x80); //读忙信号LCD12864_DATADIR = 0XFF;LCD12864_CMDDIR;LCD12864_LCDRS_0;LCD12864_LCDWR_0;LCD12864_LCDEN_0;_NOP();LCD12864_DATA = a;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) }//****************************************************************************** //12864液晶写数据//****************************************************************************** void Lcd_WriteData(uchar a){unsignedchar CLKCMD;CLKCMD = BCSCTL2; //先将时钟寄存器的值读出来BCSCTL2 = SELM_2 + DIVM_3 + (CLKCMD & 0x0e); //重新设定主时钟(不改变从时钟)while(Lcd_ReadCmd() & 0x80); //读忙信号LCD12864_DATADIR = 0XFF;LCD12864_CMDDIR;LCD12864_LCDRS_1;LCD12864_LCDWR_0;LCD12864_LCDEN_0;_NOP();LCD12864_DATA = a;_NOP();LCD12864_LCDEN_1;_NOP();_NOP();LCD12864_LCDEN_0;BCSCTL2 = CLKCMD; //还原原来的时钟(放在函数最后) }//****************************************************************************** //12864液晶初始化//****************************************************************************** void Lcd_Init(){Lcd_WriteCmd(0x30);Lcd_WriteCmd(0x0c);Lcd_WriteCmd(0x01);Lcd_WriteCmd(0x80);}//****************************************************************************** //12864液晶光标地址//****************************************************************************** void Lcd_XY(unsignedchar a,unsignedchar b){switch (a){case 1:a = 0x80;break;case 2:a = 0x90;break;case 3:a = 0x88;break;case 4:a = 0x98;break;}Lcd_WriteCmd(a + b - 1);}//****************************************************************************** //清除液晶GDRAM中的随机数据//****************************************************************************** void Clear_GDRAM(void){uchari,j,k;Lcd_WriteCmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x80);for(k = 0;k < 16;k++){Lcd_WriteData(0x00);}}i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x88);for(k = 0;k < 16;k++){Lcd_WriteData(0x00);}}Lcd_WriteCmd(0x30); //回到基本指令集}//****************************************************************************** //在整个液晶屏幕上画图//****************************************************************************** void Draw_PM(const uchar *ptr){uchari,j,k;Lcd_WriteCmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x80);for(k = 0;k < 16;k++){Lcd_WriteData(*ptr++);}}i = 0x80;for(j = 0;j < 32;j++){Lcd_WriteCmd(i++);Lcd_WriteCmd(0x88);for(k = 0;k < 16;k++){Lcd_WriteData(*ptr++);}}Lcd_WriteCmd(0x36); //打开绘图显示Lcd_WriteCmd(0x30); //回到基本指令集}//****************************************************************************** //功能:显示一个16*16大小的图形//参数:Yaddr--Y地址// Xaddr--X地址// dp--指向图形数据存放地址的指针//****************************************************************************** void Draw_TX(ucharYaddr,ucharXaddr,const uchar * dp){uchar j;uchar k=0;Yaddr = Yaddr + 0x80;Xaddr = Xaddr + 0x80;Lcd_WriteCmd(0x01); //清屏,只能清除DDRAMLcd_WriteCmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){Lcd_WriteCmd(Yaddr++); //Y地址Lcd_WriteCmd(Xaddr); //X地址Lcd_WriteData(dp[k++]);Lcd_WriteData(dp[k++]);}Lcd_WriteCmd(0x36); //打开绘图显示Lcd_WriteCmd(0x30); //回到基本指令集模式}****************************************以上是C文件*************************************** ************************************我是分隔符************************************ ************************************以下是H文件********************************** #ifndef 12864LCD_H#define 12864LCD_H#define uchar unsignedchar#define uint unsignedint#define _12864LCD_DATADIR P4DIR //数据口方向控制#define _12864LCD_DATA P4OUT //数据输出端口#define _12864LCD_DATAIN P4IN //数据输入端口#define _12864LCDDEN BIT2 //LCDEN位#define _12864LCDWR BIT1 //LCDWR位#define _12864LCDRS BIT0 //LCDRS位#define _12864LCD_CMD P3OUT //控制引脚端口#define _12864LCD_CMDDIR P3DIR //控制引脚方向/****************固定写法****************/#define LCD12864_DATADIR _12864LCD_DATADIR#define LCD12864_DATA _12864LCD_DATA#define LCD12864_DATAIN _12864LCD_DATAIN#define LCD12864_LCDEN_1 _12864LCD_CMD |= _12864LCDEN#define LCD12864_LCDEN_0 _12864LCD_CMD &= ~_12864LCDEN#define LCD12864_LCDWR_1 _12864LCD_CMD |= _12864LCDWR#define LCD12864_LCDWR_0 _12864LCD_CMD &= ~_12864LCDWR#define LCD12864_LCDRS_1 _12864LCD_CMD |= _12864LCDRS#define LCD12864_LCDRS_0 _12864LCD_CMD &= ~_12864LCDRS#define LCD12864_CMDDIR _12864LCD_CMDDIR |= _12864LCDRS + _12864LCDWR + _12864LCDENvoid Lcd_WriteCmd(unsignedchar a);void Lcd_WriteData(unsignedchar a);int Lcd_ReadCmd();int Lcd_ReadData();void Lcd_Init();void Lcd_XY(unsignedchar a,unsignedchar b);void Clear_GDRAM(void);void Draw_PM(constunsignedchar *ptr);void Draw_TX(unsignedchar Yaddr,unsignedchar Xaddr,constunsignedchar * dp);#endif。

LCD12864液晶驱动编程指南

LCD12864液晶驱动编程指南

LCD12864液晶驱动编程指南
1.连接硬件:
2.初始化液晶:
在开始使用液晶之前,需要进行初始化。

初始化过程包括设置液晶的
工作模式、显示模式和其他参数。

通过向液晶发送一系列的指令,可以完
成初始化过程。

3.编写驱动程序:
液晶驱动程序的主要目的是将需要显示的内容以及液晶的控制指令发
送给液晶屏。

根据液晶屏的通信方式,可以采用单片机的IO口直接控制
液晶屏,也可以通过SPI或I2C等接口芯片间接控制。

4.显示图形:
5.显示文本:
除了图形外,液晶还可以显示文本。

可以通过设置显示位置和发送需
要显示的文本来实现。

6.更新显示:
当需要更新液晶上的内容时,可以通过重新设置显示的内容和刷新液
晶来实现。

可以定时刷新液晶,或者通过检测外部事件来触发刷新。

7.扩展功能:
除了基本功能外,还可以实现一些扩展功能,如显示动画、滚动显示、倒计时等。

只需要根据需求编写相应的代码即可实现。

总结:
注意事项:
在编写驱动程序时,需要注意及时更新液晶上的内容,避免频繁刷新导致的卡顿现象。

同时,为了保证程序的可移植性,可以将液晶驱动程序与其他功能模块进行分离,便于代码的维护和移植。

lcd12864c语言编程详解

lcd12864c语言编程详解

12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。

采用KS0107控制IC。

2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进行适度调整。

二、最大工作范围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温)6、保存温度(Tstg):-10~65℃三、电气特性(测试条件 Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75Vmin4、输出低电平(Vol):1.0Vmax5、工作电流:2.0mAmax四、接口说明12864-3A接口说明表五、指令描述1、显示开/关设置CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:设置屏幕显示开/关。

DB0=H,开显示;DB0=L,关显示。

不影响显示RAM(DD RAM)中的内容。

2、设置显示起始行CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:执行该命令后,所设置的行将显示在屏幕的第一行。

FM12864液晶显示程序驱动

FM12864液晶显示程序驱动

/********************************************************RS 数据与指令选择(1为送数据,0为送指令)RW:读写控制(RW=1 E=1数据被读到DB0~DB7,RW=0 E=1->0 DB0~DB7数据被写到IR或DR)E 使能 RST 复位*********************************************************/#include"mega16.h"#include"delay.h"#include"stdlib.h"#define RS PORTB.0 //0x10 光标左移#define RW PORTB.1 //0x14 光标右移#define E PORTB.2 //0x18 屏幕左移#define RST_ON PORTB.3=0 //RST //0x1C 屏幕右移#define RST_OFF PORTB.3=1 //#define FM_DATA_OUT PORTC //#define FM_DATA_IN PINC //#define WRITE_FM DDRC=0XFF //#define READ_FM DDRC=0X00 // unsigned char chinese[]={"电子创新实验室"};unsigned char chinese1[]={"时间"};////////////////////////送数据///////////////////////////void Send_Data(unsigned char Da){RS=1;RW=0;FM_DATA_OUT=Da;E=1;delay_us(20);E=0;RW=1;RS=0;delay_us(90);//大部分指令用时70多微秒,没有进行忙碌标志检测}//////////////////////送命令//////////////////////////void Send_Com(unsigned char Com){RS=0;RW=0;FM_DATA_OUT=Com;E=1;delay_us(20);E=0;RW=1;RS=1;delay_us(90);}/////////////////////////(图形模式下)清屏//////////////////////////// void Clear(){char i,j;for(j=0;j<64;j++){if(j<32){Send_Com(0x80+j); //清除上半屏Send_Com(0x80);}else {Send_Com(0x80+j-32); //清除下半屏Send_Com(0x88);}for(i=0;i<16;i++)Send_Data(0x00);}}//////////////////////////左右滚动当前行/////////////////////// fl=0向右滚,否则想左滚void Run(char fl,unsigned char n){ //n为滚动的次数unsigned char i;for(i=0;i<n;i++){if(fl)Send_Com(0X18);else Send_Com(0X1c);delay_ms(500);}}/////////////////////////中文显示///////////////////////////X0为横坐标(0=<X0<=7)Y0为纵坐标(0=<Y0<=3) ////////void Show_Text(unsigned char X0,unsigned char Y0,unsigned char *Text){ Send_Com((0x80+0X10*(Y0%2)+8*(Y0>>1))|X0); //设定显示坐标,此液晶4行不是按顺序进行的while(*Text>0){ //(是第0行完到第2行再到第1行最后到第3行)Send_Data(*Text); //故用上式进行变换Text++;delay_us(100);}}////////////////////显示数字/////////////////////////void FM_Num(unsigned char X0,unsigned char Y0,long da){unsigned char *P="12345678";ltoa(da,P);//库函数,转换长整型为字符串型Show_Text(X0,Y0,P);}///////////////////位图显示//////////////////////void Show_BMP(flash unsigned char *P){int i,Y=0;Send_Com(0x80); //行坐标Send_Com(0x80); //列坐标for(i=0;i<512;i++){if(i<256){if(i%8==0){Send_Com(0x80+(Y++));Send_Com(0x80);} }else if(i%8==0){Send_Com(0x80+(Y++));Send_Com(0x88);}Send_Data(P[i]);Send_Data(P[i+1]);if(Y==32)Y=0;}}void INIT_FM(void){DDRB|=0xFF;WRITE_FM;RST_ON;delay_us(10);RST_OFF;Send_Com(0x30); //功能设定Send_Com(0x01); //清屏显示Send_Com(0x02); // 地址返回原点,不改变DDRAM内容Send_Com(0x06); // 设定输入模式,光标加,屏幕不移动Send_Com(0x0c); //显示开光标关}//////////////////////////////////////////////////////////// main(){int i=0;INIT_FM();Send_Com(0x30); //扩充指令集delay_us(300); //此处延时必须且在这不少于300uswhile(1){for(i=0;i<=20;++i){Show_Text(0,0,chinese);Show_Text(0,1,chinese1);FM_Num(2,1,i);if(i>19){i=-1;INIT_FM();delay_ms(50);}delay_ms(100);}}//Send_Com(0x34); //关闭图形模式//Clear();/*Send_Com(0x80); //行坐标Send_Com(0x80); //列坐标for(i=0;i<512;i++){if(i<256){if(i%8==0){Send_Com(0x80+(Y++));Send_Com(0x80);} } else if(i%8==0){Send_Com(0x80+(Y++));Send_Com(0x88);} Send_Data(0xff);Send_Data(0xff);if(Y==32)Y=0;} *///Send_Com(0x36); //打开图形模式} ...。

12864液晶 串行口传输进行图象显示程序-C语言

12864液晶 串行口传输进行图象显示程序-C语言

12864液晶串行口传输进行图象显示程序-C语言#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1sbit std = P2^1;sbit sclk = P2^2;uchar code tab1[]={"本系列中文模块内""任意位置反白显示""置二级字库,可在""使用更方便更灵活"};uchar code tab32[]={/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0, 0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0, 0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60, 0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30, 0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90, 0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90, 0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0, 0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab5[]={/*-- 调入了一幅图像:F:\梁\画图\COCK.bmp --*//*-- 宽度x高度=128x64 --*/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, 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, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x04, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x01, 0xC2, 0x01, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7C, 0x00, 0x79, 0x80, 0x00, 0x00, 0x80, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x78, 0x01, 0xBC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x80, 0x00, 0x00, 0x01, 0xFC, 0x03, 0x31, 0x0C, 0x01, 0x1C, 0x0D, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x80, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x01, 0x04, 0x13, 0x18, 0x18, 0xC0, 0x00, 0x00, 0x7C, 0x40, 0x80, 0x00, 0x00, 0x38, 0x00, 0x06, 0x01, 0x06, 0x12, 0x18, 0x10, 0x45, 0xC0, 0x0F, 0xC0, 0x40, 0x80, 0x00, 0x01, 0xE8, 0x00, 0x04, 0x01, 0x02, 0x12, 0x30, 0x20, 0xC7, 0x38, 0x00, 0x00, 0x40, 0x80, 0x00, 0x1E, 0x04, 0x00, 0x06, 0x01, 0x02, 0x12, 0x30, 0xE0, 0x86, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x10, 0x04, 0x00, 0x03, 0x01, 0x02, 0x32, 0x50, 0x7F, 0x8C, 0x00, 0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x04, 0x00, 0x01, 0xC1, 0x06, 0x23, 0xD8, 0x40, 0x0C, 0x00, 0x00, 0x00, 0x60, 0x40, 0x00, 0x01, 0x04, 0x00, 0x00, 0x63, 0x0C, 0x20, 0x08, 0x40, 0x18, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x01, 0x04, 0x70, 0x00, 0x22, 0x10, 0x60, 0x00, 0x30, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x40, 0x40, 0x01, 0x07, 0xC0, 0x00, 0x23, 0xE0, 0x00, 0x00, 0x0F, 0x18, 0x00, 0x00, 0x06, 0x40, 0x40, 0x80, 0x01, 0x04, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x40, 0x61, 0x80, 0x01, 0x04, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x40, 0x21, 0x00, 0x01, 0x04, 0x00, 0x07, 0x82, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x40, 0x23, 0x00, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x40, 0x26, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x04, 0x40, 0x14, 0x00, 0x07, 0x86, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x40, 0x18, 0x00, 0x04, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x38, 0x10, 0x18, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0xE8, 0x20, 0x30, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x8C, 0x20, 0x60, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x70, 0x00, 0x08, 0x01, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x0F, 0x80, 0x08, 0x01, 0x39, 0xF3, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x70, 0x10, 0x01, 0x6F, 0x16, 0x14, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x01, 0xCC, 0x14, 0x34, 0x66, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x24, 0xF8, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x67, 0xB0, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 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, 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, 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, 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, 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, };/*-----------------------------------*/void delay (uint us) //delay time{while(us--);}//**************************************//**************************************void delay1 (uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<15;j++)delay(1);}//**************************************/*---------------------------------------*///我发现在读指令码的时候,程序先调用了6位的低电平,然再在1调用了10位的指令码。

12864液晶屏(带字库)51单片机3线串口驱动程序

12864液晶屏(带字库)51单片机3线串口驱动程序

#include<reg51.h>typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uitn32;sbit CS = P1^0;//片选信号引脚sbit SDA = P1^1;//数据线sbit SCK = P1^2;//串行时钟线//sbit RST = P1^3;//复位引脚//sbit PSB = P1^4;//串并控制引脚code uint8 strint1[] = "I Love You !";/*void delay5ms(void) //误差0us {unsigned char a,b;for(b=185;b>0;b--)for(a=12;a>0;a--);}*///发送一个字节void Send_Byte(uint8 dat){uint8 i;SCK = 0;for(i=0;i<8;i++){SDA = dat&0x80;SCK = 1;dat <<= 1;SCK = 0;}}//读取一个字节数据uint8 Read_Byte(void){uint8 i;uint16 byte = 0;SCK = 0;for(i=0;i<16;i++){byte <<= 1;SCK = 1;if(SDA)byte |= 0x0001;SCK = 0;}byte = ((byte>>4)|(byte>>8))&0x00ff;return ((uint8)(byte));}//读忙标志void Read_Busy(void){uint8 temp;CS = 1;do{Send_Byte(0xfc);//发送读命令temp = Read_Byte();//读取数据}while(temp&0x80);CS = 0;}//发送命令void Write_Cmd(uint8 cmd){uint8 temph = 0;uint8 templ = 0;//制作发送命令格式temph = cmd & 0xf0;templ = (cmd & 0x0f) << 4;Read_Busy();CS = 1;Send_Byte(0XF8);//发送命令命令//发送命令Send_Byte(temph);Send_Byte(templ);CS = 0;}//发送数据void Write_Dat(uint8 dat){uint8 temph = 0;uint8 templ = 0;//制作发送数据格式temph = dat & 0xf0;templ = (dat & 0x0f) << 4;Read_Busy();CS = 1;Send_Byte(0XFA);//发送数据命令Send_Byte(temph);//发送数据Send_Byte(templ);CS = 0;}//在指定位置显示半字宽字符void Dis_HCGROM(uint8 x,uint8 y,uint8 dat) {uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat(dat);}//指定位置显示字符串void Dis_String(uint8 x, uint8 y, uint8 len, uint8 *dat) {uint8 addr,i;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);for(i = 0;i < len;i++){Write_Dat(*dat++);}}//制定位置显示8位无符号数字void Dis_UNum8(uint8 x,uint8 y,uint8 dat){uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat(dat/100%10+'0');Write_Dat(dat/10%10+'0');Write_Dat(dat/1%10+'0');}//制定位置显示16位无符号数字void Dis_UNum16(uint8 x,uint8 y,uint8 dat) {uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat(dat/10000%10+'0');Write_Dat(dat/1000%10+'0');Write_Dat(dat/100%10+'0');Write_Dat(dat/10%10+'0');Write_Dat(dat/1%10+'0');}//在指定位置显示汉字//x范围:0-7,y范围:0-3//dat:汉字字形码void Dis_GB(uint8 x,uint8 y,uint16 dat) {uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat((uint8)(dat >> 8));Write_Dat((uint8)(dat));}//LCD初始化void LCD_Init(void){/*RST = 0;delay5ms();delay5ms();RST = 1;PSB = 0;*/Write_Cmd(0X30);Write_Cmd(0X01);Write_Cmd(0X02);Write_Cmd(0X0C);}void main(void){LCD_Init();while(1){Dis_GB(0,0,0xc9b5);Dis_HCGROM(1,0,0x03);Dis_String(0,1,13,strint1);Dis_UNum8(0,2,250);} }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这个程序写得很好,自己也是看的别人写的很好的程序,但是它代码不够完整,注释不详细,经过自己的修改加以完善。

另外我发现很多的测试代码都没有附上测试代码效果图,在本人的代码下面有自己拍的效果图,填补不足之处。

自己在找资料的过程中花掉很多的财富值,如果大家看得起该代码请评五分加以下载,在下感激不尽!
/*******************************************
程序名称:12864液晶经典驱动程序(带中文字库)
功能:12864测试程序
修改作者:王程
修改时间:2014年2月5日23:22:32
********************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
// P0 为数据口
sbit LCD_RS=P2^0; //数据、命令选择端口
sbit LCD_RW=P2^1; //液晶读写控制
sbit LCD_EN=P2^2; //液晶使能控制
sbit PSB = P2^4; //模式选择1为并行0为串行
sbit RES = P2^5;//复位端口低电平复位,上电之前进行复位,为了稳定!unsigned char code DAT[] = "我爱我家"; //测试显示的汉字,下面的A为测试显示的英文
/*******************************************
函数名称:Delay_1ms (晶振为12M)
功能:延时约1ms的时间
参数:无
返回值:无
********************************************/
void delay_1ms(uint x)
{
uint i,j;
for(j = 0;j < x;j++)
for(i=0;i<110;i++);
}
/*******************************************
函数名称:write_cmd
功能:向液晶中写控制命令
参数:cmd--控制命令
返回值:无
********************************************/
void write_cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS=0;
LCD_RW=1;
do //经典判忙方式,精简{
LCD_EN=1;
delay_1ms(2);
lcdtemp = P0;
LCD_EN=0;
}
while(lcdtemp & 0x80);
LCD_RW=0;
P0 = cmd;
LCD_EN=1;
delay_1ms(5);
LCD_EN=0;
}
/*******************************************
函数名称:write_data
功能:向液晶中写显示数据
参数:dat--显示数据
返回值:无
********************************************/ void write_data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS=0;
LCD_RW=1;
do //经典判忙方式
{
LCD_EN=1;
delay_1ms(2);
lcdtemp = P0;
LCD_EN=0;
}
while(lcdtemp & 0x80);
LCD_RS=1;
LCD_RW=0;
P0 = dat;
LCD_EN=1;
delay_1ms(5);
LCD_EN=0;
}
/*******************************************
函数名称:lcd_int
功能:初始化液晶模块
参数:无
返回值:无
********************************************/
void lcd_int(void)
{
delay_1ms(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式delay_1ms(1); //延时
RES=0; //复位
delay_1ms(1); //延时
RES=1; //复位置高
delay_1ms(10);
write_cmd(0x30); //基本指令集
delay_1ms(5);
write_cmd(0x30); //基本指令集
delay_1ms(5);
write_cmd(0x08); // 地址归位
delay_1ms(5);
write_cmd(0x10); //光标设置
delay_1ms(5);
write_cmd(0x0c); //整体显示打开,游标关闭
delay_1ms(5);
write_cmd(0x01); //清除显示
delay_1ms(5);
write_cmd(0x06); //游标右移
delay_1ms(5);
write_cmd(0x80); //设定显示的起始地址
delay_1ms(5);
}
函数名称:main
功能:测试1602初始化函数模块
参数:无
返回值:无
********************************************/
void main()
{
uchar i;
char *a = DAT;//使用指针,指向字符串地址
lcd_int();
write_data('A'); //每个显示都是用的两个字节,必须写两次
write_data(' ');//再写一次,不然乱显示(如果不加就再显示一个别的字母)for(i=0;i<8;i++)
{
write_data(*a);//将地址当作数据传给12864
a++;//一个汉字传送两次,因为一个汉字占用两个字节,两次传完
}
write_cmd(0x90);//一行显示八个汉字,第一行0x80-87,第二行0x90开始
a = DAT;
for(i=0;i<8;i++)
{
write_data(*a);
a++;
}
while(1); //停住,不然重复的初始化显示,作为测试用
}
/*******************************************
代码测试效果图片两两张
由于曝光度影响,拍了两张
********************************************/。

相关文档
最新文档