51单片机-LCD1602显示屏

ops/2024/10/19 6:17:50/

简介

是一个液晶显示屏,通过电压对显示区域进行控制,有电就显示。

能够同时显示32个字符,分为两行,一行显示16个字符。可以显示的内容只能是字母、数字或者一些特殊符号。

使用ASCII码来让LCD1602来显示对应的字符。

电路图

图示:

引脚说明

第1引脚:GND是接地引脚。

第2引脚:VCC是电源引脚。

第3引脚:VO/VL是液晶显示器的对比度调整,接正电源时对比度比较高, 接地的时候对比度比较低。

第4引脚:RS为寄存器选择,高电平选择的是数据寄存器,低电平选择的是指令寄存器。(高数低命)

第5引脚:RW读写信号线,高电平代表进行读操作,低电平代表进行写操作。

                RS低电平,RW为高电平:读命令

                RS高电平,RW为低电平:写数据

第6引脚:E端使能端,当E由高电平变为低电平,液晶模块就不再输出显示了,而是执行命令或者写入数据。

第7~14引脚:D0~D7为8位的双向数据线。

第15引脚:背光源正极。

第16引脚:背光源负极。

LCD1602的显示方式

图示:

LCD1602的基本操作方式

图示:

读状态:输入RS=0,RW=1,E=1.输出D0~D7为状态字,读忙信号,D7引脚为标志位(BF), 高电平表示忙,低电平表示不忙。

读数据:输入RS=1,RW=1,E=1.输出D0~D7的八位数字为数据。

写命令:输入RS=0,RW=0,E=0.输出:无。将指令或者显示地址写入到LCD1602中。

写数据:输入RS=1,RW=0,E=0 输出:无。写入数据。

LCD1602的时序图

图示:

由于DS18B20是单总线设计,只能通过一个引脚来读取和写入命令或数据,但是LCD1602是由8个引脚来传输数据,所以不需要像DS18B20一样有严格的时序时间要求。

练习:

1、将DS18B20的温度显示到LCD1602中;

2、使用按键来改变DS18B20的报警阈值,并更新显示在LCD1602中。报警时机会根据阈值的改变而改变,可以对报警的频率进行不同的设置,比如20度报警音调低,30度稍高,40度更高。

#include <reg51.h>
#define uchar unsigned char
#define DataPort  P2	
sbit RS =P0^7;
sbit RW =P0^6;
sbit E =P0^5; //lcd显示屏sbit DQ=P3^7; //温度
sbit BEE = P3^6;//蜂鸣器sbit KEY1=P3^5; //按键
sbit KEY2=P3^4;
sbit KEY3=P3^3;//unsigned char arr1[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};unsigned char arr1[10] = {'0','1','2','3','4','5','6','7','8','9'};//unsigned char arr2[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};unsigned char tempL = 0;
unsigned char tempH = 0;unsigned char flag=1;unsigned int sdata;unsigned char xiaoshu1;
unsigned char xiaoshu2;void delay(unsigned char i)
{for(i; i > 0; i--);
}void Delay10ms()		//@11.0592MHz
{unsigned char i, j;i = 18;j = 235;do{while (--j);} while (--i);
}unsigned char Init_DS18B20()
{unsigned char x = 0;DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(5); x = DQ; delay(30); return x;
}// 写函数void writeOneChar(unsigned char dat)
{unsigned char i=0;for(i = 8;i > 0;i--) {DQ=0; DQ=dat&0x01;delay(5); DQ=1; dat>>=1; delay(2); }
}// 读函数unsigned char readOneChar()
{unsigned char dat=0; unsigned int i ;for(i = 0; i < 8 ;i++){DQ=1;delay(1); DQ=0;delay(1); dat>>=1; DQ=1; if(DQ){	dat|=0x80;}delay(4);}return dat;
}// 读取温度值
void readTemperature()
{while(Init_Ds18B20()); writeOneChar(0xcc); writeOneChar(0x44); delay(124); while(Init_Ds18B20());writeOneChar(0xcc); writeOneChar(0xbe); tempL = readOneChar(); tempH = readOneChar(); if(tempH>0x7f){tempL = ~tempL + 1;tempH = ~tempH;flag = 0;}sdata = (float)(tempH << 8 | tempL) / 16.0; xiaoshu1 = (tempL&0x0f)*10/16;xiaoshu2 = (tempL&0x0f)*100/16%10;}//检测LCD是否忙
void BusyCheck()
{uchar sta;DataPort = 0xff;RS=0;RW=1;do{E=1;sta=DataPort;E=0;}while(sta&0x80);
}//写数据
void WriteData(uchar dat)
{BusyCheck();	RS = 1;RW = 0;DataPort = dat;E=1;E=0;}
//写命令
void WriteCMD(uchar cmd)
{BusyCheck();	RS=0;RW=0;DataPort = cmd;E=1;E=0;
}
//lcd屏幕
void lcd()
{WriteCMD(0x06);WriteCMD(0x0c);WriteCMD(0x38);WriteCMD(0x80);WriteData(arr1[sdata/10]);WriteData(arr1[sdata%10]);WriteData('.');WriteData(arr1[xiaoshu1]);WriteData(arr1[xiaoshu2]);WriteData(' ');WriteData(' ');
}蜂鸣器
//void beef()
//{
//	BEE=1;
//	if(sdata >= 50)
//	{
//		BEE = !BEE;
//	}
//	else
//	{
//		BEE = 1;
//	}
//}
//	
//按键
void key()
{//定义两个字符unsigned char ch1='0';unsigned char ch2='0';int i;if(KEY1==0)//20-30{KEY1=0;KEY2=1;KEY3=1;Delay10ms();ch1='2';ch2='0';if(sdata>=20 && sdata <30){for(i=0;i<300;i++){BEE = !BEE;delay(100);}}}if(KEY2==0)//30-40{KEY1=1;KEY2=0;KEY3=1;Delay10ms();ch1='3';ch2='0';if(sdata>=30 && sdata <40){for(i=0;i<300;i++){BEE =! BEE;delay(300);delay(300);}}}if(KEY3==0)//大于40{KEY1=1;KEY2=1;KEY3=0;Delay10ms();ch1='4';ch2='0';if(sdata>=40){for(i=0;i<300;i++){BEE =! BEE;delay(300);delay(300);delay(300);}}}WriteData(ch1);WriteData(ch2);}void main()
{WriteCMD(0x01);while(1){readTemperature();lcd();// beef();key();}}


http://www.ppmy.cn/ops/94297.html

相关文章

【OpenCV C++20 学习笔记】直方图计算-split, calcHist, normalize

直方图计算-split, calcHist, normalize 广义直方图示例目标分离通道计算直方图绘制计算结果归一化绘制 最终结果 广义直方图 直方图的横坐标除了可以是图片中的强度值&#xff0c;也可以是任何其他我们想要观察的特征。例如&#xff0c;下面的图片矩阵中包含了0-255的强度值&…

Jmeter接口测试+压力测试

接口测试 Jmeter-http接口脚本 一般分五个步骤:&#xff08;1&#xff09;添加线程组 &#xff08;2&#xff09;添加http请求 &#xff08;3&#xff09;在http请求中写入接入url、路径、请求方式和参数 &#xff08;4&#xff09;添加查看结果树 &#xff08;5&#xff09;…

Highcharts 条形图:数据可视化的利器

Highcharts 条形图:数据可视化的利器 引言 在数据分析和可视化领域,Highcharts 是一个广受欢迎的 JavaScript 图表库。它以其易用性、灵活性和丰富的图表类型而著称。其中,条形图作为一种基础但功能强大的图表类型,被广泛应用于各种场景,以直观地展示数据分布和比较。本…

dockerfile

dockerfile 自定义镜像--------通过dockerfile创建镜像 创建镜像的方式 1、dockerfile最基本的方式&#xff0c;也是最常用的方式 2、docker pull 拉取的是最基础的镜像&#xff0c;只有基础功能&#xff0c;没有定制化的功能。 3、基于基础镜像&#xff0c;创建好了容器之…

vue 3d echarts scatter3D元素塌陷,图标塌陷进地图完美解决方案

当我们手机用 scatter3D 类型时&#xff0c;最小值因为渲染问题会塌陷进模型里面&#xff0c;所以只要让value固定&#xff0c;再将label formatter 配合 boxHeight属性即可解决&#xff0c;&#xff08;代码附带自定义label图标解决办法&#xff09; 解决&#xff1a; <…

Docker日志管理

一、知识点介绍 1.ELK(Elasticserach、Logstash、Kibana) 前面笔记有 2.什么是 Filebeat Filebeat 是 ELK 组件的新成员&#xff0c; 也是 Beat 成员之一。基于 Go 语言开发&#xff0c;无任何依赖并且比 Logstash 更加轻量&#xff0c;不会带来过高的资源占用&#xff0c; …

Mysql-窗口函数二

文章目录 1. 前百分之N的问题 排名 row_number1.1 需求1.2 准备工作1.3 分析1.4 实现 2. 前百分之N的问题 ntile2.1 介绍2.2 语法2.2.1 示例2.2.2 结果示例2.2.3 注意事项 2.3 需求2.4 分析2.5 实现 3. 前百分之N的问题 百分比 PERCENT_RANK3.1 语法3.1.1 示例3.1.2 注意事项 3…

QT: QVerticalLayout 如何根据 index 获得对应的 widget?

在Qt中&#xff0c;QVBoxLayout&#xff08;或者更一般地&#xff0c;QLayout类及其子类&#xff09;并没有直接提供通过索引来访问布局中widgets的API。这是因为QLayout主要是负责管理widgets的排列和大小调整&#xff0c;而不直接存储widgets的列表。widgets的添加和管理是通…