51——LCD1602显示 字符、字符串、数字
- LCD1602简介
- LCD1602相关引脚
- LCD1602写命令、写数据相关操作图
- 写指令 代码
- 写数据 代码
- LCD1602显示程序步骤及如何初始化
- 显示开关控制指令
- 进入模式设置指令
- 功能设定指令
- 清屏指令
- 设置从(x,y)开始显示
- 显示字符 或 字符串
-
- 接线图
- 代码整合
-
- 效果展示
LCD1602简介
![在这里插入图片描述](https://img-blog.csdnimg.cn/b5ce5f56a62142139efee73881eec968.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
LCD1602相关引脚
![在这里插入图片描述](https://img-blog.csdnimg.cn/f3ae3105770e487493ac8b2f3c3d74f4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)
LCD1602写命令、写数据相关操作图
![在这里插入图片描述](https://img-blog.csdnimg.cn/af2b774bce5941c9a41685e17f35b3cf.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4bcb9dfbd2f946b7b985229b5f7da873.png#pic_center)
写指令 代码
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DataPort = Command;
LCD_E = 1;
Delay1ms();
LCD_E = 0;
Delay1ms();
}
写数据 代码
void LCD_WriteData(unsigned char Data)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DataPort = Data;
LCD_E = 1;
Delay1ms();
LCD_E = 0;
Delay1ms();
}
LCD1602显示程序步骤及如何初始化
- 显示开关控制指令(功能:控制显示器开/关 光标显示/关闭 是否闪烁)
- 进入模式设置指令(功能:每写入一位数据后光标的移动 左/右 显示屏不移动/整体右移 )
- 功能设定指令(功能:设定数据总线的位数 显示的行数 字型 )
- 清屏指令(功能:清屏显示空白 光标归位 地址计数器(AC)的值为0)
- 显示位置设置(功能:指定在1602上哪个位置上显示数据)
显示开关控制指令
![在这里插入图片描述](https://img-blog.csdnimg.cn/43c6343fba1f4f9ca26910f7e5de5a2e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
LCD_WriteCommand(0x0c);
进入模式设置指令
![在这里插入图片描述](https://img-blog.csdnimg.cn/7646920cfdf744d29fce939d624b5a39.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
LCD_WriteCommand(0x06)
功能设定指令
![在这里插入图片描述](https://img-blog.csdnimg.cn/0334a2d989864199a12eb4ca7430e41b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
LCD_WriteCommand(0x38);
清屏指令
![在这里插入图片描述](https://img-blog.csdnimg.cn/caace2a7d0e74062bf2d285f13eda0fc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
LCD_WriteCommand(0x01);
设置从(x,y)开始显示
![在这里插入图片描述](https://img-blog.csdnimg.cn/5092490f0f0d478d8a7af9b79ac66a98.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
如果想在1602屏幕上第一行第一个开始显示 就是0x80
如果想在1602屏幕上第二行第一个开始显示 就是0xc0
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
if(Line == 1)
{
LCD_WriteCommand( 0x80 | (Columu-1) );
}
else
{
LCD_WriteCommand( 0x80 | ( Columu-1 )+0x40 );
}
}
显示字符 或 字符串
显示字符
void LCD_ShowChar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
LCD_SetCursor(Line,Columu);
LCD_WriteData(Char);
}
显示字符串
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char* String)
{
unsigned char i = 0;
LCD_SetCursor(Line,Columu);
for(i=0;String[i] != '\0';i++)
{
LCD_WriteData(String[i]);
}
}
显示数字
获取次方数
![在这里插入图片描述](https://img-blog.csdnimg.cn/dfae8d9166d24d8db3ec8943825b81bf.png#pic_center)
int LCD_Pow(unsigned char x,unsigned char y)
{
unsigned char i = 0;
int result = 1;
for(i=0;i<y;i++)
{
result *= x;
}
return result;
}
显示数字
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Num,unsigned int Length)
{
unsigned char i = 0;
LCD_SetCursor(Line,Columu);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Num/LCD_Pow(10,i-1)%10);
}
}
接线图
![在这里插入图片描述](https://img-blog.csdnimg.cn/a74000ab8963453598bf87960c83fd8f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
代码整合
LCD1602.c
#include "regx52.h"
#include "LCD1602.h"
#include "intrins.h"
sbit LCD_RS = P2^5;
sbit LCD_RW = P2^6;
sbit LCD_E = P2^7;
sbit LED_V0 = P1^0;
#define LCD_DataPort P0
void Delay1ms()
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DataPort = Command;
LCD_E = 1;
Delay1ms();
LCD_E = 0;
Delay1ms();
}
void LCD_WriteData(unsigned char Data)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DataPort = Data;
LCD_E = 1;
Delay1ms();
LCD_E = 0;
Delay1ms();
}
void LCD_Init()
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0c);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
LED_V0 = 0;
}
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
if(Line == 1)
{
LCD_WriteCommand( 0x80 | (Columu-1) );
}
else
{
LCD_WriteCommand( 0x80 | ( Columu-1 )+0x40 );
}
}
void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char)
{
LCD_SetCursor(Line,Columu);
LCD_WriteData(Char);
}
void LCD_ShowString(unsigned char Line , unsigned char Columu , unsigned char* String)
{
unsigned char i = 0;
LCD_SetCursor(Line,Columu);
for(i=0;String[i] != '\0';i++)
{
LCD_WriteData(String[i]);
}
}
int LCD_Pow(unsigned char x,unsigned char y)
{
int result = 1;
unsigned char i = 0;
for(i=0;i<y;i++)
{
result *= x;
}
return result;
}
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Num,unsigned int Length)
{
unsigned char i = 0;
LCD_SetCursor(Line,Columu);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Num/LCD_Pow(10,i-1)%10);
}
}
LCD1602.h
#ifndef _LCD1602_h_
#define _LCD1602_h_
void Delay1ms(void);
void LCD_WriteCommand(unsigned char Command);
void LCD_WriteData(unsigned char Data);
void LCD_Init(void);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
void LCD_ShowChar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char* String);
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Num,unsigned int Length);
#endif
main.c
#include "regx52.h"
#include "intrins.h"
#include "Timer0.h"
#include "uart.h"
#include "LCD1602.h"
void Delay500ms()
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
LCD_Init();
LCD_ShowChar(1,7,'Y');
LCD_ShowString(2,2,"Hello!Yinyuer");
LCD_ShowNum(1,8,689,3);
while(1)
{
}
}
void UART_Routine() interrupt 4
{
if( RI==1 )
{
P1=SBUF;
UART_SendByte(SBUF);
RI = 0;
}
}
效果展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/acf3a19f8cd54ff6a4e5a5a06ae0ce07.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)