當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]1602 液晶手冊(cè)提供了一個(gè)初始化過(guò)程,由于不檢測(cè)“忙”位,所以程序比較復(fù)雜,而我們總結(jié)了一個(gè)更加簡(jiǎn)易方便的過(guò)程提供給大家,手冊(cè)上描述的那個(gè),大家僅僅作為了解就可以了,下面我把程序?qū)懗鰜?lái)大家看下,我們的初始

1602 液晶手冊(cè)提供了一個(gè)初始化過(guò)程,由于不檢測(cè)“忙”位,所以程序比較復(fù)雜,而我們總結(jié)了一個(gè)更加簡(jiǎn)易方便的過(guò)程提供給大家,手冊(cè)上描述的那個(gè),大家僅僅作為了解就可以了,下面我把程序?qū)懗鰜?lái)大家看下,我們的初始化只用了 4 條語(yǔ)句,沒(méi)有像手冊(cè)介紹的那么繁瑣。

#include

#define LCD1602_DB P0

sbit LCD1602_RS = P1^0;

sbit LCD1602_RW = P1^1;

sbit LCD1602_E = P1^5;

void InitLcd1602();

void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

void main(){

unsigned char str[] = "Kingst Studio";

InitLcd1602();

LcdShowStr(2, 0, str);

LcdShowStr(0, 1, "Welcome to KST51");

while (1);

}

/* 等待液晶準(zhǔn)備好 */

void LcdWaitReady(){

unsigned char sta;

LCD1602_DB = 0xFF;

LCD1602_RS = 0;

LCD1602_RW = 1;

do {

LCD1602_E = 1;

sta = LCD1602_DB; //讀取狀態(tài)字

LCD1602_E = 0;

}while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重復(fù)檢測(cè)直到其等于 0 為止

}

/* 向 LCD1602 液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值 */

void LcdWriteCmd(unsigned char cmd){

LcdWaitReady();

LCD1602_RS = 0;

LCD1602_RW = 0;

LCD1602_DB = cmd;

LCD1602_E = 1;

LCD1602_E = 0;

}

/* 向 LCD1602 液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(shù)據(jù)值 */

void LcdWriteDat(unsigned char dat){

LcdWaitReady();

LCD1602_RS = 1;

LCD1602_RW = 0;

LCD1602_DB = dat;

LCD1602_E = 1;

LCD1602_E = 0;

}

/* 設(shè)置顯示 RAM 起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo) */

void LcdSetCursor(unsigned char x, unsigned char y){

unsigned char addr;

if (y == 0){ //由輸入的屏幕坐標(biāo)計(jì)算顯示 RAM 的地址

addr = 0x00 + x; //第一行字符地址從 0x00 起始

}else{

addr = 0x40 + x; //第二行字符地址從 0x40 起始

}

LcdWriteCmd(addr | 0x80); //設(shè)置 RAM 地址

}

/* 在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針 */

void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str){

LcdSetCursor(x, y); //設(shè)置起始地址

while (*str != '