实验目的与要求
在液晶屏显示文字
二、实验环境
硬件环境:实验盒;软件环境: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文件的程序:
#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具体代码
#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--);
}
}
}
实验结果:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。