主函數(shù)
#include "1602.h"
void main(void)
{
InitLcd1602();//初始化
LcdShowStr(0,0,"www.weimeng.com");//顯示屏幕上的,第1格,第一排,顯示字符串
LcdShowStr(2,1,"www.weimeng.com");//顯示屏幕上的,第3格,第二排,顯示字符串
}
LCD1602.c
#include<reg52.h>
#define LCD1602_DB P0 //data bus 數(shù)據(jù)總線
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;
/******************************底層時(shí)序***********************/
//CPU是否繁忙檢測(cè)函數(shù),判斷bit7是0,允許執(zhí)行;1禁止
void Read_Busy()
{
unsigned char sta;
LCD1602_DB = 0xff; //P0端口(D0-D7)的引腳全部給0xff
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_EN = 1; //使能
sta = LCD1602_DB;
LCD1602_EN = 0; //禁能,用完就拉低,釋放總線
}while(sta & 0x80); //(D7)STA7=0時(shí)允許下一步讀寫操作
} //(D7)STA7=1時(shí)禁止下一步讀寫操作
//寫命令
void Lcd1602_Write_Cmd(unsigned char cmd)
{
Read_Busy(); //繁忙檢測(cè)
LCD1602_RS = 0; //RS=0,是傳輸命令
LCD1602_RW = 0; //RW=0,是寫操作
LCD1602_DB = cmd; //把我們要寫的數(shù)值放到D0-D7上面去
LCD1602_EN = 1; //使能(開始)
LCD1602_EN = 0; //禁能(結(jié)束)
}
//寫數(shù)據(jù)
void Lcd1602_Write_Data(unsigned char dat)
{
Read_Busy(); //繁忙檢測(cè)
LCD1602_RS = 1; //RS=1,是傳輸數(shù)據(jù)
LCD1602_RW = 0; //RW=0,是寫操作
LCD1602_DB = dat; //把我們要寫的數(shù)值放到D0-D7上面去
LCD1602_EN = 1; //使能(開始)
LCD1602_EN = 0; //禁能(結(jié)束)
}
/****************************************************************/
/******************************高層時(shí)序***********************/
//坐標(biāo)顯示
// y=0是上面那一排,y=1是下面那一排
void LcdSetCursor(unsigned char x,unsigned char y) //本函數(shù)用來設(shè)置當(dāng)前光標(biāo)位置,其實(shí)就是設(shè)置當(dāng)前屏幕上用來編輯顯示的位置
{ //其實(shí)就是內(nèi)部的數(shù)據(jù)地址指針設(shè)置,其實(shí)就是RAM顯存的偏移量
unsigned char addr;
if(y == 0) //上面一排(00到0F的格子)
addr = 0x00 + x;
else //下面一排(40到4F的格子)
addr = 0x40 + x;
Lcd1602_Write_Cmd(0x80+addr); //效果一樣的建議使用(addr|0x80),因?yàn)橛?jì)算機(jī)計(jì)算位或的時(shí)候比計(jì)算加減法快
//數(shù)據(jù)指針設(shè)置(指哪個(gè)格子寫那格子)
}
//函數(shù)功能:從坐標(biāo)(x,y)開始顯示字符串str
//注意:這個(gè)函數(shù)不能跨行顯示,超過的就會(huì)跑到后面看不見的格子里面去
//不過我們是可以封裝出一個(gè)能夠折行顯示的函數(shù)的
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str) //顯示字符串
{
LcdSetCursor(x,y); //當(dāng)前字符的坐標(biāo)(調(diào)用了坐標(biāo)顯示函數(shù))
//X用于指哪一列格子,Y用于指向行
while(*str != '\0')
{
Lcd1602_Write_Data(*str++);//寫入內(nèi)容對(duì)應(yīng)的ASCLL碼用于顯示
}
}
//初始化LCD,讓它能開始正常工作
void InitLcd1602() //1602初始化
{
Lcd1602_Write_Cmd(0x38); //顯示模式設(shè)置:16x2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
Lcd1602_Write_Cmd(0x08); //關(guān)閉顯示:顯示開/關(guān)及光標(biāo)指令設(shè)置
Lcd1602_Write_Cmd(0x01); //清屏
Lcd1602_Write_Cmd(0x06); //顯示光標(biāo)移動(dòng)設(shè)置
//全部設(shè)置好以后在打開顯示防止花屏(雖然一瞬間的花屏無傷大雅)
Lcd1602_Write_Cmd(0x0c); //打開顯示:顯示開/關(guān)及光標(biāo)指令設(shè)置
}
LCD1602.h
#ifndef __1602_H__
#define __1602_H__
//只需要聲明高層時(shí)序即可,而低層時(shí)序是不需要聲明的。
//因?yàn)槲覀冊(cè)陬^文件中聲明這個(gè)函數(shù),目的是為了讓別的文件去包含這個(gè)頭文件
//從而可以調(diào)用這個(gè)頭文件中聲明的函數(shù),所以我們只需要聲明1602.c中將來會(huì)被外部.c文件調(diào)用的那些函數(shù)即可。
//而1602.c中自己使用的內(nèi)部函數(shù)將來也不會(huì)被外部.c文件調(diào)用,因此就不用聲明了
//只需要聲明高層時(shí)序即可,而低層時(shí)序是不需要聲明的。
void LcdSetCursor(unsigned char x,unsigned char y);//坐標(biāo)顯示
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str); //顯示字符串(調(diào)用了坐標(biāo)顯示函數(shù))
void InitLcd1602();//初始化LCD1602
#endif
接線圖:
?
1、1602屏幕=16x2=32個(gè)字符,總共有32個(gè)字符
?2、每個(gè)字符由35個(gè)像素組成
每個(gè)像素由一小塊液晶控制
---------------------------------------------------------------------------------------------------------------------------------
液晶的控制原理:
不施加電壓——液晶完全透明:0(透明)
施加電壓——---液晶變不透明:1(不透明)
注意:通上電后LED背光板是一直發(fā)光的
黃的是背光板,灰的是液晶
組成:
1、背光板、液晶
2、控制液晶的芯片:HD44780U
---------------------------------------------------------------------------------------------------------------------------------
控制原理:
控制原理:CUP因?yàn)橐_不夠所以一般不直接控制液晶,而是通過控制芯片HD44780U來控制液晶
HD44780U芯片的控制范圍:總共有80個(gè)字節(jié)的顯存(DRAM)
HD44780U芯片:
橫向:控制顯示40個(gè)字符
豎向:控制2個(gè)字符
LCD1601顯示屏:
但是LCD1601顯示屏上只能顯示的范圍:
第一排:00字符——0F字符(16個(gè)字符)
第二排:40字符——4F字符(16個(gè)字符)
控制LCD1601顯示屏:永遠(yuǎn)有48個(gè)字節(jié)用不到
---------------------------------------------------------------------------------------------------------------------------------
?
液晶只能顯示:ASCLL碼上的數(shù)字、字母、符號(hào)
顯示字符到對(duì)應(yīng)的液晶塊的代碼原理:
第一步:CPU——發(fā)送顯存地址——————————>HD44780U芯片——>LCD1602
第二步:CPU——在發(fā)送顯示字符的ASCLL碼————>HD44780U芯片——>LCD1602
---------------------------------------------------------------------------------------------------------------------------------
HD44780U芯片引腳分布圖以及原理:
COM引腳控制:橫向像素
SEG引腳控制 :縱向像素
COM控制一行:給低電壓
SEG控制一豎:給高電壓顯示 或者 給低電壓不顯示
弊端:
這樣子一次只能顯示一行像素的。
要顯示全部的像素如何解決呢?
解:逐行掃描的控制方式;
這樣子我們?nèi)搜鄄痪涂吹揭恢痹趻呙枇藛幔?/strong>
不會(huì)的,這是通過人眼的視覺暫留原理,因?yàn)橹鹦袙呙璧念l率很快,所以人眼看到的是靜止的畫面
---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
?HD44780U芯片:
一共有40個(gè)SEG引腳,但是一個(gè)字符要用5個(gè)SEG引腳,這樣子只能控制縱向的8個(gè)區(qū)域
問:另外縱向的8個(gè)區(qū)域的16個(gè)字符怎么控制?
?答:HD44780U芯片??HD44100H芯片是協(xié)助主控完成另外一半的顯示任務(wù)的
?HD44100H芯片:
HD44780U芯片??HD44100H芯片=80個(gè)SEG引腳
???????????????????????????????????? 剛好可以控制LCD1602的所有像素也就是32個(gè)字符的顯示
---------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------應(yīng)用擴(kuò)展-------------------------------------------------------------
?
在原來的基礎(chǔ)上在加三塊,在換一款能顯示80字符的液晶顯示屏,就能控制80個(gè)字符的顯示了。文章來源:http://www.zghlxwxcb.cn/news/detail-469801.html
但這在多控制都不可能了,因?yàn)镠D44780U芯片此時(shí)的顯存已經(jīng)滿了文章來源地址http://www.zghlxwxcb.cn/news/detail-469801.html
到了這里,關(guān)于LCD1602液晶顯示屏的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!