LCD1602.c文件的內容(這個一個完善的用51單片機實現1602液晶屏驅動文件帶protues仿真文件):
完整的程序源碼和仿真文件下載: http://www.zg4o1577.cn/f/TLC1543c51.rar
/*----File Description----
- File Name : LCD1602.h
- Functions :
- Description : None
- Author : Mason 別名:小菜
- Create Date : 2013/7/25
- Performance : Finished
- Global Variable : None
- File static Variable : None
- -------------------------------------------
- Revision History
- No. Date Revised by Item Description
-
-------------------------------------------------------------------------*/
/*----------------------------Head---------------------------------------*/
#include "LCD1602.h"
#include "delay.h"
/*----------------------------Code---------------------------------------*/
// LCD1602上電后初使化
void LCD1602_Init(void)
{
delayms(50); // 上電延時50ms.
write1602_byte(0x3c,0); // 功能設置:雙行、8位數據接口、5*10點陣字符.
while(Read1602_BF()); // 讀取1602的繁忙狀態(Busy Flag),直至空閑。
write1602_byte(0x0c,0); // 顯示開關:開;光標顯示:關;閃爍控制:關;
while(Read1602_BF()); // 讀取1602的繁忙狀態(Busy Flag),直至空閑。
write1602_byte(0x06,0); // 操作后,AC自增,畫面不動。
while(Read1602_BF()); // 讀取1602的繁忙狀態(Busy Flag),直至空閑。
write1602_clear();
CursorRST_1602(); // 光標復位,但DDRAM內容不變
}
/*----Function Description----
- Function Name : write1602_byte(uchar dat,bit RorS)
- Description : 發送一個字節數據
- Return Code : None
- Parameters/Arguments : dat 是一個字節數據,RorS 指定 dat 是數據還是指令
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
void write1602_byte(uchar dat,bit RorS)
{
RW_1602 = 0; // 寫
EN_1602 = 0;
delayus(10); // 數據建立時間,需大于1us.這里延時25us.
if(RorS) RS_1602 = 1; // dat is a data.
else RS_1602 = 0; // dat is a command.
EN_1602 = 1; // 使能脈沖需大于450ns。
DP_1602 = dat; // 整個使能周期需大于1ms。
delayus(10); // 延時25us
EN_1602 = 0;
delayms(1); // 指令執行時間,需大于40us.這里延時1ms.
}
/*----Function Description----
- Function Name : bit Read1602_BF(void)
- Description : 判斷1602指令執行狀態。
- Return Code : BF(busy flag),BF = 1 : busy.
- Parameters/Arguments : None
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
bit Read1602_BF(void) // 讀取1602的空閑狀態(Busy Flag)
{
RW_1602 = 1; // 讀
RS_1602 = 0;
delayus(50); // 延時100us,這里的延時需大于
DP_1602 <<= 1; // 讀指令最大執行時間40us.
return CY; // 將BF位移至CY位并返回.
}
void write1602_clear(void)
{
write1602_byte(CLRLCD1602,0); // 發送清屏指令。
delayms(50); // 延時需大于15.2ms,這里延時50ms
}
void CursorRST_1602(void) // 光標復位,但DDRAM內容不變
{
write1602_byte(CURRST1602,0); // 發送清屏指令。
delayms(50); // 延時需大于15.2ms,這里延時50ms
}
/*----Function Description----
- Function Name : write1602_DDRAM_pos(uchar px,uchar py)
- Description : DDRAM 為顯示數據存儲器。本函數更改指向DDRAM
的指針AC。
- Return Code : None
- Parameters/Arguments : py : row . 0 : First row . 1 : Second row .
px : 從左至右分別為 0 ~ 15 .
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
void write1602_DDRAM_pos(uchar px,uchar py)
{
if(py){
write1602_byte( px|0x80 + 0x40 , 0 );
}else{
write1602_byte( px|0x80 , 0 );
}
}
/*----Function Description----
- Function Name : write1602_CGRAM(uchar dat[8],uchar add)
- Description : 將一個字符(8個字節的數組)寫入 CGRAM。
- Return Code : None
- Parameters/Arguments : uchar dat[8]為字符數組。
uchar add 為自定義字符的訪問地址,取值應在 0~7.
- Global Variable : None
- static Variable : None
-------------------------------------------------------------------------*/
void write1602_CGRAM(uchar dat[8],uchar add)
{
uchar temp;
add %= 8; // 數據有效性處理
for(temp=0;temp<8;temp++)
{
write1602_byte( add<<3|0x40+temp , 0 ); // 寫 CGRAM 地址。
write1602_byte( dat[temp] , 1 ); // 寫 CGRAM 字符數據。
}
}
void draw1602_basic(void)
{
uchar temp;
for(temp=0;temp<8;temp++) // 裝載8個自定義符號
write1602_CGRAM(dat1602[temp],temp);
write1602_DDRAM_pos(0,0);
write1602_byte(4,1); // 顯示8個自定義符號
write1602_DDRAM_pos(15,0);
write1602_byte(5,1); // 顯示8個自定義符號
write1602_DDRAM_pos(0,1);
write1602_byte(6,1); // 顯示8個自定義符號
write1602_DDRAM_pos(15,1);
write1602_byte(7,1); // 顯示8個自定義符號
write1602_DDRAM_pos(5,0);
write1602_byte('m',1);
write1602_byte('a',1);
write1602_byte('s',1);
write1602_byte('o',1);
write1602_byte('n',1);
write1602_DDRAM_pos(2,1);
write1602_byte('v',1);
write1602_byte('o',1);
write1602_byte('l',1);
write1602_byte('t',1);
write1602_byte(':',1);
}
LCD1602.h頭文件的內容(這個一個完善的1602液晶屏驅動文件帶protues仿真文件):
/*----Head Description----
- File Name : LCD1602.h
- Author : Mason 別名:小菜
- Create Date : 2013/7/25
- -------------------------------------------
- Revision History
- No. Date Revised by Item Description
-
-------------------------------------------------------------------------*/
/*----------------------------Head---------------------------------------*/
#include <reg52.h>
#include "MICRO.h"
#ifndef _LCD1602_H_
#define _LCD1602_H_
/*----------------------------Interface----------------------------------*/
sbit RS_1602 = P0^5; // 1:數據;0:指令。
sbit RW_1602 = P0^6; // 1:讀; 0:寫。
sbit EN_1602 = P0^7; // 高電平使能
#define DP_1602 P2 // 數據/指令接口
/*----------------------------Micro--------------------------------------*/
// 指令設置(若不另加說明):需令RS1602 = 0;RW1602 = 0 ;
// 清屏
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 0 1
#define CLRLCD1602 0x01 // Clear LCD1602. 清屏
// 光標復位
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 1 *
#define CURRST1602 0x02 // Cursor restoration. 光標復位
// 輸入方式設置 // I : Increase, D : Decrease. AC : address counter. 地址寄存器。
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 1 I/D S
#define MODEIN1602 0x06 // AC Increase,Not Shift. 操作后,AC自增,畫面不動。
#define MODEDN1602 0x04 // AC Decrease,Not Shift. 操作后,AC自減,畫面不動。
#define MODEIS1602 0x07 // AC Increase,Shift. 操作后,AC自增,畫面平移。
#define MODEDS1602 0x05 // AC Decrease,Shift. 操作后,AC自減,畫面平移。
// 顯示開關控制 Display Setup
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 1 D C B
// D: Display Switch. 顯示開關。
// C: Cursor Switch. 光標開關。置位時顯示光標。
// B: Blink Switch. 閃爍控制。置位時光標閃爍。
// 將下列相應功能宏相或后賦值操作。
#define DISSET1602 0x08
#define SETDIS1602 0x04
#define SETCUR1602 0x02
#define SETBLI1602 0x01
// 光標/畫面位移(不改變DDRAM內容)
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 1 S/C R/L * *
// S/C: Screen or Cursor.
// R/L: Right or left.
// 功能設置
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 1 DL N F * *
// DL = 1,8位數據接口; DL = 0,4位數據接口。
// N = 1,兩行顯示; N = 0,單行顯示。
// F = 1,5*10點陣字符;F = 0,5*7點陣字符。
// CGRAM 地址設置,character generator RAM (0~3FH)
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 1 A5 A4 A3 A2 A1 A0
// DDRAM 地址設置
// DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 1 A6 A5 A4 A3 A2 A1 A0
// N = 0,單行顯示 A6 ~ A0 = 00H ~ 4FH
// N = 1,首行 A6 ~ A0 = 00H ~ 27H
// 次行 A6 ~ A0 = 40H ~ 67H
// 讀BF、AC值(BF:Busy Flag.)
// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 1 BF A6 A5 A4 A3 A2 A1 A0
// 寫數據
// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 1 BF A6 A5 A4 A3 A2 A1 A0
/*------------------------------Code Variable----------------------------*/
extern uchar code dat1602[][8]; // 自定義字符
/*----------------------------Function Declaration-----------------------*/
bit Read1602_BF(void); // 讀取1602的空閑狀態(Busy Flag)
void LCD1602_Init(void); // LCD1602上電初使化
void CursorRST_1602(void); // 光標復位,但DDRAM內容不變
void write1602_clear(void); // 清屏
void write1602_byte(uchar dat,bit RorS); // 寫一字節數據/指令.
void write1602_DDRAM_pos(uchar px,uchar py);// 寫指向DDRAM的地址指針
void write1602_CGRAM(uchar dat[8],uchar add);// 將一個5*8自定義字符寫入CGRAM中
void draw1602_basic(void);
#endif