1. 程式人生 > >51微控制器驅動1602液晶顯示器的小例子

51微控制器驅動1602液晶顯示器的小例子

首先附上1602的相關資料:

引腳功能

1602採用標準的16腳介面,其中:
第1腳:VSS為電源地
第2腳:VCC接5V電源正極
第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產生“鬼影”,使用時可以通過一個10K的電位器調整對比度)。
第4腳:RS為暫存器選擇,高電平1時選擇資料暫存器、低電平0時選擇指令暫存器。
第5腳:RW為讀寫訊號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。
第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取資訊,負跳變時執行指令。
第7~14腳:D0~D7為8位雙向資料端。

第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。

指令表:

指令碼 功 能
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
清除顯示 0 0 0 0 0 0 0 0 0 1 將DDRAM填滿"20H",並且設定DDRAM的地址計數器(AC)到"00H"
地址歸位 0 0 0 0 0 0 0 0 1 X 設定DDRAM的地址計數器(AC)到"00H",並且將遊標移到開頭原點位置;這個指令不改變DDRAM 的內容
顯示狀態開/關 0 0 0 0 0 0 1 D C B [D=1: 整體顯示 ON][C=1: 遊標ON] [B=1:遊標位置反白允許]
進入點設定 0 0 0 0 0 0 0 1 I/D S 指定在資料的讀取與寫入時,設定遊標的移動方向及指定顯示的移位
遊標或顯示移位控制 0 0 0 0 0 1 S/C R/L X X 設定遊標的移動與顯示的移位控制位;這個指令不改變DDRAM 的內容
功能設定 0 0 0 0 1 DL X RE X X [DL=0/1:4/8位資料] [RE=0/1: 基本指令操作 / 擴充指令操作]
設定CGRAM地址 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 設定CGRAM 地址
設定DDRAM地址 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 設定DDRAM 地址(顯示位址) [第一行:80H-A7H] [第二行:C0H-E7H]
讀取忙標誌和地址 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 讀取忙標誌(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值
寫資料到RAM 1 0 資料 將資料D7——D0寫入到內部的RAM (DDRAM/CGRAM/IRAM/GRAM)
讀出RAM的值 1 1 資料 從內部RAM讀取資料D7——D0(DDRAM/CGRAM/IRAM/GRAM)

特性:

3.3V或5V工作電壓,對比度可調
內含復位電路
提供各種控制命令,如:清屏、字元閃爍、游標閃爍、顯示移位等多種功能
有80位元組顯示資料儲存器DDRAM
內建有192個5X7點陣的字型的字元發生器CGROM
8個可由使用者自定義的5X7的字元發生器CGRAM

測試電路原理圖:

測試程式碼:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^2;     //使能端
sbit lcdrs=P3^0;	 //資料命令選擇端
sbit rw=P3^1;
uchar code table[]="xian shi 1";  //輸入的字元
uchar code table1[]="xian shi 2";  //輸入的字元
uchar num=0;

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}

void write_com(uchar com)//根據寫時序圖寫出指令程式
{
	lcdrs=0;
	rw=0;
	P1=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}

void write_data(uchar date)//根據寫時序圖寫出資料程式
{
	lcdrs=1;
 	rw=0;
	P1=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}

void init()
{
	lcden=0; //使能端為低電平
	write_com(0x38);
	/*顯示模式設定  00111000  設定16*2顯示  5*7點陣  8位資料介面*/
	write_com(0x0f);
	/*顯示開關及游標設定   00001DCB
	D=1,開顯示     D=0, 關顯示
	C=1,顯示游標   C=0,不顯示游標
	B=1,游標閃爍   B=0,游標不閃爍*/
	write_com(0x06);//地址指標自動+1且游標+1,寫字元螢幕不會移動
	write_com(0X01);
	write_com(0X80); 
}


void main()
{

	init();
	for(num=0;num<10;num++)    //輸入的字元數量,修改
	{
		write_data(table[num]);
		delay(50);
	}
	write_com(0X80+0x40);
	for(num=0;num<10;num++)	//輸入的字元數量,修改
	{
		write_data(table1[num]);
		delay(50);
	}
	while(1);
}


測試效果: