/*
*******************************************************************************
* 文件名:Lcd1602.c
* 描 述:1602字符液晶驱动模块
*******************************************************************************
*/
#include <reg52.h>
#include "stdint.h"
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
/* 等待液晶准备好 */
void lcd1602WaitReady() {
uint8_t state;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
state = LCD1602_DB; //读取状态字
LCD1602_E = 0;
} while (state & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void lcd1602WriteCmd(uint8_t cmd) {
lcd1602WaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void lcd1602WriteDat(uint8_t dat) {
lcd1602WaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void lcd1602SetCursor(uint8_t x, uint8_t y) {
uint8_t addr;
if (y == 0) //由输入的屏幕坐标计算显示RAM的地址
addr = x; //第一行字符地址从0x00起始
else
addr = 0x40 + x; //第二行字符地址从0x40起始
lcd1602WriteCmd(addr | 0x80); //设置RAM地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void lcd1602ShowStr(uint8_t x, uint8_t y, uint8_t * str) {
lcd1602SetCursor(x, y); //设置起始地址
//连续写入字符串数据,直到检测到结束符
while (*str != '\0') {
lcd1602WriteDat(*str++);
}
}
/* 初始化1602液晶 */
void initLcd1602() {
lcd1602WriteCmd(0x38); //16*2显示,5*7点阵,8位数据接口
lcd1602WriteCmd(0x0C); //显示器开,光标关闭
lcd1602WriteCmd(0x06); //文字不动,地址自动+1
lcd1602WriteCmd(0x01); //清屏
}
lcd1602.c
最新推荐文章于 2024-06-22 09:48:15 发布