今天造成试了半天,也没有把lcd1602的显示库函数写好,总是报错,心情不太好,于是开车出去去另外的一个家,去收拾房子,上一家租户真的太邋遢了,弄得好乱,收拾了一天,算是把厕所收拾的差不多了,一看时间4点中了,回家,路上就一遍开车一遍想早晨的代码,为什么总是报错!回来后试了没有3遍就跑通了,于是果断记录一下代码?以便我下次直接使用就好了,不用重复造轮子了。这个1602的库函数网上搜索着有,但是没有一个能用的。所以自己写吧!下面把3段代码,3个文件都贴出来!望有缘者引用,如果有什么不对或是可以优化的地方,望不吝赐教!
下面这个是LCD_1602.C的文件源码:
#include"reg51.h"
sbit RS = P3^7; // 此处修改RS端口
sbit RW = P3^6; // 此处修改RW端口
sbit E = P3^5; // 此处修改E端口
#define u8 unsigned char
#define u16 unsigned int
//***************************************************************
// 1602延时函数
//***************************************************************
void delay(u8 t){
u8 i=0, j=0;
for(i=0; i<t; i++){
for(j=0;j<120;j++);
}
}
//***************************************************************
// 1602写数据函数
//***************************************************************
void write_date(u8 date){
RS=1; // 写时序图中的第一行RS为高电平写数据
RW=0; // 写时序图中的第二行RW
E=0; // 写时序图中的第三行E
P2=date; // 看时序图中E为0的时候就把数据放到接口里面了(这里我们定的接口是P2)
delay(5); // 这个延时很重要,没有显示不了
E=1; // 写时序图中的第三行E,写命令时拉高电平。
E=0; // 写时序图中的第三行E,写完命令拉低电平。
}
//***************************************************************
// 1602写命令函数
//***************************************************************
void write_com(u8 com){
RS=0; // 写时序图中的第一行RS为低电平写命令
RW=0; // 写时序图中的第二行RW
E=0; // 写时序图中的第三行E
P2=com; // 看时序图中E为0的时候就把数据放到接口里面了(这里我们定的接口是P2)
delay(5); // 这个延时很重要,没有显示不了
E=1; // 写时序图中的第三行E,写命令时拉高电平。
E=0; // 写时序图中的第三行E,写完命令拉低电平。
}
//***************************************************************
// 1602初始化
//***************************************************************
void init_1602(){
write_com(0x38); // 设置16X2显示,5X7点阵, 8位数据接口
write_com(0x0c); // 设置开显示,不显示光标
write_com(0x06); // 写一个字符后地址指针加1
write_com(0x01); // 显示清0, 数据指针清0.
}
//***************************************************************
// 1602显示函数
//***************************************************************
void display(u8 id, u8 *dat){
u16 i=0;
write_com(id);
delay(5);
while(dat[i] != '\0'){
write_date(dat[i]);
delay(5);
i++;
}
}
下面是LCD1602.H的源文件:
// LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
// 此文件所需头文件
#include <reg52.h>
// 关键字替换
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif
//***************************************************************
// 1602延时函数
//***************************************************************
void delay(u8 t);
//***************************************************************
// 1602写数据函数
//***************************************************************
void write_date(u8 date);
//***************************************************************
// 1602写命令函数
//***************************************************************
void write_com(u8 com);
//***************************************************************
// 1602初始化
//***************************************************************
void init_1602();
//***************************************************************
// 1602显示函数
//***************************************************************
void display(u8 id, u8 *dat);
#endif
下面是main.C的源代码,主要是调用LCD1602.h的库文件使用,方便日后的显示问题,直接导入就能使用。
#include"lcd1602.h"
u8 str[]={"I LOVE YOU!55566"}; //要显示的字符
void main(){
init_1602(); // 初始化1602
while(1){
// 第一行:0x80 第二行:0x80+0x40 第几个开始显示就自己加空格吧
display(0x80, str);
}
}
下面是我的keil截图,说明文件之间的关系