找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3211|回復: 0
打印 上一主題 下一主題
收起左側

LCD1602在51單片機中的初級顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:202738 發(fā)表于 2017-5-20 00:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#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); //判斷狀態(tài)字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課件下中文使用說明基本操作時序章節(jié)
        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); //讀寫一字節(jié)后地址指針加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); //(1,10)后顯示一個黑方格
        while(1);
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表