天河wap网站建设公司,外贸网站高端定做,企业网站的可信度建设包括,wordpress goto主题目录
LCD1602.c
模拟写指令的时序
模拟写数据的时序
初始化
显示字符
显示字符串
显示数字
显示有符号的数字
显示16进制数字
显示二进制数
LCD1602.h
main.c 上一篇讲了LCD1602的工作原理#xff0c;这一节开始代码演示#xff01;
新创建工程#xff1a;LCD1…目录
LCD1602.c
模拟写指令的时序
模拟写数据的时序
初始化
显示字符
显示字符串
显示数字
显示有符号的数字
显示16进制数字
显示二进制数
LCD1602.h
main.c 上一篇讲了LCD1602的工作原理这一节开始代码演示
新创建工程LCD1602功能函数代码
新创建main.cLCD1602.c和LCD1602.h文件
开始代码讲解
LCD1602.c
先根据原理图声明一下这三个控制引脚和八个数据引脚 #include REGX52.H//引脚定义
sbit LCD_RSP2^6;
sbit LCD_RWP2^5;
sbit LCD_EP2^7;
#define LCD_DataPort P0然后根据上一篇讲的时序逐个定义函数
模拟写指令的时序 首先是写指令
void LCD_WriteCommand(unsigned char Command)
{LCD_RS0;//写指令是低电平LCD_RW0;//写LCD_DataPortCommand;//将指令放在数据口Data port上LCD_E1;//使能LCD_Delay();//延时1msLCD_E0;//关闭使能LCD_Delay();//延时1ms
}
由于E等于高电平是时间太快了我们看到手册上的时序参数都是纳秒级的单片机最低是微秒级的。 我们写指令得需要一定的执行时间如果E的电平给高立马给低的话如果太快的话可能读不过来 因此我们需要在E1之后加一段延时E0之后也加一段延时。
我们在STC软件上生成一个1ms的延时函数 放在写指令的函数上方将函数名改成LCD_Delay()
void LCD_Delay() //12.000MHz 1ms
{unsigned char i, j;i 2;j 239;do{while (--j);} while (--i);
}
这样我们就可以直接调用这个延时函数了 模拟写数据的时序 void LCD_WriteData(unsigned char Data)
{LCD_RS1;//写数据是高电平LCD_RW0;LCD_DataPortData;LCD_E1;LCD_Delay();LCD_E0;LCD_Delay();
}接下来我们把这两个函数组合起来根据LCD1602的操作流程完成我们想要的功能 初始化
void LCD_Init(void)
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0C);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);
}显示字符
显示字符之前我们得设置光标位置
void LCD_SetCursor(unsigned char Line,unsigned char Column)//行列
{if(Line1)//如果是第一行{LCD_WriteCommand(0x80|(Column-1));}else //如果是第二行{LCD_WriteCommand(0x80|(Column-1)0x40);}
}如果是第一行用0x80或上列码-1
如果是第二行用0x80或上列码-1再0x40
如果不知道0x80是什么请看上一篇博客的解释
设置好光标位置后开始写显示字符函数
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)// 行 列 显示的字符
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}但是显示字符在实际的应用中还是远远不够的我们可以让它显示别的东西
比如
显示字符串
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
//传过来的unsigned char*型指针代表字符串的首地址{unsigned char i;LCD_SetCursor(Line,Column);for(i0;String[i]!\0;i)//遍历字符数组{LCD_WriteData(String[i]);}
}
显示数字
由于不能直接显示数字得先转换成字符然后再显示
比如传过来的数字是789那么我们得对789进行转换成字符7字符8和字符9再显示
怎么转换呢 先挨个位取出来数字7数字8数字9
789/1007.89对7.89取余7.89%107取出来了高位
789/10%108取出来第二位
789/1%109取出来最低位
我们按照这个方法从高位开始取
我们得弄个长度的变量 ii 和取整时的除数的关系是 于是我们可以先定义一个次方函数通过这个函数我们就可以得到返回值等于x的y次方
int LCD_Pow(int X,int Y)
{unsigned char i;int Result1;//如果Y0则下面的iY直接不成立直接返回1符合任何数的0次方等于1的规则for(i0;iY;i){Result*X;//如果Y1结果等于1*X就等于X的1次方//如果Y2结果等于1*X*X等于X的2次方}return Result;//返回值等于x的y次方
}
我们用这个规律Number/LCD_Pow(10,i-1)规律取出来的是数字想要显示成字符的话要将数字转换成对应的ASCII码值。怎么转换呢
我们看着ASCII码表找规律 由此可见我们想要将一个数字转换成对应的ASCII码值的话可以将它本身的二进制数值加上0x30也就是字符0的ASCII码值就能得到它的ASCII码值了 于是就写成0Number/LCD_Pow(10,i-1)%10
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(iLength;i0;i--)//从高位开始取{LCD_WriteData(0Number/LCD_Pow(10,i-1)%10);//Number/LCD_Pow(10,i-1) 10Xi-1Y}
}
显示有符号的数字
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(Number0){LCD_WriteData();Number1Number;}else{LCD_WriteData(-);Number1-Number;//变成正数范围是32768为了保证范围则需要赋给一个无符号的int型}for(iLength;i0;i--){LCD_WriteData(0Number1/LCD_Pow(10,i-1)%10);}
}
显示16进制数字
如果是16进制了话就不是除以10除以100这样子了而是除以16再对16取余
所以改成Number/LCD_Pow(16,i-1)%16;
而且16进制从0~F0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
而A的ASCII码值不是紧接着9的所以当数字大于等于10的话要用 if 判断一下 并且这时就不是加0x30了要改成加上0x41即 A 的ASCII码值 我们将取出来的单个数字定义成SingleNumber‘A’但是当取出来的SingleNumber大于等于10的话我们将它‘A’就会偏移10。
比如说SingleNumber10那么它的二进制数是0100 1010加上‘A’的ASCII码0100 0001, 而我们想要SingleNumber是A的话就得减去10。
如果说SingleNumber11那么它的二进制数是0100 1011加上‘A’的ASCII码0100 0001, 而我们想要SingleNumber是B的话就得减去10。 因此ASingleNumber-10
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;unsigned char SingleNumber;LCD_SetCursor(Line,Column);for(iLength;i0;i--){SingleNumberNumber/LCD_Pow(16,i-1)%16;//取出单个数值if(SingleNumber10)//如果单个数值小于10{LCD_WriteData(0SingleNumber);}else //如果单个数值大于等于10{LCD_WriteData(ASingleNumber-10);}}
}
显示二进制数
二进制的话就改成除以2和%2Number/LCD_Pow(2,i-1)%2
取出来之后加上0的ASCII码就是对应的字符了 void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(iLength;i0;i--){LCD_WriteData(0Number/LCD_Pow(2,i-1)%2);}
}LCD1602.h
然后声明一下这些函数
#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned 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);#endifmain.c
最后在主程序中调用一下这些函数就可以显示了!
#include REGX52.H
#include LCD1602.h
#include Delay.hvoid main()
{LCD_Init(); //LCD初始化LCD_ShowChar(1,1,A); //在1行1列显示字符ALCD_ShowString(1,3,Hello); //在1行3列显示字符串HelloLCD_ShowNum(1,9,66,2); //在1行9列显示数字66长度为2LCD_ShowSignedNum(1,12,-88,2); //在1行12列显示有符号数字-88长度为2LCD_ShowHexNum(2,1,0xA5,2); //在2行1列显示十六进制数字0xA5长度为2LCD_ShowBinNum(2,4,0xA5,8); //在2行4列显示二进制数字0xA5长度为8LCD_ShowChar(2,13,0xDF); //在2行13列显示编码为0xDF的字符LCD_ShowChar(2,14,C); //在2行14列显示字符Cwhile(1){}
}效果请看视频 LCD1602液晶显示屏 补充
如果想要做流动字幕的效果的话我们可以调用这个指令码0x18 将写指令的函数声明为外部可调用函数 然后在主程序中调用这个函数传这一个移屏指令过去放在while循环里面调用一次移一次 但是这样太快了我们可以把我们之前讲过的Delay的模块化程序添加进来每移一次就Delay 500ms 效果请看视频 LCD1602液晶屏显示流动字幕 以上就是本节内容源码会放在评论区如有问题可评论区留言