LCD1602驅動編寫(基於51單片機)

從前村裏的狗蛋撿到了阿拉丁神燈,狗蛋向神燈許了三個願望。第一個願望狗蛋說“我想學會如何驅動LCD1602”,神燈說:“so easy”,然後把這篇博客的鏈接發給了他。神燈問他還有兩個願望是什麼,狗蛋說:“希望神燈給這篇博客點贊加評論”,神燈看了文章但是忘記點贊,三天後,神燈猝。

目錄

1. LCD1602基本介紹
2. LCD1602原理圖
3. 引腳說明
4. 基本時序操作
5. 狀態字說明
6. 1602地址映射
7. 指令說明
8. 程序及仿真

OK,這當然是和大家開個玩笑,你們的肯定就是對我最大的支持與鼓勵,在接觸我們的1602之前先來放鬆一下神經,接下來,我們就來了解LCD1602不能說的祕密

管他三七二十一,我用液晶顯示器————我國著名詩人1602

LCD1602基本介紹:

從他的名言中我們可以定性的知道,LCD1602是一款液晶顯示器。
LCD是 Liquid Crystal Display也就是液晶顯示器的英文縮寫。
1602是由於他可顯示的區域是由16列2行的小黑塊構成,如下圖:
在這裏插入圖片描述

LCD1602原理圖:

在這裏插入圖片描述

引腳說明:

引腳 功能說明
GND、VCC 1,2號是電源正負極,15,16號是LCD背光電源正負極
VEE 液晶顯示偏壓信號,給的電壓不同對比度有所區別
RS 數據/命令選擇端(H/L)
RW 讀寫選擇端(H/L)
E 液晶使能端
D0~D7 寫入數據/命令端

基本時序操作:

操作 輸入 輸出
讀狀態 RS=L,RW=H,E=H D0~D7狀態字
寫指令 RS=L,RW=L.D0~D7=指令碼,E=高脈衝
讀數據 RS=H,RW=H,E=H D0~D7數據
寫數據 RS=H,RW=L,D0~D7=數據,E=高脈衝

(高脈衝就是一個信號由0到1再到0一個非常短暫而迅速的過程)

狀態字說明:

在這裏插入圖片描述
在每次進行讀寫操作時,要進行讀寫檢測,確保STA7(D7)爲0。
STA0~STA6(D0-D6)爲最開始寫入的指針地址。

1602地址映射圖:

在這裏插入圖片描述
每一行有40個字節,但是隻能顯示前16個字節,後面的地址主要是爲了顯示移動字幕而設置。

指令說明:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

具體程序:

#include <reg52.h>

#define DB P3
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;

void read_sta();		//讀狀態
void write_data(unsigned char dat);	//寫數據
void write_cmd(unsigned char cmd);		//寫指令
void set_cursor(unsigned int x,unsigned int y);  //設置初始顯示位置
void show_str(unsigned int x,unsigned int y,unsigned char *str); //顯示字符
void lcd_init(); //初始化LCD1602


void main()
{
	lcd_init();
	show_str(0,0,"LQJ_LCD1206");
	show_str(0,1,"HELLO_WORLD");
	while(1);
}

void read_sta()
{
	unsigned char sta;
	DB = 0XFF;
	RS = 0;
	RW = 1;
	do
	{
		E = 1;
		sta = DB;
		E = 0;
	}
	while(sta & 0x80);    //檢測到STA7=0,即可開始讀寫操作
}

void write_data(unsigned char dat)
{
	read_sta();      //對照寫數據的時序來看
	RS = 1;
	RW = 0;
	DB = dat;
	E = 1;
	E = 0;
}

void write_cmd(unsigned char cmd)
{
	read_sta();
	RS = 0;         //寫指令的時序來看
	RW = 0;
	DB = cmd;
	E = 1;   
	E = 0;
}

void set_cursor(unsigned int x,unsigned int y)
{
	unsigned char address;
	if(y == 0)           
		address = 0x00 + x;      //第一行,第x-1列
	else 
		address = 0x40 +x;       //第二行,第x-1列
	write_cmd(address | 0x80);   //地址或上1000 0000,寫入STA0~STA6地址值
}

void show_str(unsigned int x,unsigned int y,unsigned char *str)
{
	set_cursor(x,y);       //設置起始位置
	while(*str != '\0')    //不等於結束符就繼續寫入數據
	{
		write_data(*str++);
	}
}

void lcd_init()
{
	write_cmd(0x38);      //0011 1000,設置16X2顯示,5X7點陣,8位數據接口
	write_cmd(0x0c);      //0000 1100,開顯示,不顯示光標
	write_cmd(0x06);	  //0000 0110,讀一個字符後地址指針加一
	write_cmd(0x01);      //0000 0001,顯示清屏
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章