1、使用前的准备
先给模块加上工作电压,再按照下图的连接方法调节LCD的对比度,使其显示出黑色的底影。此过程亦可以初步检测LCD有无缺段现象。
2、字符显示
带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示让明游RAM可显示1个中 文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、坦销HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。 80H
81H
82H
83H
84H
85H
86H
87H 90H
91H
92H
93H
94H
95H
96H
97H 88H
89H
8AH
8BH
8CH
8DH
8EH
8FH 98H
99H
9AH
9BH
9CH
9DH
9EH
9FH 3、图形显示
先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)
垂直地址范围 AC5...AC0
水平地址范围 AC3…AC0
绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地槐芹址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:
4、应用说明
用带中文字库的128X64显示模块时应注意以下几点:
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。
④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。
⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。
#include <stdio.h>#include <math.h>
#include <reg52.h>
#include <string.h>
sbit RS=P2^3 //注意:一定要看12864液晶模块的资蔽租料,来确定怎样 *** 作
sbit WRD=P2^4
sbit E=P2^5
sbit PSB=P2^0
sbit RES=P2^2
void TransferData(char data1,bit DI)
void delayms(unsigned int n)
void delay(unsigned int m)
void lcd_mesg(unsigned char code *addr1)
//下面来定义要显示的汉字,8*4
unsigned char code IC_DAT[]={
"陈 "
""
""
""
}
unsigned char code IC_DAT2[]={
"爱一个人难却还爱"
"交结朋友可路更宽"
"诚实守信宏知兆加油努力"
"成功做人成功做事"
}
void initinal(void) //初始化,12864有要求的要写猛缓上
{
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)//分两屏来不断显示上面定义的IC_DAT和IC_DAT2汉字
{
while(1)
{
initinal()//调用LCD字库初始化程序
delay(100)
lcd_mesg(IC_DAT)
delayms(240) //延时程序必要的,长与短,自己调节
delayms(240)
initinal()
delay(100)
lcd_mesg(IC_DAT2)
delayms(240)
delayms(240)
}
}
void lcd_mesg(unsigned char code *addr1) //显示汉字函数,8*4=32
{
unsigned char i
TransferData(0x80,0)
delay(100)
for(i=0i<32i++)
{
TransferData(*addr1,1)
addr1++
}
TransferData(0x90,0)
delay(100)
for(i=32i<64i++)
{
TransferData(*addr1,1)
addr1++
}
}
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=0i<ni++)
for(j=0j<2000j++)
}
void delay(unsigned int m)
{
unsigned int i,j
for(i=0i<mi++)
for(j=0j<10j++)
}
#include <reg52.h>#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Nop() _nop_()
/*引脚端口定义*/
sbit LCD12864_RS_PORT = P1^7 /*LCD12864引脚定义*/
sbit LCD12864_RW_PORT = P1^6
sbit LCD12864_E_PORT= P2^3
#define LCD12864_DA_PORT P0
sbit led_en_port = P2^5/*发光二极管寄存器LE引脚*/
sbit sled_en_port = P3^6/*数码管寄存器LE引脚*/
uchar hanzi_buff1[]={" 液晶显示 "}
//////////////////以下是LCD12864驱动程序////////////////
void LCD12864_WaitIdle()
//LCD12864 忙 信号检测
{
LCD12864_DA_PORT = 0xff
LCD12864_RS_PORT = 0
LCD12864_RW_PORT = 1
LCD12864_E_PORT = 1
while((LCD12864_DA_PORT&0x80)==1)/*等待BF 不为困春哗1*/
LCD12864_E_PORT = 0
}
void LCD12864_COM_Write( uchar com_da)
/* 检测忙信号写入命令字
com_da 为待写入的命令字*/
{
LCD12864_WaitIdle()
LCD12864_RS_PORT = 0
LCD12864_RW_PORT = 0
LCD12864_DA_PORT = com_da
LCD12864_E_PORT = 1
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
LCD12864_E_PORT = 0
}
void LCD12864_NoWaitIdle_COM_Write(uchar com_da)
/* 不检测忙信号写森中入命令字
com_da 为待写入的命令汪行字*/
{
LCD12864_RS_PORT = 0
LCD12864_RW_PORT = 0
LCD12864_DA_PORT = com_da
LCD12864_E_PORT = 1
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
LCD12864_E_PORT = 0
}
void LCD12864_Data_Write(uchar da)
/* 数据写入
da 为待写入的8位数据*/
{
LCD12864_WaitIdle()/*检测忙信号*/
LCD12864_RS_PORT = 1
LCD12864_RW_PORT = 0
LCD12864_DA_PORT = da
LCD12864_E_PORT = 1
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
LCD12864_E_PORT = 0
}
void lcd_delay_ms(uchar x)
{
uchar j
while(x--){
for(j=0j<125j++)
{}
}
}
void LCD12864_Reset()
/*LCD12864初始化*/
{
lcd_delay_ms(100)/*适当延时待LCD自动复位完成*/
LCD12864_NoWaitIdle_COM_Write(0x30)/*使用8位并口通讯*/
lcd_delay_ms(10)
LCD12864_NoWaitIdle_COM_Write(0x30)/*使用8位并口通讯*/
lcd_delay_ms(10)
LCD12864_NoWaitIdle_COM_Write(0x0c)/*显示开及光标设置*/
lcd_delay_ms(10)
LCD12864_NoWaitIdle_COM_Write(0x01)/*显示清屏*/
lcd_delay_ms(30)
LCD12864_NoWaitIdle_COM_Write(0x06)/*DDRAM的地址计数器(AC)加1*/
lcd_delay_ms(30)
}
void LCD12864_HANZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL)
//ST7920 汉字字符写入
//参数说明: xpos 待写入的X位置
//ypos 待写入的Y位置
//daH 待写入的汉字的高八位 daL待写入的汉字的低八位
{
uchar xy_pos
if((xpos>=8)||(ypos>=4) ) return/*X位置超出显示范围退出*/
if(ypos==0) xy_pos = 0x80 + xpos
else if(ypos==1) xy_pos = 0x90 + xpos/*计算转换地址*/
else if(ypos==2) xy_pos = 0x88 + xpos
else if(ypos==3) xy_pos = 0x98 + xpos
LCD12864_COM_Write(xy_pos)/*写地址*/
lcd_delay_ms(1)
LCD12864_Data_Write(daH)/*写高八位数据*/
lcd_delay_ms(1)
LCD12864_Data_Write(daL)/*写低八位数据*/
lcd_delay_ms(1)
}
//////////////////以上是LCD12864驱动程序////////////////
void main()
{
uchar i
LCD12864_Reset()/*LCD初始化*/
LCD12864_DA_PORT = 0xff /*释放P0端口*/
led_en_port = 0/*关闭发光二极管显示*/
sled_en_port = 0/*关闭数码管显示*/
while(1)
{
for (i=0i<6i++)
LCD12864_HANZI_WRITE(i,0,hanzi_buff1[i*2],hanzi_buff1[i*2+1])
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)