简介
是一个液晶显示屏,通过电压对显示区域进行控制,有电就显示。
能够同时显示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度更高。
cpp
#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();
}
}