⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.c

📁 51实战工程级源码
💻 C
字号:
/*
*************************************************************************************************************
*                                                Kingst-51
*                                        Development board samples
*
*                                 (c) Copyright 2009-2012, Kingst Studio
*                                           All Rights Reserved
*
*                                          http://www.kingst.org
* 文件名:Lcd1602.c
* 描  述:1602液晶驱动文件
* 版本号:1.0.0
*************************************************************************************************************
*/

#define _LCD_1602_C
#include "config.h"
#include "Lcd1602.h"


/*
********************************************************************************
* ----------------------- Local defines  ---------------------------------------
********************************************************************************
*/
#define  BusDelay()    _nop_()



/*
********************************************************************************
* ----------------------- Local variables  -------------------------------------
********************************************************************************
*/
static uint8 tempDBUS;
static bit tempADDR0;
static bit tempADDR1;
static bit tempENLED;
static bit tempEA;


/*
***************************************************************************************************
* ---------------------------------- Source codes  ------------------------------------------------
***************************************************************************************************
*/
/*
* 函数名:LcdAccessStart
* 描  述:LCD访问启动函数,暂存需使用资源的当前状态
*/
static void LcdAccessStart(void)
{
    tempEA = EA;
    EA = 0;
    tempDBUS = DBUS;
    tempADDR0 = ADDR0;
    tempADDR1 = ADDR1;
    tempENLED = ENLED;
    ENLED = 1;
}
/*
* 函数名:LcdAccessStop
* 描  述:LCD访问结束函数,回复所使用的资源状态
*/
static void LcdAccessStop(void)
{
    DBUS = tempDBUS;
    ADDR0 = tempADDR0;
    ADDR1 = tempADDR1;
    ENLED = tempENLED;
    EA = tempEA;
}

/*
* 函数名:Lcd1602WaitReady
* 描  述:检测并等待1602液晶空闲
*/
static void Lcd1602WaitReady(void)
{
    uint8 sta;
    
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        BusDelay();
        sta = LCD1602_DB;
        LCD1602_E = 0;
    } while ((sta&0x80) != 0); //BUSY标志位为bit7
}
/*
* 函数名:Lcd1602WriteCmd
* 描  述:1602液晶命令写入函数
* 输  入:cmd - 待写入命令
* 输  出:无
*/
static void Lcd1602WriteCmd(uint8 cmd)
{
    LcdAccessStart();
    Lcd1602WaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_E  = 1;
    LCD1602_DB = cmd;
    BusDelay();
    LCD1602_E  = 0;
    LcdAccessStop();
}
/*
* 函数名:Lcd1602WriteDat
* 描  述:1602液晶数据写入函数
* 输  入:dat - 待写入数据
* 输  出:无
*/
static void Lcd1602WriteDat(uint8 dat)
{
    LcdAccessStart();
    Lcd1602WaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_E  = 1;
    LCD1602_DB = dat;
    BusDelay();
    LCD1602_E  = 0;
    LcdAccessStop();
}

/*
* 函数名:Lcd1602ShowStr
* 描  述:在1602液晶上显示字符串
* 输  入:str - 待显示字符串指针
*         x - 屏幕显示横坐标
*         y - 屏幕显示纵坐标
* 输  出:无
* 备  注:输入的字符串必须符合C语言规范,即以'\0'-NULL为结束标识符;
*/
void Lcd1602ShowStr(const uint8 *str, uint8 x, uint8 y)
{
    uint8 addr;
    
    /* 由输入的显示坐标计算显示RAM的地址 */
    if (y == 0) {
        addr = 0x80;
    }
    else {
        addr = 0xC0;
    }
    addr |= x;
    
    /* 由起始显示RAM地址连续写入字符串 */
    Lcd1602WriteCmd(addr);
    while (*str != '\0') {
        Lcd1602WriteDat(*str);
        str++;
    }
}
void Lcd1602Clear(uint8 x, uint8 y, uint8 len)
{
    uint8 addr;
    
    /* 由输入的显示坐标计算显示RAM的地址 */
    if (y == 0) {
        addr = 0x80;
    }
    else {
        addr = 0xC0;
    }
    addr |= x;
    
    /* 由起始显示RAM地址连续写入空格 */
    Lcd1602WriteCmd(addr);
    while (len > 0) {
        Lcd1602WriteDat(' ');
        len--;
    }
}

/*
* 函数名:Lcd1602Init
* 描  述:1602液晶初始化函数
*/
void Lcd1602Init(void)
{
	Lcd1602WriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口
	Lcd1602WriteCmd(0x0C);  //显示器开、光标开、光标允许闪烁
	Lcd1602WriteCmd(0x06);  //文字不动,光标自动右移
	Lcd1602WriteCmd(0x01);  //清屏
    
    Lcd1602ShowStr("* Hello World! *", 0, 0);
    Lcd1602ShowStr("key 0x-- pressed", 0, 1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -