51单片机LCD1602液晶屏

LCD介绍

1.LCD相关函数

在这里插入图片描述

2.LCD在单片机上位置

在这里插入图片描述

3.LCD原理图

在这里插入图片描述

LCD详细代码

1.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

2.LCD.c

  • 头文件及引脚配置

#include <REGX52.H>
​
//引脚配置:
sbit LCD_RS=P2^6;           //LCD_RS(Register Select):这是寄存器选择引脚。当RS为0时,LCD工作在命令模式,此时发送的字节将被解释为命令;当RS为1时,LCD工作在数据模式,此时发送的字节将被解释为要显示的数据。
​
sbit LCD_RW=P2^5;          //LCD_RW(Read/Write):这是读/写引脚。它用于选择LCD的读写模式。当RW为0时,表示进行写操作,将数据或命令发送到LCD;当RW为1时,表示进行读操作,从LCD读取数据
​
sbit LCD_EN=P2^7;          //这是使能引脚。这个引脚用于告诉LCD开始读取数据或命令。
​
#define LCD_DataPort P0
  • LCD1602写命令

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();           //延时
    //在调用命令时,可能需要一些延时(例如,调用 LCD_Delay() 函数),以确保液晶显示器有足够的时间处理这些指令。
}
  • LCD1602写数据

void LCD_WriteDate(unsigned char Command)
{
    LCD_RS=1;              //数据 模式
    LCD_RW=0;              //写   模式
    LCD_DataPort=Command;  //要写入的数据
    LCD_EN=1;              //读取数据 
    LCD_Delay();
    LCD_EN=0;              //不读取数据
    LCD_Delay();
}
  • LCD1602设置光标位置

void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
    if(Line==1)            // Line 行位置,范围:1~2
    {
        LCD_WriteCommand(0x80|(Column-1));//Column 列位置,范围:1~16
    }                      //0x80是指令的基值,Column-1表示行和列锁定的位置:(0x00|Column-1)
    else if(Line==2)
    {
        LCD_WriteCommand(0x80|(Column-1+0x40));
    }                      //0x80是指令的基值,(Column-1+0x40)表示行和列锁定的位置
}                          //通常在一个常见的16x2液晶显示器中,地址从0x00到0x0F是第一行,从0x40到0x4F是第二行。
  • LCD1602初始化函数

void LCD_Init()
{
    LCD_WriteCommand(0x38);//命令值:0x38,效果:配置LCD为八位数据接口模式,支持两行显示,及每个字符使用5*7点阵
    LCD_WriteCommand(0x0c);//命令值:0x0c,打开显示功能,关闭光标功能和光标显示功能
    LCD_WriteCommand(0x06);//命令值:0x06,设置光标在数据读写操作后自动向右移动,且屏幕内容不滚动
    LCD_WriteCommand(0x01);//命令值:0x01,清楚屏幕,并将光标重置到起始位置(第一行第一列)
}
  • LCD1602指定位置上显示一个字符

void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
    LCD_SetCursor(Line,Column);  //设置光标位置
    LCD_WriteData(Char);         写入字符到当前光标位置
}
  • LCD1602指定位置开始显示所给字符串

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]);//将字符逐个写入
    }
}

使用*String 的原因:

使用 char *String 进行字符串参数的传递是因为:C 语言中的字符串实际上是一个字符数组,以空字符 '\0' 结束,

char *String 表示一个字符指针,指向字符串的首个字符.

举例:有以下字

char myString[] = "Hello, World!";

函数调用时,可以这样传递字符串:

LCD_ShowString(0, 0, myString);
  • 返回值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;
}
  • LCD1602指定位置开始显示所给数字

void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{                                //函数将指定的数字格式化为字符串,并逐个字符写入 LCD
    unsigned char i;
    LCD_SetCursor(Line,Column);  ///设置光标位置  
    for(i=Length;i>0;i--)
    {
        LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
    }
}

Number/LCD_Pow(10,i-1)%10+'0'的原理

Number除以 10(𝑖−1)10(*i*−1),这样便可以将Number的第i位移到整数部分。例如,如果Number123,并且i(对应10进制的第2位)是 2,那么这个操作计算的是123 / 10,结果是12;12 % 10 的结果是 2。目的:得到 Number 中的第 i 位数字。

通过添加 '0',我们将提取到的数字转换为其对应的字符(字符 '0' 的 ASCII 值是 48,字符 '1' 的 ASCII 值是 49;例如,数字 2 被转换为字符 '2')

  • LCD1602指定位置开始以有符号十进制显示所给数字

void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
    unsigned char i;
    unsigned int Number1;  //number1为正值
    LCD_SetCursor(Line,Column);
    if(Number>=0)
    {
        LCD_WriteData('+');
        Number1=Number;   //如果 Number 是非负数(大于或等于 0),在 LCD 上写入 '+' 号,并将 Number 的值赋给 Number1
    }
    else
    {
        LCD_WriteData('-');
        Number1=-Number;  //如果 Number 是负数,写入 '-' 号,并将 Number 的绝对值赋给 Number1(用 -Number 来获取正值)
    }
    for(i=Length;i>0;i--)
    {
        LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0'); //把数字以字符的形式一个一个发出去
    }
}
  • LCD1602指定位置开始以十六进制显示所给数字

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;
        //Number / LCD_Pow(16, i - 1) % 16 的目的是为了根据当前的位位置 i 提取出 Number 的十六进制数字。通过除以相应的权重并取模,我们可以获得每一位的具体值
        if(SingleNumber<10)
        {
            LCD_WriteData(SingleNumber+'0');
            //如果值小于 10(即 0-9),直接显示其 ASCII 码,通过加上字符 '0' 转换为字符。
        }
        else
        {
            LCD_WriteData(SingleNumber-10+'A');
            //如果值在 10 到 15 之间,显示其对应的字母(A-F),通过计算 SingleNumber - 10 + 'A' 得到。
        }
    }
}
  • LCD1602指定位置开始以二进制显示所给数字

void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
    unsigned char i;            //i对对应二进制的相应位数,例如i=4,对应二进制的第4位
    LCD_SetCursor(Line,Column);
    for(i=Length;i>0;i--)
    {
        LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0'); 
    }
}

十进制转二进制原理

Number/LCD_Pow(2,i-1)表示每一位对应2^-1的 位对应值

%2 使转化后的数值不超过2,即0和1( 当 位对应值 为 3 时, 3%2=1 )

效果:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值