12864液晶,有名字便可以知道它有128*64个像素点,可以显示汉字和简单的图形。在这里先介绍显示字库汉字和自定义汉字的方法,图形的显示以后我也会在空间中更新。
12864显示数据传输也有两种方法,一种是串行方式,一种是并行方式,并行方式传输速度快,我也只介绍串行方式。
12864的读写命令和1602的时序完全一样,这里就不做详细说明,不清楚的可以看我的1602显示,时序图如下:
这个是读时序(包括读数据和读命令)
这个是写时序(包括写数据和写命令)
这个是写时序(包括写数据和写命令)
要注意的是12864液晶的初始化和1602液晶的初始化过程是不相同的,初始化流程图如下:
12864的指令表也有两张一张基本指令表一张扩展指令表,表格如下:
续扩展指令表:
12864的指令表就这么多,看起来比较多,但不要求每一条都记住,只要知道每一条指令的作用,能够查表使用就够了。具体每一条指令的意思表上已经比较清楚了,我就不再啰嗦了。我下面将要给出的程序中也做了比较详细的注释,大家可以对照程序再看这些指令表;。[page]
这是演示效果,第一行“请您欣赏”上自定义的仿宋字体,下面三行是字库中自带的汉字(手机拍摄的效果不太好)。
下面是我写的源程序,(由于水平有限,程序写法可能不是最优的方式,希望高手批评指正):
/*********************************************************
程序:LCD12864自定义显示字符(最多显示4个)
内容:ASCII码显示、自带字库显示(8192个)、自定义显示字符(4个请您欣赏)。
软件:keil uVision4
液晶:QYLCD12864HZ1(带字库)
学习板:HOT-51学习板
作者:张家越
整理日期:2011-04-09 17:00
*************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int //定义一下,方便使用
#include"word1.h"
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7; //液晶的三个控制端
//sbit PSB=P2^4;//1---8位或4位并口方式;0---串口方式。单片机上电高电平,选择的是并口方式
uchar code tab1[]=" LCD12864 ";
uchar code tab2[]="湖北第二师范学院";
uchar code tab3[]="电子爱好者张家越";
unsigned char code table1[][32] =
{
/*-- 文字: 请 --*/
/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
{
0x00,0x40,0x20,0x70,0x13,0xC0,0x10,0x70,0x01,0xC0,0x00,0x7C,0x77,0x80,0x10,0x70,
0x13,0x90,0x12,0x70,0x13,0x90,0x1A,0x70,0x13,0x90,0x02,0x30,0x02,0x10,0x00,0x00,
},
/*-- 文字: 您 --*/
/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
{
0x01,0x00,0x09,0x00,0x09,0x38,0x13,0xC8,0x34,0x50,0x51,0x40,0x12,0x50,0x14,0xC8,
0x10,0x40,0x02,0x00,0x21,0x10,0x29,0x08,0x24,0x08,0x42,0x20,0x01,0xE0,0x00,0x00,
},
/*-- 文字: 欣 --*/
/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
{
0x00,0x40,0x06,0x40,0x38,0x40,0x20,0x40,0x20,0x7C,0x26,0x88,0x3C,0x80,0x25,0x40,
0x24,0x40,0x24,0x40,0x24,0x40,0x24,0xA0,0x44,0xA0,0x45,0x10,0x82,0x1C,0x00,0x00,
},
/*-- 文字: 赏 --*/
/*-- 仿宋_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
{
0x01,0x10,0x09,0x20,0x05,0xFC,0x3E,0x08,0x21,0xC0,0x0E,0x40,0x09,0xC0,0x0E,0x00,
0x00,0xE0,0x0F,0x20,0x09,0x20,0x09,0x20,0x0A,0x20,0x04,0xC0,0x18,0x30,0x00,0x00,
},
} ;
// 汉字表:
// 天道酬勤
void delay(uint i) //延时函数
{
while(--i);
}
void read_busy() //读忙标志 最高位为1则busy,不能进行读写操作
{
RS=0;
RW=1;
EN=1; //看时序
while(P0 & 0x80);
EN=0;
}
void write_LCD_command(uchar value) //写命令函数
{
read_busy(); //每次读写都要进行读忙标志
RS=0;
RW=0;
delay(200);
EN=1; //EN从1--0锁存数据
P0=value;
delay(200);
EN=0;
}
void write_LCD_data(uchar value) //写数据函数
{
read_busy();
RS=1;
RW=0;
delay(200);
EN=1; //EN从1--0锁存数据
P0=value;
delay(200);
EN=0;
}
void init_LCD() //8位并口方式LCD1864初始化函数
{
delay(4000); //等待时间>40ms
write_LCD_command(0x30);//功能设定:8位数据、基本指令操作
delay(100); //等待时间>100us
write_LCD_command(0x30);//功能设定:8位数据、基本指令操作
delay(37); //等待时间>37us
write_LCD_command(0x0C);//显示设定:整体显示、游标关、不反白
delay(100); // 等待时间>100us
write_LCD_command(0x01);//清屏指令
delay(10000); //等待时间>10ms
write_LCD_command(0x06);//进入点设定:地址指针加1
}
/*=============================================
自定义汉字函数:CGRAM自定义显示字符
地址 显示编码
0x40 0x0000
0x50 0x0002
0x60 0x0004
0x70 0x0006
共可显示四个自定义字符!
显示自定义字符前,先要设定显示的位置,否则会乱码
==============================================*/
void CGRAM()
{
uchar i;
write_LCD_command(0x30);//基本指令操作
write_LCD_command(0x40);//设定CGRAM字符的位置
for(i=0;i<16;i++)
{
write_LCD_data(table1[0][i*2]);
write_LCD_data(table1[0][i*2+1]);//送显示数据到CGRAM区中
}
write_LCD_command(0x50);
for(i=0;i<16;i++)
{
write_LCD_data(table1[1][i*2]);
write_LCD_data(table1[1][i*2+1]);
}
write_LCD_command(0x60);
for(i=0;i<16;i++)
{
write_LCD_data(table1[2][i*2]);
write_LCD_data(table1[2][i*2+1]);
}
write_LCD_command(0x70);
for(i=0;i<16;i++)
{
write_LCD_data(table1[3][i*2]);
write_LCD_data(table1[3][i*2+1]);
}
}
void main()
{
// uchar num;
uchar i;
init_LCD();
write_LCD_command(0x01);
CGRAM();
write_LCD_command(0x82);
write_LCD_data(0x00);
write_LCD_data(0x00);//第一个自定义显示字符编码为:0x0000
write_LCD_command(0x83);
write_LCD_data(0x00);
write_LCD_data(0x02);//第一个自定义显示字符编码为:0x0002
write_LCD_command(0x84);
write_LCD_data(0x00);
write_LCD_data(0x04);//第一个自定义显示字符编码为:0x0004
write_LCD_command(0x85);
write_LCD_data(0x00);
write_LCD_data(0x06);//第一个自定义显示字符编码为:0x0006
delay(5000);
write_LCD_command(0x90);
// write_LCD_command(0x00);
for(i=0;i<16;i++)
{
write_LCD_data(tab1[i]);
delay(5000);
}
write_LCD_command(0x88);
// write_LCD_command(0x00);
for(i=0;i<16;i++)
{
write_LCD_data(tab2[i]);
delay(5000);
}
write_LCD_command(0x98);
// write_LCD_command(0x00);
for(i=0;i<16;i++)
{
write_LCD_data(tab3[i]);
delay(5000);
}
while(1);
}
如果觉得我空间里面不够详细可以参看大海橡树的空间:http://hi.baidu.com/echoas(里面写的比较好)
12864图片显示我将在“12864使用方法(二)”中给出.。
上一篇:基于stc12c56的心电信号模拟程序
下一篇:DAC7611驱动程序
推荐阅读最新更新时间:2024-03-16 14:25