LCD1602简述
LCD1602 (LiquidCrystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其他的一些内置特殊符号,还可以有8个自定义字符。显示容量:16X2个字符,每个字符为5*7点阵
引脚接线
内部结构单元
存储器结构
DDARM数据显示区
CGRAM+CGROM(字模库)
时序结构
RS:设置指令/数据,数据-高,指令-低
R/W :读写,写-高,读-低,E: 使能高电平有效
DB0-DB7:数据
LCD1602显示字符、字符串、数字的代码
#include <REG52.H>
#include "LCD1602.h"
#include <INTRINS.H>
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E = P2^7;
#define LCD_DataPort P0
void LCD_Delay() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
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(); //初始化
}
//LCD显示屏初始化
void LCD_Init()
{
LCD_WriteCommand(0x38); //配置八位数据接口
LCD_WriteCommand(0x0c); //显示开,光标关,闪烁开
LCD_WriteCommand(0x06); //光标+1,画面不动
LCD_WriteCommand(0x01); //清屏
}
//设置光标
void LCD_SetCursor(unsigned char Line,unsigned char Colmu)
{
if(Line == 1)
{
LCD_WriteCommand(0x80 | (Colmu-1));
}
else
{
LCD_WriteCommand(0x80 | (Colmu-1) + 0x40);
}
}
//显示字符函数
void LCD_ShowChar(unsigned char Line,unsigned char Colmu,unsigned char Char)
{
LCD_SetCursor(Line,Colmu);
LCD_WriteData(Char);
}
//显示字符串函数
void LCD_ShowString(unsigned char Line,unsigned char Colmu,unsigned char *String)
{
unsigned char i;
LCD_SetCursor(Line,Colmu);
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;
}
//显示数字函数
void LCD_ShowNumber(unsigned char Line,unsigned char Colmu,unsigned int Number,unsigned int Length)
{
unsigned int i;
LCD_SetCursor(Line,Colmu);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
}
}
温湿度传感器时序代码
dht11.c
#include <REG52.H>
#include "DHT11.h"
#include "delay.h"
sbit Temp_data = P2^0;
unsigned int rec_dat[5];
//接收一个字节函数
unsigned char DHT11_rec_byte()
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
while(!Temp_data);//等待DHT11高电平
Delay30us();//延时30us,如果还是高电平则DHT11输出1
dat<<=1;
if(Temp_data==1)
{
dat|=0x01;
}
while(Temp_data);//等待DHT11低电平
}
return dat;
}
//接收温湿度数据
void DHT11_receive()
{
unsigned char R_H,R_L,T_H,T_L,revise;
//起始信号
Temp_data = 1;//高电平维持一小段时间
Delay30us();//维持30us
Temp_data = 0;//主机拉低总线电平至少18ms
Delay20ms();//给了20ms
Temp_data = 1;
Delay30us();
Temp_data=1;//拉高电平
if(Temp_data==0)//判断DHT11是否响应
{
while(Temp_data == 0);//等待从机80us低电平响应信号过去
while(Temp_data == 1);//等待从机80us高电平信号过去
R_H = DHT11_rec_byte();//接收湿度高八位
R_L = DHT11_rec_byte();//接收湿度低八位
T_H = DHT11_rec_byte();//接收温度高八位
T_L = DHT11_rec_byte();//接收温度低八位
revise = DHT11_rec_byte(); //接收校验位
Temp_data = 0;
delay55us();
Temp_data = 1;
if((R_H+R_L+T_H+T_L) == revise)//判断接收数据是否准确
{
rec_dat[0] = R_H;
rec_dat[1] = R_L;
rec_dat[2] = T_H;
rec_dat[3] = T_L;
rec_dat[4] = revise;
}
}
}
main.c
extern unsigned int rec_dat[4];
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Humi:");
LCD_ShowString(2,1,"Temp:");
while(1)
{
delay1s();
DHT11_receive();
//显示温度
LCD_WriteCommand(0x85);
LCD_WriteData(rec_dat[0]/10 + 0x30);//显示温度整数部分十位,并+0x30转换成ASCLL码
LCD_WriteCommand(0x86);
LCD_WriteData(rec_dat[0]%10 + 0x30);//显示温度整数部分个位,并+0x30转换成ASCLL码
LCD_WriteCommand(0x87);
LCD_WriteData('.');
LCD_WriteCommand(0x88);
LCD_WriteData(rec_dat[1]/10 + 0x30);
LCD_WriteCommand(0x89);
LCD_WriteData('%');
//显示湿度
LCD_WriteCommand(0xC5);
LCD_WriteData(rec_dat[2]/10 + 0x30);
LCD_WriteCommand(0xC6);
LCD_WriteData(rec_dat[2]%10 + 0x30);
LCD_WriteCommand(0xc7);
LCD_WriteData('.');
LCD_WriteCommand(0xC8);
LCD_WriteData(rec_dat[3]/10 + 0x30);
LCD_WriteCommand(0xC9);
LCD_WriteData(0xDF); //¶È
LCD_WriteCommand(0xca);
LCD_WriteData('C');
}
}