同样我们创建好“lcd.c”和“lcd.h”,然后添加进工程文件中。“lcd.c”的代码集合了所有宋老师为我们写好的各种常用函数。

1.lcd.c的代码

#include <reg52.h>
#include <lcd.h>

/* 等待液晶准备好 */
void LcdWaitReady()
{
    unsigned char sta;
  
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
          LCD1602_E = 1;
          sta = LCD1602_DB;//读取状态字
          LCD1602_E = 0;
    } while (sta & 0x80);  //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}

/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}

/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}

/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
    
    if (y == 0)              //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;     //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;     //第二行字符地址从0x40起始
    LcdWriteCmd(addr | 0x80);//设置RAM地址
}

/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y);     //设置起始地址
    while (*str != '\0')    //连续写入字符串数据,直到检测到结束符
    {
        LcdWriteDat(*str++);//先取str指向的数据,然后str自加1
    }
}

/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针,len-需显示的字符长度 */
void LcdShowStr_len(unsigned char x, unsigned char y, unsigned char *str, unsigned char len)
{
    LcdSetCursor(x, y);     //设置起始地址
    while (len--)           //连续写入len个字符数据
    {
        LcdWriteDat(*str++);//先取str指向的数据,然后str自加1
    }
}

/* 区域清除,清除从(x,y)坐标起始的len个字符位 */
void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len)
{
    LcdSetCursor(x, y);   //设置起始地址
    while (len--)         //连续写入空格
    {
        LcdWriteDat(' ');
    }
}

/* 整屏清除 */
void LcdFullClear()
{
    LcdWriteCmd(0x01);
}    

/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口
    LcdWriteCmd(0x0C);  //显示器开,光标关闭
    LcdWriteCmd(0x06);  //文字不动,地址自动+1
    LcdWriteCmd(0x01);  //清屏
}


2.lcd.h的代码

#ifndef __LCD_H__
#define __LCD_H__
 
#define LCD1602_DB  P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E  = P1^5;
void LcdWaitReady();//等待液晶准备好
void LcdWriteCmd(unsigned char cmd);//向LCD1602液晶写入一字节命令,cmd-待写入命令值
void LcdWriteDat(unsigned char dat);//向LCD1602液晶写入一字节数据,dat-待写入数据值
void LcdSetCursor(unsigned char x, unsigned char y);//设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);//在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针
void LcdShowStr_len(unsigned char x, unsigned char y, unsigned char *str, unsigned char len);//在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针,len-需显示的字符长度
void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len);//区域清除,清除从(x,y)坐标起始的len个字符位
void LcdFullClear();//整屏清除
void InitLcd1602(); //初始化1602液晶
 
#endif


3.main.c的代码

#include <reg52.h> 
#include <function.h>//详见第六章第8讲
#include <lcd.h>

void main()
{  
    unsigned char str[] = "Kingst Studio";
  
    InitLcd1602();//初始化液晶屏
    LcdShowStr(2, 0, str);//在第一行第3格开始显示数组里的字符串
    LcdShowStr(0, 1, "Welcome to KST51");//在第二行第1格显示"Welcome to KST51"这段字符串
    while (1);
}

再次提醒要添加进工程文件,不添加的话编译不会报错,但是下载进去无法执行相应的代码,也就不能正常显示内容。

液晶屏4

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)