历史上的今天
今天是:2024年12月24日(星期二)
2021年12月24日 | 51单片机系列——学习LCD1602液晶显示-8总线-显示一串字符
2021-12-24 来源:eefocus
今天重温一下LCD1602液晶显示的内容,做了个8总线方式显示一串字符“ First Try ”的实验

仿真图如下:
代码如下:
LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include //重定义关键字 #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif /********************************** PIN口定义 **********************************/ #define Lcd1602DataPin 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 Lcd1602Init(); #endif LCD1602.c #include "lcd1602.h" /******************************************************************************* * 函 数 名 : Lcd1602_Delay1ms * 函数功能 : 延时函数 * 输 入 : c * 输 出 : 无 *******************************************************************************/ void Lcd1602_Delay1ms(uint c){//延时函数 uchar a,b; for (; c>0; c--){ for (b=199;b>0;b--){ for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能 : 向LCD写入一个字节的命令 * 输 入 : com * 输 出 : 无 *******************************************************************************/ void LcdWriteCom(uchar com) //写入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; /*选择发送命令*/ LCD1602_RW = 0; //选择写入 Lcd1602DataPin = com; //放入命令 Lcd1602_Delay1ms(1); //等待数据稳定 LCD1602_E = 1; //根据写数据时序图,拉高写入时序(数据) Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; //再拉低数据写完了,释放 } /******************************************************************************* * 函 数 名 : LcdWriteData * 函数功能 : 向LCD写入一个字节的数据 * 输 入 : dat * 输 出 : 无 *******************************************************************************/ void LcdWriteData(uchar dat) //写入数据 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; /*选择输入数据*/ LCD1602_RW = 0; //选择写入 Lcd1602DataPin = dat; //写入数据 Lcd1602_Delay1ms(1); LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } /******************************************************************************* * 函 数 名 : Lcd1602Init() * 函数功能 : 初始化LCD屏 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Lcd1602Init() //LCD初始化子程序 { LcdWriteCom(0x38); //开显示,设置为8总线,2行显示,5*7点阵,这是“功能设定指令” LcdWriteCom(0x0c); //开显示不显示光标,“显示开关控制指令” LcdWriteCom(0x06); //写一个指针加1,“进入模式设置指令” LcdWriteCom(0x01); //清屏,“清屏指令” LcdWriteCom(0x80); //设置数据指针起点,第一个字符是在0x00,位置,但写入的数据地址格式必须是0x**+0x80,因此在这提前加地址加一个0x80;这里不写也行但必须在main函数中调用前将数据要写入的地址+0x80 } main.c #include #include"lcd1602.h" #define uint unsigned int #define uchar unsigned char uchar DisplayData[]=" First Try "; //定义要显示的字符串,空格也算一个字符 void main(void){ uchar i; Lcd1602Init(); //调用LCD1602的初始化函数,初始化函数中用到了写命令函数的调用 for(i=0;i<11;i++){ //循环调用LCD1602写数据函数,分别写入字符 LcdWriteData(DisplayData[i]); } while(1); //死循环在这儿,这样数据就能一直静态显示:因为数据输入LCD1602后会一直存放在DDRAM中,直至改变 } 实验结果: 总结使用LCD1602的方法: 1、先进行LCD1602的初始化,即初始化函数Lcd1602Init(); 需要初始化的内容有 (1): (2): (3): (4): 初始化时必须对这些进行设定,通过自己编写的写命令函数将这些功能命令字节写入LCD1602中 在我们的程序中我们还将光标的位置进行了设置,也就是数据在哪个点阵开始显示的。当然了你可以不在初始化中写确定显示地址命令,在mian.c文件中显示之前确定显示地址即可。 (5):确定显示地址命令: 2、初始化完后,就可以通过自己写的写数据函数,向LCD的DDRAM写入要显示的字符了。 问题: 1、都是写入数据,都是写入一个字节,为啥要整一个写命令函数“”和“写数据函数”呢? 答:原因就在于写命令和写数据时对LCD1602_RS引脚的高低电平要求不一样。 写命令:LCD1602_RS=0; 写数据:LCD1602_RS=1; 因此要分开写两个函数实现功能。 2、确定显示的地址,为什么在地址+0x80 答:上图(5)写入显示地址命令的固定格式:0x80+显示地址 3、写时序: 4、怎么单独显示一个字符 uchar dat=1; dat=dat+0x30; LcdWriteData(dat);//这样就可以了,ASCII码的形式 5、怎么在第二行显示 //实现在第二行显示: LcdWriteCom(0x40+0x80); //通过写命令函数,先重新确认光标的位置 for(i=0;i<11;i++){ //再循环调用LCD1602写数据函数,分别写入字符 LcdWriteData(DisplayData[i]); } 5、LCD1602的RAM地址映射 结束语:静心的去学习,才能有收获,哪有什么一蹴而就的成功。 







史海拾趣
|
UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传送器,工作于数据链路层,包含了RS-232、RS-422、RS-485串口通信。它具有传输线少、成本低和可靠性高等优点。广泛应用于通信领域、医疗及消费电子领域、汽车电子领域和工业及数 ...… 查看全部问答> |
|
我的硬件是PXA270 通过16位数据总线连接到64MBYTE的FLASH P33,地址总线是26位 p33是由两块32M的flash组成的,在程序中不能同时访问上下两块FLASH的地址 而是需要有一个地址总线,即最高位的A25作为内部片选,选择当前访问的是BOTTOM 还是top flas ...… 查看全部问答> |
|
wince 5.0和6.0下短信截获用什么方法好。 我使用的5.0和6.0的机器上没有cemapi.dll,所以使用cemapi的方法不行,mapirule也是基于cemapi的,也不能用。ril需要ril.dll占用空间太大。 还有什么好的方法可以截获短信,在网上看到有一种钩子函数的方 ...… 查看全部问答> |
|
自己想刷块板,但技术没那么强,上来问个问题,因为44B0X接口到最后不够用,分配成问题,所以问一下,怎么合理的资源分配,谢谢的 问题如下: LCD的24针口利用了GPC8(DISP_ON),GPC9(EL_ON),GPE3,GPE4,GPE6,GPE7。 剩下没用的接口为:GPA ...… 查看全部问答> |
|
pxa270 ce5.0电源管理源码谁有,能给一份来参考下吗? 目前我正在做pxa270平台,windows ce5.0系统,现在就只是简单的休眠啊,挂起啊之类的,有谁实现稍微复杂点的功能啊,如系统空闲的情况下降低CPU的频率,电压等。有的吗?100分送上… 查看全部问答> |
|
在公司用嵌入式系统开发产品,开发组里有印度工程师,在一次闲聊时听到这么一个说法:中国工程师硬件开发比较厉害,印度工程师软件开发比较厉害。不过的确注意到公司软件开发部门印度人比较多。除了语言上的原因外还有别的原因吗?--- (一个月的贴 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 分享一下,你不一样的想法~ [ 本帖最后由 levelgod 于 2011-8-31 13:03 编辑 ] … 查看全部问答> |




