STC51控制LCD1602字符屏显示字符数据

举报
DS小龙哥 发表于 2024/07/22 11:10:12 2024/07/22
【摘要】 本项目的开发背景主要源于现代电子设备和系统中对于用户界面的直观性和易用性的不断追求。在许多嵌入式系统、微控制器应用以及小型电子设备中,LCD(Liquid Crystal Display)屏幕被广泛应用以显示必要的信息和交互指令。特别是LCD1602字符屏,以其16个字符宽度和2行显示的特性,成为了一种经济、高效的显示解决方案。

一、前言

1.1 功能介绍

本项目的开发背景主要源于现代电子设备和系统中对于用户界面的直观性和易用性的不断追求。在许多嵌入式系统、微控制器应用以及小型电子设备中,LCD(Liquid Crystal Display)屏幕被广泛应用以显示必要的信息和交互指令。特别是LCD1602字符屏,以其16个字符宽度和2行显示的特性,成为了一种经济、高效的显示解决方案。

STC90C51作为一款经典的8位微控制器,以其高性能、低功耗和丰富的I/O端口资源,在嵌入式系统设计中占据了重要地位。然而,仅仅依靠微控制器本身并不能直接与用户进行交互,因此,结合LCD1602字符屏进行信息显示成为了提升系统交互性的关键。

通过STC90C51微控制器控制LCD1602字符屏,可以实现在嵌入式系统中对用户显示必要的系统状态、错误信息、提示指令等功能,从而提升用户体验和系统交互性。同时,这一项目的开发也有助于提升开发人员对微控制器和LCD屏幕控制技术的理解和掌握,为后续的复杂系统设计和开发打下坚实的基础。

image-20240612131134904

image-20240612131147613

image-20240612131204433

image-20240612131220236

1.2 LCD1602介绍

1602字符屏,也称为LCD1602液晶显示屏,是一种基于液晶显示技术的模块化显示设备。它以其16列、每列可显示2行字符的显示区域,成为了一种广泛应用的显示解决方案。该屏幕采用字符型液晶显示技术,其显示内容包括数字、字母、符号等,通常由一个显示屏、一个控制器芯片和一组电路板组成。

LCD1602字符屏的主要特点包括:

  1. 显示能力:LCD1602字符屏可以同时显示两行文字,每行最多可显示16个字符,每个字符由5x8像素的点阵构成。这种点阵结构允许显示清晰、锐利的字符。
  2. 低功耗:LCD1602字符屏采用液晶显示技术,具有较低的功耗,适合长时间运行和嵌入式系统应用。
  3. 易于控制:LCD1602字符屏通常使用HD44780控制芯片,该芯片提供了一套简单易用的指令集,用于控制LCD的显示内容、光标位置等。这使得开发人员可以通过微控制器等设备轻松控制LCD1602字符屏的显示。
  4. 背光显示:LCD1602字符屏通常配有背光功能,可以在暗环境中提供良好的可视性。背光可通过外部电路控制,从而实现显示器的亮度调节或开关功能。

LCD1602字符屏还具有高可靠性、体积小、重量轻等特点,使其在各种电子设备中得到广泛应用,如电子秤、计时器、温度计、计数器等。通过向LCD1602字符屏发送指令,可以轻松地设置显示内容、光标位置等,实现与用户的直观交互。

二、代码实现

2.1 main.c

#include <reg51.h>
#include <INTRINS.H>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include "lcd1602.h"
#include <string.h>
code u8 str1[]="ABCDEFGHIJ";  //字符串结尾 '\0'
code u8 str2[]="1234567890";  //字符串结尾 '\0'
int main()
{
    LCD1602_Init();  //1602初始化
	DelayMs(50);
	LCD1602_SetCursorAddr(0x3,0x0);  //设置光标地址
	LCD1602_DisplayData(str1,strlen(str1)); //在1602上显示数据
	LCD1602_SetCursorAddr(0x3,0x1);  //设置光标地址
	LCD1602_DisplayData(str2,strlen(str2)); //在1602上显示数据
    while(1)
    {
       
    }
}

2.2 lcd1602.c

#include "lcd1602.h"
//1602的初始化函数
void LCD1602_Init(void)
{
	LCD1602_WriteCmd(0x38); //设置显示模式
	LCD1602_WriteCmd(0x06); //设置数据指针自增
	LCD1602_WriteCmd(0x0C); //设置光标显示关闭,开启显示
	LCD1602_WriteCmd(0x01); //清屏
}

//1602写数据
void LCD1602_WriteData(unsigned char dat)
{
	lcd_1602_RS=1;//表示写数据
	lcd_1602_R_W=0;//表示写操作
	lcd_1602_data_cmd=dat;//写入的数据
	lcd_1602_E=1;//高脉冲
    DelayMs(5);
	lcd_1602_E=0;
}

//1602写命令
void LCD1602_WriteCmd(unsigned char cmd)
{
    lcd_1602_RS=0;
    lcd_1602_R_W=0;
    lcd_1602_data_cmd=cmd; 
    lcd_1602_E=1;
    DelayMs(5);
    lcd_1602_E=0;
}

/*
设置光标地址
x : 显示的位置
y :显示的行数 0表示1行显示  1表示第2行显示 
*/
void LCD1602_SetCursorAddr(unsigned char x,unsigned char y)
{
	unsigned char addr=0;
	if(y==1) //表示设置在第2行显示
	{
		addr=x+0x40;  //第二行地址
	}
	else
	{
		addr=x+0x00;    //第一行地址
	}
	LCD1602_WriteCmd(0x80|addr); //加上0x80表示设置地址
}

/*
设置显示的数据
*dat :表示要显示的数据
len  :显示数据的长度
*/
void LCD1602_DisplayData(unsigned  char *dat,unsigned char len)
{
	 while(len--)
	 {
		 LCD1602_WriteData(*dat++);
	 }	 
}

2.3 lcd1602.h

#ifndef _LCD1602_H
#define _LCD1602_H
#include <reg51.h>
#include "delay.h"
sbit lcd_1602_RS=P2^6;  //区分命令和数据
sbit lcd_1602_R_W=P2^5; //读写区分
sbit lcd_1602_E=P2^7;   //使能信号
#define lcd_1602_data_cmd P0  //发送接收数据和命令

/*函数API声明*/
void LCD1602_WriteCmd(unsigned char cmd); //写命令
void LCD1602_WriteData(unsigned char dat); //写数据
void LCD1602_DisplayData(unsigned  char *dat,unsigned char len); //显示数据
void LCD1602_Init(void); //初始化
void LCD1602_SetCursorAddr(unsigned char x,unsigned char y); //设置光标地址
#endif
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。