51单片机LCD1602液晶屏显示字符,字符串,(有)无符号整数,十六进制数,二进制数等

1.前言

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602 液晶显示模块(其内部控制器为HD44780 芯片),它可以显示两行,每行16 个字符,因此可相当于32 个LED 数码管,而且比数码管显示的信息还多。

1.1实验现象

当然大家也可以根据自己的需求编写自己需要的内容;


 

2. LCD1602相关介绍

LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符
显示容量:16×2个字符,每个字符为5*7点阵(其实时5*8的字符占了5*7)

2.1 LCD1602 引脚及应用电路

2.2 LCD1602 内部结构框图

每个小方块都是一个点阵;

CGRAM与CGROM这两个存储区域,相当于数码管的断码表一样;其中CGRAM是可写的,可以自己定义字符的数据存储区;CGROM是不可写的,内部固定的字模区,出厂已经设定好了;

DDRAM:我们想要显示的数据实际上时写在DDRAM这个储存单元中的,通过DDRAM的数据来向字模库中找到相应字符的一个显示点阵的字模,然后再在对应位置显示我们想要显示的数据。

DDRAM(数据显示区)

 

2.4 LCD1602指令集

2.4 LCD1602操作流程

初始化:
    发送指令0x38    //八位数据接口,两行显示,5*7点阵
    发送指令0x0C    //显示开,光标关,闪烁关
    发送指令0x06    //数据读写操作后,光标自动加一,画面不动
    发送指令0x01    //清屏

显示字符:
    发送指令0x80|AC    //设置光标位置
    发送数据        //发送要显示的字符数据
    发送数据        //发送要显示的字符数据
    ……

3.源码

3.1 main.c

#include <REGX52.H>
#include "LCD1602.h"

void main()
{
	LCD_Init();						//LCD初始化
	LCD_ShowChar(1,1,'x');			//在1行1列显示字符x
	LCD_ShowString(1,3,"Hello");	//在1行3列显示字符串Hello
	LCD_ShowNum(1,9,33,2);			//在1行9列显示数字33,长度为2
	LCD_ShowSignedNum(1,12,-20,2);	//在1行12列显示有符号数字-20,长度为2
	LCD_ShowHexNum(2,1,0xA5,2);		//在2行1列显示十六进制数字0xA5,长度为2
	LCD_ShowBinNum(2,4,0xaa,8);		//在2行4列显示二进制数字0xA5,长度为8
	LCD_ShowChar(2,13,0xDF);		//在2行13列显示编码为0xDF的字符
	LCD_ShowChar(2,14,'C');			//在2行14列显示字符C
	
}

3.2 LCD1602.c

#include <REGX52.H>

//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		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_E=1;
	Delay(1);
	LCD_E=0;
	Delay(1);
}

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

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init(void)
{
	LCD_WriteCommand(0x38);
	LCD_WriteCommand(0x0C);
	LCD_WriteCommand(0x06);
	LCD_WriteCommand(0x01);
}

/**
  * @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
	{
		LCD_WriteCommand(0x80|(Column-1)+0x40);
	}
}

/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned 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,unsigned 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;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}

/**
  * @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)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
	}
}

/**
  * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:-32768~32767
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;
	LCD_SetCursor(Line,Column);
	if(Number>=0)
	{
		LCD_WriteData('+');
		Number1=Number;
	}
	else
	{
		LCD_WriteData('-');
		Number1=-Number;
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
	}
}

/**
  * @brief  在LCD1602指定位置开始以十六进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~0xFFFF
  * @param  Length 要显示数字的长度,范围:1~4
  * @retval 无
  */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	unsigned char SingleNumber;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		SingleNumber=Number/LCD_Pow(16,i-1)%16;
		if(SingleNumber<10)
		{
			LCD_WriteData('0'+SingleNumber);
		}
		else
		{
			LCD_WriteData('A'+SingleNumber-10);//减10得到偏移量
		}
	}
}

/**
  * @brief  在LCD1602指定位置开始以二进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  * @param  Length 要显示数字的长度,范围:1~16
  * @retval 无
  */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
	}
}

3.3 LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__

void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
#endif

  • 11
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的51单片机程序,通过串口控制LCD1602来改变时钟: ```c #include <reg52.h> #include <stdio.h> #define LCD1602_DB P0 sbit LCD1602_RS = P2^0; sbit LCD1602_RW = P2^1; sbit LCD1602_E = P2^2; void delay(unsigned int xms) // 延时函数 { unsigned int i, j; for(i=xms; i>0; i--) for(j=112; j>0; j--); } void LCD1602_WriteCommand(unsigned char com) // 写命令 { LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = com; LCD1602_E = 1; delay(5); LCD1602_E = 0; } void LCD1602_WriteData(unsigned char dat) // 写数据 { LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; delay(5); LCD1602_E = 0; } void LCD1602_Init() // 初始化LCD1602 { LCD1602_WriteCommand(0x38); LCD1602_WriteCommand(0x0c); LCD1602_WriteCommand(0x06); LCD1602_WriteCommand(0x01); } void LCD1602_ShowString(unsigned char x, unsigned char y, unsigned char *str) // 在指定位置显示字符串 { unsigned char i = 0; if(x<16) // x不能大于16 { if(y) // y=1,第二行 LCD1602_WriteCommand(0xc0+x); else // y=0,第一行 LCD1602_WriteCommand(0x80+x); while(str[i]!='\0') // 写入每个字符 { LCD1602_WriteData(str[i]); i++; } } } void main() { unsigned char hour = 0, minute = 0; // 定义变量 unsigned char str[16]; LCD1602_Init(); // 初始化LCD1602 while(1) { if(RI) // 如果接收到数据 { RI = 0; hour = SBUF; // 读取小时 while(!RI); // 等待接收到数据 RI = 0; minute = SBUF; // 读取分钟 sprintf(str, "%02d:%02d", hour, minute); // 格式化字符串 LCD1602_ShowString(0, 0, str); // 在LCD1602上显示 } } } ``` 这个程序通过串口接收小时和分钟,然后格式化字符串并在LCD1602上显示。你可以根据需要修改代码以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆&碎片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值