大家好,又見面了,我是你們的朋友全棧君。 lcd1602 +c51 介紹 文章目錄LCD1602介紹
所謂的1602是指顯示的時候,有2行內(nèi)容每行有16個字符。其實這類字符型產(chǎn)品都可以這樣解讀比如:lcd12864就是有128行64列。目前市面上字符液晶大多數(shù)是基于HD44780液晶芯片的,控制原理大多相同。因此基于HD44780寫的液晶控制程序可以很方便適用于市面上大多數(shù)字符型液晶產(chǎn)品。 1602引腳信號說明字符型LCD1602通常分為14條引腳和16引腳兩種,16引腳多出來的是背光電源線VCC(15引腳)和地線(16引腳),其控制原理與14引腳LCD完全一樣,引腳定義如下表:
控制器接口介紹1、基本操作時許
2、狀態(tài)字說明
對控制器每次進行讀寫操作前,都必須進行讀寫檢測,確保STA7為0 3、指令說明初始化設置 顯示模式設置 顯示開/關光標設置 數(shù)據(jù)控制 控制器內(nèi)部沒有一個數(shù)據(jù)地址指針,可以通過他們來訪問內(nèi)部的全部80字節(jié)RAM。 其他設置
初始化過程: 延時
寫指令38H
延時
寫指令38H
延時
寫指令38H
(每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測信號)
寫指令38H:顯示模式設置
寫指令08H:顯示關閉
寫指令01H:顯示清屏
寫指令06H:顯示光標移動設置
寫指令0CH:顯示開及光標設置 代碼:
RAM地址映射HD44780內(nèi)置DDRAM、CGROM和CGRAM。 DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個字節(jié),地址和屏幕的對應關系如下:
也就是說想要在LCD1602屏幕上的第一行第一個位置顯示一個“A”,就要向DDRAM的00H地址寫“A”字的代碼就OK了,但具體的寫入是要按照LCD模塊的指令格式來進行的。 但是我們發(fā)現(xiàn)每一行有40個地址,而我們們每行只能顯示16個字符,其實際多的位置可以實現(xiàn)字符的移動,我們在看大佬作品的時候可能會見到有的字符是從左面移過來,他的實現(xiàn)形式就用到了著些多的地址。將數(shù)據(jù)先寫到未顯示的地址然后使用指令進行左移就可以了。 那么1602顯示的地址又是什么吶?下圖就是DDRAM地址與現(xiàn)實位置的對應關系。 控制時序圖1、讀操作時序圖: 2、寫操作時序圖: 3、時序參數(shù) 代碼實現(xiàn)LCDE = E //使能信號 寫入命令RS=L,RW=L,D0~D7=指令碼,E=高脈沖。 void LcdWriteCom(unsigned char com){
//寫入命令
RS = 0;
RW = 0;
GPIO_LCD=com;
Delay1ms(10);
LCDE = 1; //給一個高脈沖
Delay1ms(10);
LCDE = 0;
} 寫數(shù)據(jù)RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖。
試驗例程main.c文件 #include<reg52.h>
#include'lcd.h'
unsigned char CnCh[] = '012345678912345';
unsigned char CnCh1[] = 'ABCDEFGIJKLMNOP';
unsigned char i,a =0,j,n;
unsigned char code Data_1[]=' I Love You '; // 第一行顯示,共十六個字符
unsigned char code Data_2[]='Good Good Study,Day Day Up !'; // 第二行顯示,共28個字符
unsigned char i;
void main(){
lcd_Init();
lcd_write_com(0x80);
for(i = 0;i<16;i++){
lcd_read_busy();
lcd_write_dat(CnCh[i]);
}
lcd_write_com(0xc0);
for(i = 0;i<16;i++){
lcd_read_busy();
lcd_write_dat(CnCh1[i]);
}
while(1);
}
void zimo(){
unsigned char code Data_0[]={
0x0f, 0x12, 0x0f, 0x0a, 0x1f, 0x02, 0x02, 0x02}; // 漢字 年 的字模
unsigned char code Data_1[]={
0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x0b, 0x11}; // 漢字 月 的字模
unsigned char code Data_2[]={
0x1f, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x1f, 0x00}; // 漢字 日 的字模
lcd_Init(); // LCD1602 初始化
lcd_write_com(0x40); // 0100 0000; 指令 0x40 向 CGRAM 地址0 寫入自定義數(shù)據(jù)
for(i=0; i<8; i++){
lcd_write_dat(Data_0[i]); // 寫入自定義字符字模
}
lcd_write_com(0x48); // 0100 1000; 指令 0x48 向 CGRAM 地址1 寫入自定義數(shù)據(jù)
for(i=0; i<8; i++){
lcd_write_dat(Data_1[i]); // 寫入自定義字符字模
}
lcd_write_com(0x50); // 0101 0000; 指令 0x50 向 CGRAM 地址2 寫入自定義數(shù)據(jù)
for(i=0; i<8; i++){
lcd_write_dat(Data_2[i]); // 寫入自定義字符字模
}
lcd_write_com(0x00 + 0x80); // 在第一行第一列顯示 第一個字符
lcd_write_dat(0);
lcd_write_com(0x02 + 0x80); // 在第一行第三列顯示 第二個字符
lcd_write_dat(1);
lcd_write_com(0x04 + 0x80); // 在第一行第五列顯示 第一個字符
lcd_write_dat(2);
while(1);
/* //分割線******************************************************************* unsigned char table[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A}; lcd_Init(); lcd_write_com(0x40); for(i=0;i<8;i++){ lcd_write_dat(table[i]); } lcd_write_com(0x80); lcd_write_dat(0x00); while(1); */
}
//單行移動顯示**************************************************************
void dh(){
lcd_Init();
lcd_write_com(0x80); // 第一行第一列地址
for(i=0; i<16; i++){
lcd_write_dat(Data_1[i]); // 顯示第一行
}
while(1){
lcd_read_busy();
lcd_write_com(0xc0); // 第二行第一列地址
for(j=n; j<28+n; j++){
lcd_write_dat(Data_2[j]); // 顯示第二行
}
n++;
if(n >= (28-15)){
// 當數(shù)據(jù)移動到最后時,n 重置 0,停頓 500 ms,重新開始移動顯示
n = 0;
delay1ms(50);
}
delay1ms(20); // 控制移動速度
}
} lcd.c文件
lcd.h文件 #ifndef __LCD_H_
#define __LCD_H_
#include<reg52.h>
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
void delay1ms(unsigned char d); //延時函數(shù)
void lcd_Init(); //初始化
void lcd_write_com(unsigned char com); //寫指令
void lcd_write_dat(unsigned char dat); //寫數(shù)據(jù)
void lcd_xy(unsigned char x,unsigned char y); //寫位置
void lcd_read_busy(); //檢測標志位
#endif CGRAM自定義字模(簡易漢字顯示)這里說明一下lcd1602液晶是不能顯示漢字的,因為它的顯示原理是由若干個5X7或者5X11的點陣字符位組成的,又因為漢字較為復雜,所以1602的主要作用就是顯示字母、數(shù)字、符號的。但是真的不能顯示漢字嗎?也并非絕對不能。接就是下面要說的CGRAM自定義字模。 要顯示我們自定義的字符,就要用到LCD中的CGRAM存儲器(character generate RAM),而我們之前用的顯示自帶的字符用到的是DDRAM,兩個是不同的??词謨晕覀冎溃珻GRAM的容量是64個字節(jié),而一個字符是8個字節(jié),所以一共能顯示8個自定義的字符。內(nèi)部常用字符的顯示是從0x20開始的,0x00 ~ 0x0F是專門留給自定義字符顯示用的,0x00-0x07和0x08~0x0F顯示的內(nèi)容是一樣的,也就是說0x00=0x08,0x01=0x09,以此類推。CGRAM共128個位,地址是0x40-0x7F,128/8=16正好對應的是0x00-0x0F共16個,剛才說了,0x00與0x08對應,0x01與0x09對應,共16個,這并不矛盾!說了這么多,那么怎樣顯示一個自定義字符呢? 首先我們要清楚LCD1602顯示字符的點陣大小,眼力好的可以看出來,LCD1602一個顯示字符的位置是58的點陣,也就是說它所能顯示的點陣圖形的大小是58的!要顯示一個自定義的字符,首先我們要知道所顯示自定義字符的點陣數(shù)據(jù),也就是在一個58的點陣上那個點是黑的(將該點點黑,就是高電平—-1),哪個點是白的(該點不顯示,為低電平—-0),但是我們送入到LCD中的是ASCII碼,它是8位的數(shù)據(jù),而一個顯示字符的點陣大小只是58的,顯然不夠,顯示的辦法是8*8點陣的前三列不用,也就是不顯示,我們只用后面的5列來顯示。 然后設定我們是要定義第幾個自定義字符,前面已經(jīng)介紹了,LCD1602最多顯示8個自定義字符;然后要規(guī)定在液晶的什么位置顯示自定義字符,看過數(shù)據(jù)手冊我們知道,第一行第一個位置的地址是0x80,第二行一個位置的地址是0xC0。最后就是要顯示我們定義的第幾個字符其對應CGRAM地址的關系式是:
每個字符由5X8點陣組成(也可選用5X10) ,想要實現(xiàn)顯示,只需如下圖: 例:以5X8點陣為例,顯示字符 A
代碼 流程
void type_model_diy(){
unsigned char code Data_0[]={
0x0e,0x11,0x11,0x11,0x1f,0x11,0x11,0x11}; // 字母A
lcd_Init(); // LCD1602 初始化
lcd_write_com(0x40); // 0100 0000; 指令 0x40 向 CGRAM 地址0 寫入自定義數(shù)據(jù)
for(i=0; i<8; i++){
lcd_write_dat(Data_0[i]); // 寫入自定義字符字模
}
lcd_write_com(0x00 + 0x80); // 在第一行第一列顯示 第一個字符
lcd_write_dat(0);
while(1);
} END! 發(fā)布者:全棧程序員棧長,轉載請注明出處:https:///160148.html原文鏈接:https:// |
|
來自: 新用戶84005529 > 《待分類》