51单片机-LCD1602显示屏

简介

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

能够同时显示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();
	}
		
}
相关推荐
嵌新程2 小时前
day06(单片机高级)PCB设计
单片机·嵌入式硬件·pcb
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
wenchm7 小时前
细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的另一种方法
stm32·单片机·嵌入式硬件
编码追梦人8 小时前
如何实现单片机的安全启动和安全固件更新
单片机
电子工程师UP学堂8 小时前
电子应用设计方案-16:智能闹钟系统方案设计
单片机·嵌入式硬件
飞凌嵌入式8 小时前
飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
人工智能·嵌入式硬件·嵌入式·risc-v·飞凌嵌入式
blessing。。10 小时前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
嵌新程11 小时前
day03(单片机高级)RTOS
stm32·单片机·嵌入式硬件·freertos·rtos·u575
Lin20123011 小时前
STM32 Keil5 attribute 关键字的用法
stm32·单片机·嵌入式硬件
电工小王(全国可飞)12 小时前
STM32 RAM在Memory Map中被分为3个区域
stm32·单片机·嵌入式硬件