一.LCD1602介紹
1.LCD1602 (Liquid Crystal Display
)液晶顯示屏是一種字符型液晶顯示模塊,可以顯示ASCII碼的標(biāo)準(zhǔn)字符和其它的一些內(nèi)置特殊字符,還可以有8個自定義字符。
2.顯示容量:16x2個字符,每個字符為5*7點陣。
二.LCD1602接口介紹
引腳 | 功能 |
VSS | 接地 |
VDD | 電源正極(4.5v-5.5v) |
VO | 對比調(diào)節(jié)電壓 |
RS | 數(shù)據(jù)/指令選擇,1為數(shù)據(jù),0為指令 |
RW | 讀/寫選擇,1為讀,0為寫 |
E | 使能,1為數(shù)據(jù)有效,下降沿執(zhí)行命令(使能:相當(dāng)于遙控器的電源鍵) |
D0-D7 | 數(shù)據(jù)輸入/輸出 |
A | 背燈電源正極 |
K | 背燈電源負(fù)極 |
注:當(dāng)RS=1時,D0-D7為數(shù)據(jù),當(dāng)RS=0時,D0-D7為指令。
三.LCD1602原理圖
四.LCD1602內(nèi)部結(jié)構(gòu)圖?
?DDRAM:在哪個方格子顯示數(shù)據(jù)(RS=0——指令)。
CGRAM(可寫)+CGROM(不可寫):在方格子顯示什么數(shù)據(jù)(RS=1——數(shù)據(jù))。
AC(光標(biāo)位置):控制當(dāng)前要寫在屏幕對應(yīng)的那個格子。
DDRAM確定顯示位置然后字模庫顯示想要數(shù)據(jù),最后輸出在屏幕上。
五.時序結(jié)構(gòu)
?RS,RW和D7-D0上面介紹過了,這里介紹E,E下面有一行字母valid Data(有效數(shù)據(jù)),則E為高電平的時候數(shù)據(jù)有效,之后在設(shè)置為低電平,以便下一次數(shù)據(jù)設(shè)置,因此代碼為:
E=1;
Delay1ms();
E=0;
Delay1ms();
所以想寫數(shù)據(jù)跟指令的代碼為:
#include <REGX52.H>
#include <INTRINS.H>
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCE_Dataport P0
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void LCD_WriteCommand(unsigned char Command)//寫指令
{
LCD_RS=0;
LCD_RW=0;
LCE_Dataport=Command;
LCD_EN=1;
Delay1ms();
LCD_EN=0;
Delay1ms();
}
void LCD_WriteData(unsigned char Data)//寫數(shù)據(jù)
{
LCD_RS=1;
LCD_RW=0;
LCE_Dataport=Data;
LCD_EN=1;
Delay1ms();
LCD_EN=0;
Delay1ms();
}
六.LCD1602初始化
初始化就是設(shè)置LCD1602一開始顯示的功能,一般設(shè)置為:
void LCD_WriteCommand(unsigned char Command)//寫指令
{
LCD_RS=0;
LCD_RW=0;
LCE_Dataport=Command;
LCD_EN=1;
Delay1ms();
LCD_EN=0;
Delay1ms();
}
void LCD_Init(void)//初始化
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
七.如何表示顯示位置??
如果想顯示在第一行第二列的話則表示十六進制的0x01,但是顯示在那里時,要求最高位D7為高電平,因此從0000 0001變成1000 0001,因此每次高位為0x80,所以就是0x80+0x01=0x81,在代碼里面第一行第二行可以直接表示1或2,但是列卻要減1以后在化成十六進制,所以第一行第n列則為(0x80 |( lie-1))?,第二行第n列則表示(0x80 |(lie-1)+0x40),第二行加上0x40是因為第二行開始就是40H,而不是00H,下面代碼展示。
#include <REGX52.H>
#include <INTRINS.H>
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCE_Dataport P0
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void LCD_WriteCommand(unsigned char Command)//寫指令
{
LCD_RS=0;
LCD_RW=0;
LCE_Dataport=Command;
LCD_EN=1;
Delay1ms();
LCD_EN=0;
Delay1ms();
}
void LCD_Setcursor(unsigned char line,unsigned char column)//行,列
{
if(line==1)//設(shè)置光標(biāo)位置
{
//第一列是數(shù)字1,但是位置是0x00,要把數(shù)字1轉(zhuǎn)換0x00,就把數(shù)字1-1就0,所以轉(zhuǎn)十六進制就是0x00
LCD_WriteCommand(0x80|(column-1));
}
else
{
//第二行的第一列是從0x40開始,第二列是0x41,相當(dāng)于0x40+0x01,0x01就是與上面一致
LCD_WriteCommand(0x80|(column-1)+0x40);
}
}
八.如何表示顯示的數(shù)據(jù)?
?
如果想顯示字符A,則為0100 0001,化為十六進制就是0x41,在對照ASCLL碼中的A剛剛好是0x41,因此想寫數(shù)據(jù)直接'A',就可以了。?
九.LCD1602總代碼
下圖對應(yīng)最下面代碼的LCD—Shownum文章來源:http://www.zghlxwxcb.cn/news/detail-734355.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-734355.html
#include <REGX52.H>
#include <INTRINS.H>
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCE_Dataport P0
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void LCD_WriteCommand(unsigned char Command)//寫指令
{
LCD_RS=0;
LCD_RW=0;
LCE_Dataport=Command;
LCD_EN=1;
Delay1ms();
LCD_EN=0;
Delay1ms();
}
void LCD_WriteData(unsigned char Data)//寫數(shù)據(jù)
{
LCD_RS=1;
LCD_RW=0;
LCE_Dataport=Data;
LCD_EN=1;
Delay1ms();
LCD_EN=0;
Delay1ms();
}
void LCD_Init(void)//初始化
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
void LCD_Setcursor(unsigned char line,unsigned char column)
{
if(line==1)//設(shè)置光標(biāo)位置
{
//第一列是數(shù)字1,但是位置是0x00,要把數(shù)字1轉(zhuǎn)換0x00,就把數(shù)字1-1就0,所以轉(zhuǎn)十六進制就是0x00
LCD_WriteCommand(0x80|(column-1));
}
else
{
//第二行的第一列是從0x40開始,第二列是0x41,相當(dāng)于0x40+0x01,0x01就是與上面一致
LCD_WriteCommand(0x80|(column-1)+0x40);
}
}
void LCD_Showchar(unsigned char line,unsigned char column,unsigned char Char)//line行,column列,Char字符
{//顯示一個字符
LCD_Setcursor(line,column);
LCD_WriteData(Char);
}
void LCD_Showstring(unsigned char line,unsigned char column,unsigned char *string)//line行,column列,string字符串
{//顯示字符串,字符串直接等于指針,不用數(shù)組形式等于字符串,在等于指針形式,那傳給指針的就是字符串的第一個字符的地址,然后string【i】一直往下就可以知道字符串,數(shù)組是連續(xù)的,如果baby的b在第一行第一列,那a就會在第一行,第二列。
unsigned char i;
LCD_Setcursor(line,column);
for(i=0;string[i]!='\0';i++)
{
LCD_WriteData(string[i]);//字符串本身就是地址,所以傳進來的字符串用指針string來接
}
}
int LCD_Pow(int X,int Y)//平方函數(shù),列如:10^2
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}
void LCD_Shownum(unsigned char line,unsigned char column,unsigned int number,unsigned char length)
{
unsigned char i;
LCD_Setcursor(line,column);
for(i=length;i>0;i--)
{
//+'0'是因為number/LCD_Pow(10,i-1) %10對應(yīng)ASCLL碼里面的十進制,想要字符的話得從0x40開始,然后加上十進制化成十六進制,0x40就是'0'
LCD_WriteData('0'+number/LCD_Pow(10,i-1) %10);
}
}
void LCD_Showsignednum(unsigned char line,unsigned char column,int number,unsigned char length)
{
unsigned char i;
unsigned int Number1;
LCD_Setcursor(line,column);
if(number>=0)
{
LCD_WriteData('+');
Number1=number;
}
else
{
LCD_WriteData('-');
Number1=-number;
}
for(i=length;i>0;i--)
{
LCD_WriteData('0'+Number1/LCD_Pow(10,i-1) %10);
}
}
void LCD_Showhexnum(unsigned char line,unsigned char column,unsigned int number,unsigned char length)
{
unsigned char i;
unsigned char singlenumber;
LCD_Setcursor(line,column);
for(i=length;i>0;i--)
{
singlenumber=number/LCD_Pow(16,i-1) %16;
if(singlenumber<10)
{
LCD_WriteData('0'+singlenumber);
}
else
{
LCD_WriteData('A'+singlenumber-10);
}
}
}
void main()
{
LCD_Init();
LCD_Showchar(2,2,'I');
LCD_Showchar(2,4,'L');
LCD_Showchar(2,5,'O');
LCD_Showchar(2,6,'V');
LCD_Showchar(2,7,'E');
LCD_Showchar(2,9,'Y');
LCD_Showchar(2,10,'O');
LCD_Showchar(2,11,'U');
LCD_Shownum(1,8,520,3);
LCD_Shownum(1,11,1314,4);
LCD_Showsignednum(2,12,-8,1);
LCD_Showhexnum(2,15,0xA6,2);
while(1)
{
}
}
到了這里,關(guān)于51單片機——LCD1602模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!