51单片机——LCD1602液晶显示屏
如下图:红框就是LCD1602液晶显示屏,他是可插拔的,插上去后数码管就会乱码无效了,因为他两共用了MCU的8个P0口
LCD1602原理图
从上面两幅图可以看出来
- LCD1602的LCD_D0~LCD_D7分别对应MCU的P00-P07
- LCD1602的LCD_RS对应MCU的P26
- LCD1602的LCD_RW对应MCU的P25
- LCD1602的LCD_E对应MCU的P27
LCD1602的16个引脚
A在5*7点阵的字模
PC收到41H的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字符了。
LCD1602指令集:
显示A的步骤
第一步:功能设置,八位数据接口,两行显示,5*7点阵,写指令0x38
第二步:显示设置,显示开,光标关,闪烁关,写指令0x0c
第三步:输入方式设置,数据读写操作后,光标自动加一,画面不动,写指令0x06
第四步:清屏,写指令0x01
第五步:设置光标位置,即DDRAM地址设置
如果是第一行,写指令0x80|(col-1)
如果是第二行,写指令0x80|(col-1+0x40)
这里做下解释,如下图所示,LCD1602只能显示两行,每行16个。
所以第一行写指令0x80|(col-1),假设col=1,即用户想在第一行第一列写数据,我们只需要写指令0x80|0x00即可,第一行第二列写数据,我们写指令0x80|0x01。
第六步:写A这个数据,把P0口直接赋值为A即可
例程:显示A
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif
Delay.c
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,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
LCD1602.c
#include <REGX52.H>
#include <Delay.h>
//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0/*** @brief LCD1602写命令* @param Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;Delay(1);LCD_EN=0;Delay(1);
}/*** @brief LCD1602写数据* @param Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;Delay(1);LCD_EN=0;Delay(1);
}/*** @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);//光标复位,清屏
}/*** @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;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(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @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(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @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,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @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(Number/LCD_Pow(2,i-1)%2+'0');}
}
main.c
#include <REGX52.H>
#include "LCD1602.h" //包含LCD1602头文件
void main()
{LCD_Init();LCD_ShowChar(1,1,'A');
}
结果:
百度网盘
51单片机系列文章所有文件内容都在此处
链接:https://pan.baidu.com/s/1iVir85WO_usDPxmyZ0qDIg
提取码:4spe
51单片机——LCD1602液晶显示屏相关推荐
- 51单片机LCD1602液晶显示屏
一.LCD1602介绍 LCD1602 (Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字 ...
- 基于51单片机LCD1602显示
基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...
- 基于51单片机LCD1602电子时钟实物制作
之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...
- 使用51单片机+lcd1602转接板-iic接口进行显示
使用51单片机+lcd1602转接板-iic接口进行显示 某宝上有卖lcd1602与iic芯片pcf8574的整合,虽然lcd1602能直接用51单片机使用,不过经过整合之后只需要对SCL和SDA两个 ...
- Proteus8仿真:51单片机LCD1602显示
51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...
- 【Proteus仿真】51单片机+LCD1602驱动模板
[Proteus仿真]51单片机+LCD1602驱动模板 Proteus仿真 主程序 /*51单片机LCD1602驱动模板 */ #include <REGX52.H> #include ...
- 【Proteus仿真】51单片机+LCD1602驱动显示模板程序
[Proteus仿真]51单片机+LCD1602驱动显示模板程序 Proteus仿真 范例工程架构 LCD1602相关驱动显示函数 //函数或者变量声明 extern void LCD1602_del ...
- 51单片机LCD1602
前言 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符.LCD1602主 ...
- 51单片机LCD1602温度时钟万年历带闹钟DS18B20实践制作DIY- GC0046-出租车计价器
一.功能说明: 基于51单片机设计-万年历带闹钟 功能介绍: STC89C52最小系统板. LCD1602 .DS1302.DS18B20.4个按键.蜂鸣器. 1.单片机获取DS1302的年月日时分秒 ...
最新文章
- shell 中长命令的换行处理
- 老旧的金融机构,是时候赶赶云计算的时髦了
- 使用C#+Linq+SQL快速开发业务
- linux重定向文件过大,Linux大文件重定向和管道的效率对比总结
- 8.3 TensorFlow BP神经网络构建与超参数的选取
- WebRTC系列之音频的那些事
- 大剑无锋之大数据面试题第一套(选择题)
- 两个特征是独立好还是正相关好_2021考研数学概率典型例题,都给你总结好啦!...
- 全向轮底盘磁导轨寻迹
- 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
- Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6
- 阿里技术:基于Kafka+Flink+Redis的电商大屏实时计算案例
- 3.1 SE11创建域
- [C#-Util]-读写文件汉字乱码
- C语言习题5.21--学生成绩的处理
- 空间统计分析-GeoDa软件
- java蓝桥杯练习 学做菜
- 远程登陆服务器跑深度学习程序
- html5的video在IOS端默认全屏和黑屏问题
- LeetCode刷题遇到的小知识点总结
热门文章
- 雅安职业技术学院工业机器人专业_雅安职业技术学院有哪些专业_2020年学费标准_中职中专网...
- 转让英孚10个月课程
- 如何解决Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]
- Java 反射和映射(主要描述下反射)
- 【网络安全培训】无线局域网的安全威胁都有哪些?
- 暑期实训总结_李小倩
- 如何三平台win/安卓/ios同步日历日程
- 生鲜电商运营框架的对比和分析
- 计算机类核心期刊排名及投稿信息介绍
- 从一名白纸交易者到稳定盈利交易员需要多长时间?