历史上的今天
今天是:2025年10月13日(星期一)
2022年10月13日 | 51单片机基础之LCD1602
2022-10-13 来源:csdn
外观:

原理:
LCD1602是一种工业字符型液晶,能够同时显示16x2即32个字符。 LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
基本接线:
读状态:输入:RS=L,RW=H,E=H
----输出:D0~D7=状态字
写指令:输入:RS=L,RW=L,D0~D7=指令码
----输出:无
读数据:输入:RS=H,RW=H,E=H
----输出:D0~D7=数据
写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲
----输出:无
有开发板的直接接即可,注意不要接反了。
软件设计:
因为LCD代码是比较多的,有自己的LCD库,所以使用起来比较方便,写个.c和.h文件,再直接引用即可,一般不需要自己写,指定LCD函数是什么意思,怎么使用,能达到自己的目的即可,当然也不反对能独立写出代码的,对目标越熟悉,使用起来越高效。
程序:
需要自己创建main.c、lcd.c、lcd.h三个文件才能使用。
main.c
//在main.c里面引用LCD相关函数和数据
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 Disp[]=" LCD1602"; //数组,将显示字符串
void main(void)
{
while(1)
{
u8 i;
LcdInit(); //调用LCD初始化函数
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]); //通过数组显示字符串
}
}
}
lcd.c
//一般.c里面放一些具体函数,main.c调用也是主要调用这个文件里面的函数。
#include "lcd.h"
void Lcd1602_Delay1ms(uint c) //延时函数,延时1ms,带有形参
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
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; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向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; //选择写入数据
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
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化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
对于代码中的:
#ifndef ---------
xxxxxx
xxxxxx
#else
yyyyyy
yyyyyy
#endif
意义:如果没有定义 (---------)的话,就执行xxxxxxx,
如果定义了 (---------)的话,就执行yyyyyyy,
#endif 表示结束。
lcd.h
//一般.h里面放一些位定义,变量常量,和一些函数声名等
#ifndef __LCD_H_
#define __LCD_H_
//#define LCD1602_4PINS
#include //---重定义关键词---// #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 总结: 要让LCD1602显示数字和字符,有很多种方式,我这里只是一种(显示固定字符),当你需要显示多个变量的时候,这个函数就不适合了,必须要有专门显示数字的函数。
上一篇:51单片机基础之OLED
下一篇:51单片机基础之数码管(二)
史海拾趣
|
我们现有关于PADS /Altium Designer 电路设计的图书选题,诚找有写书意向的作者合作。要求作者有一些实战经验和写作资源,有一定的业余时间、能够保证写作进度。有意者请直接发信 联系方式:haohong99@163.com、478057587(QQ)。欢迎有实践开发 ...… 查看全部问答> |
|
我使用tps54550电源芯片产生 3.3V电压。芯片PH端输出的波形正确,可是经过滤波后,输出电压很低只有0.005V。我按照datasheet使用6.8uH和100uF电容做滤波。各位大侠帮帮忙吧...… 查看全部问答> |
|
我今天怎么回复不了我自己的帖子,我的问题解决了本来想说明下情况,是如何解决的,然后结贴,结果我一回复就说我\"回复太快!如果你是恶意刷楼,将会受到严厉惩罚!\"我没有刷楼啊,到了下午再试试还是不行,这个怎么回事,网站有问题了?也不知道我这个 ...… 查看全部问答> |
|
公司提供4.3-10.4寸系列真彩液晶终端,单片机,PLC,ARM串口直接控制,采用M600通用液晶显示驱动。 TFT驱动模组M600,这款模块的优势非常大,驱动模组提供的是RS232串口方式,通过协议来控制屏的显示,内置128M flash ...… 查看全部问答> |
|
Wince启动后,色彩不对,偏色严重。但是在用Windows Media Player播放视频文件的时候,画面清晰的很。不过WMP的界面仍然偏色。请教各位可遇到这种情况,是哪方面原因造成的。… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:32 编辑 同事花了半个月,就做了一款开关电源,还说技术保密。说实话做开关电源有技术难度吗? … 查看全部问答> |
|
最近弄了一个串口通信,使用的是M16单片机,但是死活设置熔断丝,却只能使用M16内部的1M时钟,才能串口通信正常(波特率寄存器设置没错)。设置外部时钟和内部的2M,4M,8M,都不能使串口通信正常,不知道怎么回事。下面是我设置内部8M的熔断丝的图片 ...… 查看全部问答> |




