1. 程式人生 > 實用技巧 >控制LCD1602液晶屏顯示

控制LCD1602液晶屏顯示

判斷液晶忙:

判斷STA7是否為1,所以將P0口匯流排的資料和0x80進行與運算。

每次對1602寫指令都需要判斷是否忙。

void Read_busy()
{
uchar busy;
P0 = 0xff;
RS = 0;
RW = 1;
do{
EN = 1;
busy = P0;
EN = 0;
}
while(busy & 0x80);
}

寫位元組和寫資料都是按照1602的資料手冊來寫的。

在顯示數字的時候要用 Write_Dat(3 + '0');


在指定位置顯示一個字元:
要顯示的橫座標取值0-40

要顯示的行座標取值0-1(0為第一行,1為第二行)

dat:需要顯示的資料以ASCLL形式顯示


void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
LCD1602_Write_Dat(dat);
}

顯示字串的時候就需要用到指標:
在指定位置顯示字串:
要顯示的橫座標取值0-40

要顯示的行座標取值0-1(0為第一行,1為第二行)

*str:需要顯示的字串


void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
while(*str != '\0')
{
LCD1602_Write_Dat(*str++);
}
}

呼叫方式:

uchar TestStr[] = {"Welcome!"};

LCD1602_Dis_Str(0, 0, &TestStr[0]);

1602初始化函式:

void Init_LCD1602()
{
LCD1602_Write_Cmd(0x38); //設定16*2顯示,5*7點陣,8位資料介面
LCD1602_Write_Cmd(0x0c); //開顯示
LCD1602_Write_Cmd(0x06); //讀寫一位元組後地址指標加1
LCD1602_Write_Cmd(0x01); //清除顯示
}

顯示簡單的數字:

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;

void
Read_busy() //判斷液晶忙 { uchar busy; P0 = 0xff; RS = 0; RW = 1; do{ EN = 1; busy = P0; EN = 0; } while(busy & 0x80); } void Write_Cmd(uchar cmd) //寫LCD1602命令一個位元組 { Read_busy(); RS = 0; RW = 0; P0 = cmd; EN = 1; EN = 0; } void Write_Dat(uchar dat) //寫一個位元組資料 { Read_busy(); RS = 1; RW = 0; P0 = dat; EN = 1; EN = 0; } void main() { Write_Cmd(0x38);//設定16*2顯示 Write_Cmd(0x0f);//開顯示 顯示游標,游標閃爍 Write_Cmd(0x01);//清屏 Write_Cmd(0x06);//地址指標移位命令 Write_Cmd(0x80 | 0x00);//顯示地址 Write_Dat(1 + '0'); Write_Dat(2 + '0'); Write_Dat(3 + '0'); Write_Dat(4 + '0'); Write_Dat(5 + '0'); while(1); }

顯示字串:

#include <reg52.h>
typedef unsigned char uchar; typedef unsigned int uint; #define LCD1602_DB P0 //LCD1602資料匯流排 sbit LCD1602_RS = P3^5; //RS端 sbit LCD1602_RW = P3^6; //RW端 sbit LCD1602_EN = P3^4; //EN端 sbit DU = P2^6;// sbit WE = P2^7;//數碼管位選段選用於關閉數碼管顯示 /*================================================= *函式名稱:Read_Busy *函式功能:判斷1602液晶忙,並等待 =================================================*/ void Read_Busy() { uchar busy; LCD1602_DB = 0xff;//復位資料匯流排 LCD1602_RS = 0; //拉低RS LCD1602_RW = 1; //拉高RW讀 do { LCD1602_EN = 1;//使能EN busy = LCD1602_DB;//讀回資料 LCD1602_EN = 0; //拉低使能以便於下一次產生上升沿 }while(busy & 0x80); //判斷狀態字BIT7位是否為1,為1則表示忙,程式等待 } /*================================================= *函式名稱:LCD1602_Write_Cmd *函式功能:寫LCD1602命令 *呼叫:Read_Busy(); *輸入:cmd:要寫的命令 =================================================*/ void LCD1602_Write_Cmd(uchar cmd) { Read_Busy(); //判斷忙,忙則等待 LCD1602_RS = 0; LCD1602_RW = 0; //拉低RS、RW操作時序情況1602課件下中文使用說明基本操作時序章節 LCD1602_DB = cmd;//寫入命令 LCD1602_EN = 1; //拉高使能端 資料被傳輸到LCD1602內 LCD1602_EN = 0; //拉低使能以便於下一次產生上升沿 } /*================================================= *函式名稱:LCD1602_Write_Dat *函式功能:寫LCD1602資料 *呼叫:Read_Busy(); *輸入:dat:需要寫入的資料 =================================================*/ void LCD1602_Write_Dat(uchar dat) { Read_Busy(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_EN = 1; LCD1602_EN = 0; } /*================================================= *函式名稱:LCD1602_Dis_OneChar *函式功能:在指定位置顯示一個字元 *呼叫:LCD1602_Write_Cmd(); LCD1602_Write_Dat(); *輸入:x:要顯示的橫座標取值0-40,y:要顯示的行座標取值0-1(0為第一行,1為第二行) dat:需要顯示的資料以ASCLL形式顯示 =================================================*/ void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat) { if(y) x |= 0x40; x |= 0x80; LCD1602_Write_Cmd(x); LCD1602_Write_Dat(dat); } /*================================================= *函式名稱:LCD1602_Dis_Str *函式功能:在指定位置顯示字串 *呼叫:LCD1602_Write_Cmd(); LCD1602_Write_Dat(); *輸入:x:要顯示的橫座標取值0-40,y:要顯示的行座標取值0-1(0為第一行,1為第二行) *str:需要顯示的字串 =================================================*/ void LCD1602_Dis_Str(uchar x, uchar y, uchar *str) { if(y) x |= 0x40; x |= 0x80; LCD1602_Write_Cmd(x); while(*str != '\0') { LCD1602_Write_Dat(*str++); } } /*================================================= *函式名稱:Init_LCD1602 *函式功能:1602初始化 *呼叫: LCD1602_Write_Cmd(); =================================================*/ void Init_LCD1602() { LCD1602_Write_Cmd(0x38); // 設定16*2顯示,5*7點陣,8位資料介面 LCD1602_Write_Cmd(0x0c); //開顯示 LCD1602_Write_Cmd(0x06); //讀寫一位元組後地址指標加1 LCD1602_Write_Cmd(0x01); //清除顯示 } void main() { uchar TestStr[] = {"Welcome!"}; DU = 0; WE = 0;//關閉數碼管顯示 Init_LCD1602();//1602初始化 LCD1602_Dis_Str(0, 0, &TestStr[0]); //顯示字串 LCD1602_Dis_OneChar(10, 1, 0xff); //顯示一個黑方格 while(1); }