Proteus-51单片机使用lcd1602屏幕显示信息

51单片机介绍

51单片机,也被称为MCS-51,是由英特尔公司在1980年推出的一种经典的8位微控制器架构。它采用Harvard架构,拥有独立的程序存储器和数据存储器空间。51单片机具有简单易用、稳定可靠和成本低廉等优点,广泛应用于工业控制、家电、汽车电子等领域。

基本结构

51单片机由多个功能模块组成,包括中央处理单元(CPU)、存储器(程序存储器和数据存储器)、输入/输出端口(I/O)、定时器/计数器、串行通信接口和中断系统等。

主要特点

  • 8位架构:51单片机的CPU是8位的,一次可以处理8位数据。

  • 丰富的指令集:拥有丰富的指令集,能够完成各种复杂的操作。

  • 灵活的I/O端口:通常有4个8位I/O端口,可用于输入或输出数据。

  • 多种中断源:支持多种中断源,包括外部中断、定时器中断和串行通信中断。

  • 低功耗设计:具有低功耗模式,适用于电池供电的应用。

常见型号

  • AT89C51:8051内核,4KB ROM,128B RAM,4个I/O端口,2个定时器/计数器,1个串行接口,低成本,适用于简单应用。

  • AT89S52:8051内核,8KB ROM,256B RAM,4个I/O端口,3个定时器/计数器,1个串行接口,增强型,适用于复杂应用。

  • STC89C52:8051内核,8KB ROM,256B RAM,4个I/O端口,3个定时器/计数器,1个串行接口,高速运行,适用于高速应用。

应用领域

51单片机由于其稳定性和成本低廉,在许多领域得到了广泛应用,包括工业控制、家电控制、汽车电子、消费电子、医疗设备等。

优势与劣势

51单片机简单易用、成本低廉、稳定可靠,且有丰富的开发资源和技术支持。但它的计算能力和存储容量有限,功耗相对较高,开发环境相对简单,不适合高性能应用。

lcd1602屏幕介绍

LCD1602是一种广泛使用的字符型液晶显示模块,能够同时显示16×2即32个字符。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,具有体积小、功耗低、显示内容丰富等特点,广泛应用于嵌入式系统和电子项目中。

### 工作原理
LCD1602的显示原理是利用液晶的物理特性,通过电压对其显示区域进行控制。每个字符由5×8或5×7的点阵组成,通过控制每个点的亮暗来显示字符。它的内部控制器通常是HD44780芯片,该芯片负责接收来自外部的指令和数据,并根据这些指令和数据控制液晶层的显示。

### 特点
- **显示容量**:16×2个字符,即两行,每行16个字符。
- **工作电压**:通常为4.5V至5V,模块最佳工作电压为5V。
- **功耗**:LCD1602具有低功耗的特点,适合电池供电的设备。
- **引脚数量**:16脚,包括8位数据总线(D0-D7)和三个控制端口(RS、R/W、EN)。
- **显示字符类型**:可以显示标准的ASCII字符集,包括字母、数字、标点符号等。
- **自定义字符**:支持自定义字符的生成,通过编写字模数据到字符生成RAM(CGRAM)中。

### 应用领域
LCD1602广泛应用于消费电子、仪器仪表、智能家居和工业控制等领域,如电子时钟、温度计、计数器等需要显示文本信息的设备。

LCD1602.h实现

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
//清屏函数
void LCD_Clear();
/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
/**
  * @brief  在LCD1602指定位置开始显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~65535
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

LCD1602.c实现

#include 

//引脚配置:
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
#define LCD_DataPort P0

//函数定义:
/**
  * @brief  LCD1602延时函数,12MHz调用可延时1ms
  * @param  无
  * @retval 无
  */
void LCD_Delay()
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}

/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//光标复位,清屏
}

//清屏函数
void LCD_Clear()
{

	LCD_WriteCommand(0x01);//光标复位,清屏
}


/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}

/**
  * @brief  返回值=X的Y次方
  */
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}

 main函数代码

#include 
#include "lcd1602.h"
void main()
{
	LCD_Init();//初始化
	//显示字符串
	LCD_ShowString(1,1,"MCU-Hello!!");
	LCD_ShowString(2,1,"12345678910ABCDE");
	while(1)
	{
	
	}
}

 proteus8.17 绘制仿真电路图

Proteus-51单片机使用lcd1602屏幕显示信息_第1张图片

仿真效果 

你可能感兴趣的:(Proteus,51单片机,proteus,51单片机,嵌入式硬件)