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度更高。

#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();
	}
		
}



51单片机LCD1602显示屏汇编语言是一种汇编语言,用于控制51单片机上的LCD1602显示屏。常用的命令包括清屏、写入字符、移动光标等。以下是一个简单的例子: ``` mov A, #0A0H ;设置行地址为第二行 mov R1, #80H ;设置列地址为第一列 mov R2, #'H' ;将字符'H'存储到寄存器R2中 acall write_lcd ;调用write_lcd函数写入字符 ;清屏函数 clear_lcd: mov A, #01H ;将清屏命令存储到寄存器A中 acall write_cmd ;调用write_cmd函数写入命令 ret ;写入字符函数 write_lcd: acall set_addr ;设置显示地址为当前行列 mov A, R2 ;将要显示的字符存储到寄存器A中 acall write_data ;调用write_data函数写入字符 ret ;设置显示地址函数 set_addr: mov A, R1 ;将列地址存储到寄存器A中 acall write_cmd ;调用write_cmd函数写入命令 mov A, #0B8H ;设置行地址的高4位 orl A, R0 ;将行地址的低4位与高4位合并 acall write_cmd ;调用write_cmd函数写入命令 ret ;写入命令函数 write_cmd: clr RS ;将RS引脚置低,表示写入命令 acall delay ;延时一段时间,确保LCD稳定 mov P1, A ;将命令存储到P1口输出到LCD set EN ;将EN引脚置高,表示执行命令 acall delay ;延时一段时间,确保LCD稳定 clr EN ;将EN引脚置低,表示执行完毕 ret ;写入数据函数 write_data: set RS ;将RS引脚置高,表示写入数据 acall delay ;延时一段时间,确保LCD稳定 mov P1, A ;将数据存储到P1口输出到LCD set EN ;将EN引脚置高,表示执行数据写入 acall delay ;延时一段时间,确保LCD稳定 clr EN ;将EN引脚置低,表示执行完毕 ret ;延时函数 delay: mov R6, #50H delay_1: djnz R6, delay_1 ret ``` 以上是一个简单的51单片机LCD1602显示屏汇编语言程序,实现了清屏和写入字符的功能。在实际开发中,还需要根据具体需求进行功能扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值