本项目的开发背景主要源于现代电子设备和系统中对于用户界面的直观性和易用性的不断追求。在许多嵌入式系统、微控制器应用以及小型电子设备中,LCD(Liquid Crystal Display)屏幕被广泛应用以显示必要的信息和交互指令。特别是LCD1602字符屏,以其16个字符宽度和2行显示的特性,成为了一种经济、高效的显示解决方案。
STC90C51作为一款经典的8位微控制器,以其高性能、低功耗和丰富的I/O端口资源,在嵌入式系统设计中占据了重要地位。然而,仅仅依靠微控制器本身并不能直接与用户进行交互,因此,结合LCD1602字符屏进行信息显示成为了提升系统交互性的关键。
通过STC90C51微控制器控制LCD1602字符屏,可以实现在嵌入式系统中对用户显示必要的系统状态、错误信息、提示指令等功能,从而提升用户体验和系统交互性。同时,这一项目的开发也有助于提升开发人员对微控制器和LCD屏幕控制技术的理解和掌握,为后续的复杂系统设计和开发打下坚实的基础。
1602字符屏,也称为LCD1602液晶显示屏,是一种基于液晶显示技术的模块化显示设备。它以其16列、每列可显示2行字符的显示区域,成为了一种广泛应用的显示解决方案。该屏幕采用字符型液晶显示技术,其显示内容包括数字、字母、符号等,通常由一个显示屏、一个控制器芯片和一组电路板组成。
LCD1602字符屏的主要特点包括:
LCD1602字符屏还具有高可靠性、体积小、重量轻等特点,使其在各种电子设备中得到广泛应用,如电子秤、计时器、温度计、计数器等。通过向LCD1602字符屏发送指令,可以轻松地设置显示内容、光标位置等,实现与用户的直观交互。
#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)
{
}
}
#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++);
}
}
#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