一、前言
1.1 功能介紹
本項目的開發(fā)背景主要源于現(xiàn)代電子設(shè)備和系統(tǒng)中對于用戶界面的直觀性和易用性的不斷追求。在許多嵌入式系統(tǒng)、微控制器應(yīng)用以及小型電子設(shè)備中,LCD(Liquid Crystal Display)屏幕被廣泛應(yīng)用以顯示必要的信息和交互指令。特別是LCD1602字符屏,以其16個字符寬度和2行顯示的特性,成為了一種經(jīng)濟、高效的顯示解決方案。
STC90C51作為一款經(jīng)典的8位微控制器,以其高性能、低功耗和豐富的I/O端口資源,在嵌入式系統(tǒng)設(shè)計中占據(jù)了重要地位。然而,僅僅依靠微控制器本身并不能直接與用戶進行交互,因此,結(jié)合LCD1602字符屏進行信息顯示成為了提升系統(tǒng)交互性的關(guān)鍵。
通過STC90C51微控制器控制LCD1602字符屏,可以實現(xiàn)在嵌入式系統(tǒng)中對用戶顯示必要的系統(tǒng)狀態(tài)、錯誤信息、提示指令等功能,從而提升用戶體驗和系統(tǒng)交互性。同時,這一項目的開發(fā)也有助于提升開發(fā)人員對微控制器和LCD屏幕控制技術(shù)的理解和掌握,為后續(xù)的復(fù)雜系統(tǒng)設(shè)計和開發(fā)打下堅實的基礎(chǔ)。
1.2 LCD1602介紹
1602字符屏,也稱為LCD1602液晶顯示屏,是一種基于液晶顯示技術(shù)的模塊化顯示設(shè)備。它以其16列、每列可顯示2行字符的顯示區(qū)域,成為了一種廣泛應(yīng)用的顯示解決方案。該屏幕采用字符型液晶顯示技術(shù),其顯示內(nèi)容包括數(shù)字、字母、符號等,通常由一個顯示屏、一個控制器芯片和一組電路板組成。
LCD1602字符屏的主要特點包括:
- 顯示能力:LCD1602字符屏可以同時顯示兩行文字,每行最多可顯示16個字符,每個字符由5x8像素的點陣構(gòu)成。這種點陣結(jié)構(gòu)允許顯示清晰、銳利的字符。
- 低功耗:LCD1602字符屏采用液晶顯示技術(shù),具有較低的功耗,適合長時間運行和嵌入式系統(tǒng)應(yīng)用。
- 易于控制:LCD1602字符屏通常使用HD44780控制芯片,該芯片提供了一套簡單易用的指令集,用于控制LCD的顯示內(nèi)容、光標位置等。這使得開發(fā)人員可以通過微控制器等設(shè)備輕松控制LCD1602字符屏的顯示。
- 背光顯示:LCD1602字符屏通常配有背光功能,可以在暗環(huán)境中提供良好的可視性。背光可通過外部電路控制,從而實現(xiàn)顯示器的亮度調(diào)節(jié)或開關(guān)功能。
LCD1602字符屏還具有高可靠性、體積小、重量輕等特點,使其在各種電子設(shè)備中得到廣泛應(yīng)用,如電子秤、計時器、溫度計、計數(shù)器等。通過向LCD1602字符屏發(fā)送指令,可以輕松地設(shè)置顯示內(nèi)容、光標位置等,實現(xiàn)與用戶的直觀交互。
二、代碼實現(xiàn)
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"; //字符串結(jié)尾 '?'
code u8 str2[]="1234567890"; //字符串結(jié)尾 '?'
int main()
{
LCD1602_Init(); //1602初始化
DelayMs(50);
LCD1602_SetCursorAddr(0x3,0x0); //設(shè)置光標地址
LCD1602_DisplayData(str1,strlen(str1)); //在1602上顯示數(shù)據(jù)
LCD1602_SetCursorAddr(0x3,0x1); //設(shè)置光標地址
LCD1602_DisplayData(str2,strlen(str2)); //在1602上顯示數(shù)據(jù)
while(1)
{
}
}
2.2 lcd1602.c
#include "lcd1602.h"
//1602的初始化函數(shù)
void LCD1602_Init(void)
{
LCD1602_WriteCmd(0x38); //設(shè)置顯示模式
LCD1602_WriteCmd(0x06); //設(shè)置數(shù)據(jù)指針自增
LCD1602_WriteCmd(0x0C); //設(shè)置光標顯示關(guān)閉,開啟顯示
LCD1602_WriteCmd(0x01); //清屏
}
//1602寫數(shù)據(jù)
void LCD1602_WriteData(unsigned char dat)
{
lcd_1602_RS=1;//表示寫數(shù)據(jù)
lcd_1602_R_W=0;//表示寫操作
lcd_1602_data_cmd=dat;//寫入的數(shù)據(jù)
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;
}
/*
設(shè)置光標地址
x : 顯示的位置
y :顯示的行數(shù) 0表示1行顯示 1表示第2行顯示
*/
void LCD1602_SetCursorAddr(unsigned char x,unsigned char y)
{
unsigned char addr=0;
if(y==1) //表示設(shè)置在第2行顯示
{
addr=x+0x40; //第二行地址
}
else
{
addr=x+0x00; //第一行地址
}
LCD1602_WriteCmd(0x80|addr); //加上0x80表示設(shè)置地址
}
/*
設(shè)置顯示的數(shù)據(jù)
*dat :表示要顯示的數(shù)據(jù)
len :顯示數(shù)據(jù)的長度
*/
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; //區(qū)分命令和數(shù)據(jù)
sbit lcd_1602_R_W=P2^5; //讀寫區(qū)分
sbit lcd_1602_E=P2^7; //使能信號
#define lcd_1602_data_cmd P0 //發(fā)送接收數(shù)據(jù)和命令
/*函數(shù)API聲明*/
void LCD1602_WriteCmd(unsigned char cmd); //寫命令
void LCD1602_WriteData(unsigned char dat); //寫數(shù)據(jù)
void LCD1602_DisplayData(unsigned char *dat,unsigned char len); //顯示數(shù)據(jù)
void LCD1602_Init(void); //初始化
void LCD1602_SetCursorAddr(unsigned char x,unsigned char y); //設(shè)置光標地址
#endif