基於51單片機控制LCD1602液晶屏顯示


LCD1602一共有16個接口,其中RS,RW,EN,D0,D1,D2,D3,D4,D5,D6,D7用於讀寫數據

也就是說是並行通信。

判斷液晶忙:

判斷STA7是否為1,所以將P0口總線的數據和0x80(1000 0000)進行與運算。

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

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

寫字節和寫數據都是按照1602的數據手冊來寫的。

 

 

 

寫LCD1602命令一個字節:

 void Write_Cmd(uchar cmd)
{
    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;
}

由上面的函數,就可以初始化LCD1602。

1602初始化函數:

void Init_LCD1602()
{
    LCD1602_Write_Cmd(0x38);  //設置16*2顯示,5*7點陣,8位數據接口
    LCD1602_Write_Cmd(0x0c);  //開顯示,不顯示光標(0xf開顯示,顯示光標,光標閃爍)
    LCD1602_Write_Cmd(0x01);  //清除顯示

    LCD1602_Write_Cmd(0x06);  //讀寫一字節后地址指針加1

 Write_Cmd(0x80 | 0x00);  //設置顯示地址(顯示在第一行第一個)設置顯示地址以及設置讀寫地址指針方向一定要在清除顯示之后要不然仍會顯示在第一個格



LCD1602RAM

 

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

 顯示字母使用ASCLL碼(例如:顯示H:Write_Dat(0x48);)

 

 

 

 

 

 

 


在指定位置顯示一個字符:
要顯示的橫坐標取值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]); 

 

 

顯示簡單的數字:

#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); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM