当前位置: 首页 > news >正文

51单片机-第十二节-LCD1602液晶显示屏

一、LCD1602介绍:

LCD1602是一种字符型液晶显示屏,可以显示ASCII码的标准字符和其他的内置特殊字符。

显示容量:16*2个字符,每个字符为5*7点阵。

二、引脚及应用电路:

其中:D0-7这8位数据是接在P0引脚上的,且高低位对应,即P0^7 - D7。

 三、内部结构:

DDRAM储存ASCII码值,随后在CGRAM字模库中找到对应的应亮像素点,然后显示出来。

其中DDRAM的容量大于屏幕大小,所以后面会学指令,使屏显内容移动,做到流动屏。

DDRAM地址:

四、时序结构:

先将RS置1,随后R/W置0,再将E置1,随后修改D0-7的数据,再将E置0。

五、指令集:

本节所用指令:

清屏:0x01

输入方式:0x06    数据读写后,光标加一,画面不动

显示开关控制:0x0c    显示开,光标关,显示关

功能设置:0x38    8位数据接口,2行显示,5*7点阵

DDRAM地址设置:选择在DDRAM中存储数据的地址。最高位置1,后面为地址。
(例:第二行第一位:40即 0100 0000,最高位置1,得1100 0000,即为地址)
可用:0x80 | ()

总集:

六、集成LCD1602:

sbit LCD_RS = P2 ^ 6;
sbit LCD_RW = P2 ^ 5;
sbit LCD_E = P2 ^ 7;
#define LCD_DataPort P0void LCD_Delay()             //@12.000MHz  1ms
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}
void LCD_WriteCommand(unsigned char Command)
{LCD_RS = 0;LCD_RW = 0;LCD_DataPort = Command;LCD_E = 1;LCD_Delay();LCD_E = 0;LCD_Delay();
}
void LCD_WriteData(unsigned char Data)
{LCD_RS = 1;LCD_RW = 0;LCD_DataPort = Data;LCD_E = 1;LCD_Delay();LCD_E = 0;LCD_Delay();
}
void LCD_Init()
{LCD_WriteCommand(0x38);   //8位数据接口,2行显示,5*7点阵LCD_WriteCommand(0x0C);   //显示开,光标关,显示关LCD_WriteCommand(0x06);   //数据读写后,光标加一,画面不动LCD_WriteCommand(0x01);   //清屏
}
//设置光标位置
void LCD_SetCursor(unsigned char Line, unsigned char Column)
{if (Line == 1){LCD_WriteCommand(0x80 | (Column - 1));}else{LCD_WriteCommand(0x80 | (Column - 1) + 0x40);}
}
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 i;LCD_SetCursor(Line, Column);for (i = 0; String[i] != '\0'; i++){LCD_WriteData(String[i]);}
}
int LCD_Pow(int x, int y)
{unsigned char i;int Result = 1;for (i = 0; i < y; i++){Result *= x;}return Result;
}
//10进制
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('0' + Number / LCD_Pow(10, i - 1) % 10);}
}
//有符号10进制
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('0' + Number1 / LCD_Pow(10, i - 1) % 10);}
}
//16进制
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 (i = Length; i > 0; i--){SingleNumber = Number / LCD_Pow(16, i - 1) % 16;if (SingleNumber < 10){LCD_WriteData('0' + SingleNumber);}else{LCD_WriteData('A' + SingleNumber - 10);}}
}
//2进制
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('0' + Number / LCD_Pow(2, i - 1) % 2);}
}


http://www.mrgr.cn/news/20870.html

相关文章:

  • 怎么解决海外服务器远程连接失败的问题?
  • CRM软件的演进:从传统到连接型CRM
  • 污泥浓度在线分析仪
  • 使用WMI改变显示器亮度
  • 告别单调,Xmind思维导图之后还有这三款神器,让学习工作更愉快
  • 猎板道出PCB免费打样真相:制造成本究竟给了谁?
  • 66-java 类型擦除
  • 【技术警报】Redis故障启示录:当主节点宕机,如何避免数据“雪崩”?
  • 【C++】网络编程之Socket初体验-超详细!
  • 哈希扩展(位图与布隆过滤器)
  • 我们应该怎么区分三叉神经痛和面肌痉挛
  • [SwiftUI 开发] 构建带有动画的图片瀑布流效果
  • 1-7月NOA前装同比增长近2倍,理想/赛力斯/奔驰「领跑」
  • HyperWorks的RT功能及使用技巧
  • 应用方案 | 低功耗接地故障控制器D4145
  • win10任务栏颜色怎么调?分享几个简单操作,附上详细图文教程
  • Material xxx SDF Material doesn‘t have _Stencil property
  • AI艺术创作福利:免费领取红包封面,Meo喵、龙小金与你共庆佳节!
  • 动态面板模型
  • 解决 Ant Design Vue Upload 组件在苹果手机上只能拍照无法选择相册的问题