各种液晶屏里出现的 CGROM CGRAM DDRA
CGROM(中文字库)HCGROM(ASCII码字库)
字模存储用空间。你要显示某个ascii字符时,要显示字符的字模就存在这里。(存储字模的方式,请打开windows的画笔,在里面写个 A 字,然后放大8倍,你就知道了)
CGRAM(自定义字形)
用户自建字模区,有时ascii码表不能满足个人对字符的要求,则需要在这里写入字模。字模的方式和CGROM中的一样。
一般写入到这里的字模,其索引值为(0x00 ~ 0x07),建立好字模后,往DDRAM中写索引0x00,新建的字符就会显示出来。
显示数据RAM(DDRAM)、字符显示RAM缓冲区(DDRAM)
在1602中:显示用ram,直接和屏幕上的点相对应.屏幕上的一个点和ddram中的一个位对应,字符屏的ddram和图形屏的ddram有一点点区别。
对于图形屏,往ddram里写什么样的数据,屏幕上就会显示什么样的点,比如你写0x38, 则显示00111000。图形屏的ddram一般都会比屏幕显示大个2倍以上,为的是简化翻屏,以及实现其他特殊显示效果 。
编程步骤:
1、写操作(写指令(RS=0)、写数据(RS=1))
1.1写指令函数 write_command(UINT8 command);
1.2写数据指令 write_data(UINT8 data);
2、初始化液晶
2.1归位 write_command(0x02);
2.2设置输入方式 write_command(0x06);
2.3 控制显示开关 write_command(0x0c);
2.4功能设置 write_command(0x38);
2.5清屏 write_command(0x01);
3、写显示的数据
write_command(0x80);
write_data(‘1’);
程序代码(一):
#include
typedefunsigned char UINT8;
typedefunsigned int UINT16;
/**********端口定义********/
#defineDATA P0
sbitRS=P2^4;
sbitRW=P2^5;
sbitEN=P2^6;
/*********延时函数********/
voiddelayms(UINT16 ms)
{
UINT16 x,y;
for(x=ms;x>0;x--)
for(y=112;y>0;y--);
}
/***********写指令函数***********/
voidwrite_command(UINT8 command)
{
DATA=command;
RS=0;
RW=0;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
/***************写数据函数***********/
voidwrite_data(UINT8 dat)
{
DATA=dat;
RS=1;
RW=0;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
/***********LCD1602的初始化************/
voidLCD1602_Init(void)
{
write_command(0x01);//清除屏幕显示
write_command(0x02);//光标归位指令
write_command(0x06);//设定输入方式,增量不移位
write_command(0x0c);//整体显示,关光标,不闪烁
write_command(0x38);//8位格式,2行,5X7
}
/************显示函数************/
voiddisplay(UINT8 x,UINT8 y,UINT8 dat)
{
UINT8 adderss;
if(y==1)
adderss=0x80+x;
else
adderss=0xc0+x;
write_command(adderss);
write_data(dat);
}
/**************主函数*****************/
intmain(void)
{
RS=0;
RW=0;
EN=0;
LCD1602_Init();
display(2,2,'A');
while(1);
}
程序代码(二):
#include
typedefunsigned char UINT8;
typedefunsigned int UINT16;
/************端口定义*********/
#defineDATA P0
sbit RS=P2^4;
sbitRW=P2^5;
sbitEN=P2^6;
/********延时函数**********/
voiddelayms(UINT16 ms)
{
UINT16 x,y;
for(x=ms;x>0;x--)
for(y=112;y>0;y--)
;
}
/***********写命令函数**********/
voidwrite_command(UINT8 command)
{
RS=0;
RW=0;
DATA=command;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
/***********写数据函数**************/
voidwrite_data(UINT8 dat)
{
RS=1;
RW=0;
DATA=dat;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
/************LCD1602的初始化**********/
voidlcd_init(void)
{
write_command(0x01);//清屏显示
write_command(0x02);//光标的返回
write_command(0x06);//光标右移,文字不移动
write_command(0x0f);//显示打开,光标打开,光标闪烁
write_command(0x38);//8位总线,单行显示,5X7点阵
}
/***********主函数***************/
intmain(void)
{
RS=0;
RW=0;
EN=0;
lcd_init();
write_command(0x80);
write_data('1');
write_data('1');
write_data('1');
write_data('1');
while(1)
{
;
}
}