前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口与通信-LCD1602显示

接口与通信-LCD1602显示

原创
作者头像
会洗碗的CV工程师
发布2024-02-17 21:26:22
3490
发布2024-02-17 21:26:22
举报
文章被收录于专栏:LongJava学习资料

实验目的与要求

在液晶屏显示文字

二、实验环境

硬件环境:实验盒;软件环境:keil

三、实验原理

在此,我们不需要读出它的数据的状态或者数据本身。所以只需要看两个写时序:

① 当我们要写指令字,设置LCD1602 的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

② 当我们要写入数据字,在1602 上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E 引脚一个高脉冲将数据写入。发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。一下是LCD1602的时序图:

LCD1602 是一种工业字符型液晶显示模块,能够同时显示 16×2 即 32 个字符。它由字符型液晶显示屏(LCD)、控制驱动主电路 HD44780 及其扩展驱动电路 HD44100,以及少量电阻、电容元件和结构件等装配在 PCB 板上而组成。

LCD1602 的显示原理是通过电压对其显示区域进行控制,从而显示出图形或字符。具体来说,LCD1602 内部有一个字符发生存储器,已经存储了 160 个不同的点阵字符图形,包括阿拉伯数字、英文字母的大小写、常用的符号和日文假名等。每一个字符都有一个固定的代码,通过向 LCD1602 发送相应的代码,就可以在 LCD1602 上显示出对应的字符。

LCD1602 的显示容量是 16×2 个字符,也就是说,它可以同时显示两行,每行 16 个字符。显示屏上共有 64×16 个显示单元,与显示 RAM 区的 1024 字节相对应。每一字节的内容与显示屏上相应位置的亮暗对应,通过控制这些字节的内容,就可以实现各种显示效果。

此外,LCD1602 还提供了各种控制命令,如清屏、字符闪烁、光标闪烁、显示移位等。这些命令可以通过向 LCD1602 发送特定的指令来实现。

总的来说,LCD1602 是一种功能强大、使用方便的液晶显示模块,广泛应用于各种袖珍式仪表和低功耗应用系统中。

四、实验内容

实验步骤:先用数据线接上电脑和实验盒子,然后在软件中添加对应的源程序编译后的pro.hex文件,断电添加,然后运行一瞬间打开电源。

接线图:

实验程序:包含三个文件,一个是lch.h,lch.c,main.c

以下是lch.h文件的程序:

代码语言:c
复制
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD1602_4PINS
/**********************************
包含头文件
**********************************/
#include<reg51.h>
//---重定义关键词---//
#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
以下是lch.c
#include"lcd.h"
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
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--);
   }      
 }
}
/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#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_Delay1ms(1);
 LCD1602_DATAPINS = com << 4; //发送低四位
 Lcd1602_Delay1ms(1);
 LCD1602_E = 1;  //写入时序
 Lcd1602_Delay1ms(5);
 LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/   
#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
以下是main.c文件
#include<reg51.h> 
#include"lcd.h"
//--定义全局变量--//
unsigned char PuZh[]=" Pechin Science ";
/*******************************************************************************
* 函 数 名         : main
* 函数功能   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
 unsigned char i;
 LcdInit();
 for(i=0;i<16;i++)
 {
  LcdWriteData(PuZh[i]); 
 }
 while(1)
 {
 }    
}

实验结果:

五、实验分析

通过本次实验学会如何使用1602液晶屏及其代码的使用。

六、思考题

LCD1602流动显示:

接线图如上;

实验程序:lch.c和lch.h文件不用改变,只需要改变main.c文件代码即可,下面给出main.c具体代码

代码语言:c
复制
#include<reg51.h> 
#include"lcd.h"
//--定义全局变量--//
unsigned char PuZh[16] = " Pechin Science ";
unsigned char CnCh[27] = "Welcome to the world of MCU";
//--声明全局变量--//
void Delay10ms(unsigned int c);   //误差 0us
/*******************************************************************************
* 函 数 名         : main
* 函数功能     : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
 unsigned char i;
 LcdInit();
 //--写第一行--//
 for(i=0; i<16; i++)
 {
  LcdWriteData(PuZh[i]); 
 }
 //--写第二行
 LcdWriteCom(0xC0); //设置坐标在第二行
 for(i=0; i<27; i++)
 {
  LcdWriteData(CnCh[i]);
 }
 LcdWriteCom(0x07); //设置每写一次整屏右移
 while(1)
 {   
  LcdWriteCom(0xC0); //设置坐标在第二行
  for(i=0; i<27; i++)
  {
   LcdWriteData(CnCh[i]);
   Delay10ms(50);
  }
 }    
}
/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能     : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;
 //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
 {
  for (b=38;b>0;b--)
  {
   for (a=130;a>0;a--);
  }          
 }       
}

实验结果:

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档