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位移到整数部分。例如,如果
Number是
123,并且
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 )
效果: