同样我们创建好“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); }
再次提醒要添加进工程文件,不添加的话编译不会报错,但是下载进去无法执行相应的代码,也就不能正常显示内容。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程