如下图:红框就是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液晶显示屏相关推荐

  1. 51单片机LCD1602液晶显示屏

    一.LCD1602介绍 LCD1602 (Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字 ...

  2. 基于51单片机LCD1602显示

    基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...

  3. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  4. 使用51单片机+lcd1602转接板-iic接口进行显示

    使用51单片机+lcd1602转接板-iic接口进行显示 某宝上有卖lcd1602与iic芯片pcf8574的整合,虽然lcd1602能直接用51单片机使用,不过经过整合之后只需要对SCL和SDA两个 ...

  5. Proteus8仿真:51单片机LCD1602显示

    51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...

  6. 【Proteus仿真】51单片机+LCD1602驱动模板

    [Proteus仿真]51单片机+LCD1602驱动模板 Proteus仿真 主程序 /*51单片机LCD1602驱动模板 */ #include <REGX52.H> #include ...

  7. 【Proteus仿真】51单片机+LCD1602驱动显示模板程序

    [Proteus仿真]51单片机+LCD1602驱动显示模板程序 Proteus仿真 范例工程架构 LCD1602相关驱动显示函数 //函数或者变量声明 extern void LCD1602_del ...

  8. 51单片机LCD1602

    前言 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符.LCD1602主 ...

  9. 51单片机LCD1602温度时钟万年历带闹钟DS18B20实践制作DIY- GC0046-出租车计价器

    一.功能说明: 基于51单片机设计-万年历带闹钟 功能介绍: STC89C52最小系统板. LCD1602 .DS1302.DS18B20.4个按键.蜂鸣器. 1.单片机获取DS1302的年月日时分秒 ...

最新文章

  1. shell 中长命令的换行处理
  2. 老旧的金融机构,是时候赶赶云计算的时髦了
  3. 使用C#+Linq+SQL快速开发业务
  4. linux重定向文件过大,Linux大文件重定向和管道的效率对比总结
  5. 8.3 TensorFlow BP神经网络构建与超参数的选取
  6. WebRTC系列之音频的那些事
  7. 大剑无锋之大数据面试题第一套(选择题)
  8. 两个特征是独立好还是正相关好_2021考研数学概率典型例题,都给你总结好啦!...
  9. 全向轮底盘磁导轨寻迹
  10. 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
  11. Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6
  12. 阿里技术:基于Kafka+Flink+Redis的电商大屏实时计算案例
  13. 3.1 SE11创建域
  14. [C#-Util]-读写文件汉字乱码
  15. C语言习题5.21--学生成绩的处理
  16. 空间统计分析-GeoDa软件
  17. java蓝桥杯练习 学做菜
  18. 远程登陆服务器跑深度学习程序
  19. html5的video在IOS端默认全屏和黑屏问题
  20. LeetCode刷题遇到的小知识点总结

热门文章

  1. 雅安职业技术学院工业机器人专业_雅安职业技术学院有哪些专业_2020年学费标准_中职中专网...
  2. 转让英孚10个月课程
  3. 如何解决Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]
  4. Java 反射和映射(主要描述下反射)
  5. 【网络安全培训】无线局域网的安全威胁都有哪些?
  6. 暑期实训总结_李小倩
  7. 如何三平台win/安卓/ios同步日历日程
  8. 生鲜电商运营框架的对比和分析
  9. 计算机类核心期刊排名及投稿信息介绍
  10. 从一名白纸交易者到稳定盈利交易员需要多长时间?