一、LCD1602简介
- 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母,数字,符号的点阵型液晶模块,他是由若干个5X7或5X10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间由一个点距的间隔,每行之间也有一间隔,起到了字符间距和行距的作用,因此它不能很好的显示图片。
- LCD1602不能显示汉字
- 显示汉字用LCD12864或TFT
二、程序设计
2.1、LCD1602头文件
#ifndef _LCD_H
#define _LCD_H
#include <reg52.h>
/*当使用的是4位数据传输的时候定义
使用八位数据传输的时候取消
*/
// #define LCD1602_4PINS
// 定义关键词
#ifndef uchar
#define uchar unsigned char // 字符
#endif
#ifndef uint
#define uint unsigned int // 整型
#endif
// PIN空定义
#define LCD1602_DATAPINS P0
sbit LCD1602_E = P2^7;
sbit LCD1602_RW= P2^5;
sbit LCD1602_RS= P2^6;
// 51单片机12MHZ时钟下的延时函数
void Lcd1602_Delay1ms(uint c); //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat) ;
/*LCD1602初始化子程序*/
void LcdInit();
#endif
2.2、Lcd.c
#include "Lcd.h" // 导入头文件
// 延时函数 该函数是在12MHZ晶振下,12分频单片机的延时
// uint c 初始化c int类型默认为0
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
// 向LCD1602中写入一个字节命令
#ifndef LCD1602_4PINS // 当没有定义LCD1602——4PINS这个命令时
void LcdWriteCom(uchar com)
{
LCD1602_E = 0; // 使能信号 0 开启 1 关闭
LCD1602_RS = 0; // 选择发送命令 数据/命令选择端(H/L) 1/0
LCD1602_RW = 0; // 选择写入 0 写入 1 读出
LCD1602_DATAPINS = com; // 放入命令
Lcd1602_Delay1ms(1); // 等待数据稳定
LCD1602_E = 1; // 写入时序
Lcd1602_Delay1ms(5); // 保持时间 延迟
LCD1602_E =0;
}
#else
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E =0; // 使能清零
LCD1602_RS = 0; //选择写入命令 数据/命令选择端(H/L) 1/0
LCD1602_RW=0; //选择写入 读/写选择端(H\L) 1/0
LCD1602_DATAPINS = com; // 由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1); // 延时函数
LCD1602_E=1; // 写入时序 使能选择
Lcd1602_Delay1ms(5);
LCD1602_E =0;
LCD1502_DATAPINS = com<< 4;// 发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif // 结束
// 向LCD写入一个数据
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据 数据/命令选择端(H/L) 1/0
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
// 初始化LCD屏
#ifndef LCD1602_4PINS
void LcdInit() //初始化LCD子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x28); //在四位线下的初始化
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
#endif
2.3、main.c
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 Disp[]=" Pechin Science ";
// u8 Disp[] = "Hello World";
void main(void)
{
u8 i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
while(1);
}