LCD1602液晶顯示
各種液晶屏裡出現的 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<reg52.h>
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<reg52.h>
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)
{
;
}
}