📄 lcd1602.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 + -