#include "lcd.h"
// 正常读写操作之前检测LCD控制器状态
// 读状态时序:RS=0,RW=1,E=1,判断忙完毕后释放总线
void WaitIdle()
{
unsigned char tmp;
RS=0; // 命令
RW=1; // 读取
DPORT=0xff; // 为接收数据作准备
delay2us(); // 短暂延时
E=1; // 使能LCD1602
delay2us(); // LCD1602在E为高电平区间输出数据到端口
for(;;)
{
tmp=DPORT; // 将数据端口上的值赋给tmp
tmp&=0x80; // 最高位为1时表示液晶模块正忙,不能对其进行操作
if( tmp==0) // 其余6位表示内部当前显示地址,无实际用途。
break;
}
E=0; // 释放总线
}
// 向LCD1602液晶写入一字节数据,dat-待写入数据值
// 写数据时序:RS=1,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。
void lcd1602WriteByte(unsigned char dat)
{
// WaitIdle(); // 等待LCD1602空闲
delayNms(5);
RS=1; // 数据
RW=0; // 写
E=1; // 使能LCD1602
DPORT=dat; // 将待写数据送到数据端口
delay10us(); // 短暂延时
E=0; // 关闭LCD1602使能,释放总线
}
// 向LCD1602液晶写入一字节命令,cmd-待写入命令值
// 写命令时序:RS=0,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。
void lcd1602WriteCmd(unsigned char cmd)
{
// WaitIdle(); // 等待LCD1602空闲
delayNms(5);
RS=0; // 命令
RW=0; // 写
E=1; // 使能LCD1602
DPORT=cmd; // 将命令码输出在数据端口上
delay10us(); // 短暂延时
E=0; // 关闭LCD1602使能,释放总线
}
// 清屏命令:清除显示内容,将1602内部RAM全部填入空白的ASCII码20H
// 光标归位,将光标撤回到屏幕左上角的坐标原点
// 将1602内部显示地址设为0
void lcd1602Clear()
{
lcd1602WriteCmd(0x01);
delayNms(50);
}
// 内部函数用于设置显示字符起始坐标
void lcd1602WritePos(unsigned char xPos,unsigned char yPos)
{
unsigned char tmp;
xPos&=0x1f; // x位置范围是0~15
// yPos&=0x10; // y位置范围是0~1
if(yPos==0){ // 显示第一行
tmp=xPos; // 第一行字符地址从 0x00 开始
tmp|=0x80; // 设置 RAM 地址
}
else if(yPos==1){
tmp=xPos+0x40; // 第二行字符地址从 0x40 开始
tmp|=0x80; // 设置 RAM 地址
}
else if(yPos==2){
tmp=xPos; // 第三行字符地址从 0x40 开始
tmp|=0x90; // 设置 RAM 地址
}
else if(yPos==3){
tmp=xPos+0x40; // 第四行字符地址从 0x40 开始
tmp|=0x90; // 设置 RAM 地址
}
lcd1602WriteCmd(tmp);
}
void lcd1602SetCursor(unsigned char Para) // 设置光标
{
switch(Para)
{
case 0:
{
lcd1602WriteCmd(0x08); break; // 关显示
}
case 1:
{
lcd1602WriteCmd(0x0c); break; // 开显示但无光标
}
case 2:
{
lcd1602WriteCmd(0x0e); break; // 开显示有光标但不闪烁
}
case 3:
{
lcd1602WriteCmd(0x0f); break; // 开显示有光标且闪烁
}
default:
break;
}
}
//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符
void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat)
{
lcd1602WritePos(xPos,yPos);
lcd1602WriteByte(Dat);
}
// 在液晶上显示字符串,xpos:行坐标,ypos:列坐标,str-字符串指针
void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s)
{
unsigned char i=0;
lcd1602WritePos(xPos,yPos); // 起始坐标
while(s[i])
{
lcd1602WriteByte(s[i]);
i++;
if (i>=32) break; // 超出16个字符外的数据丢弃
}
}
// LCD 1602初始化
void lcd1602Init()
{
lcd1602WriteCmd(0x38); /*显示模式设置*/
delayNms(5);
lcd1602WriteCmd(0x38);
lcd1602WriteCmd(0x08); // 显示关闭,不显示光标、光标不闪烁
lcd1602WriteCmd(0x01); // 显示清屏
lcd1602WriteCmd(0x06); // 显示光标移动位置
delayNms(5);
lcd1602WriteCmd(0x0c); // 显示开及光标设置
lcd1602Clear();
}
毕业设计(烟雾报警器)
需积分: 0 131 浏览量
更新于2023-11-07
2
收藏 25.78MB ZIP 举报
这份资料适用于有关单片机设计的毕业设计,可以给毕业设计提供思路
主要功能:通过烟雾传感器MQ-2模块对厨房内的危险气体进行不间断的检测,再通过ADC0832双通道转换电路将MQ-2所检测出的天然气与CO浓度值转化为电信号传输到核心处理芯片,通过核心处理芯片STC89C52单片机对数据进行处理,并且将其监测到的温度和烟雾浓度通过LCD1602液晶显示屏幕进行显示。预设的可燃气体浓度超过预设值时,于是LED灯开始闪烁和蜂鸣报警器开始报警;假如未超过预设的临界值,则安全装置继续正常工作;。与此同时,以上两种情况LED显示模块都将正常显示CO浓度和天然气浓度。
本次设计利用四个按键s2~s5,用于控制烟雾和天然气的阈值增减,按键的一端分别连接P1.0~P1.3端口,另外一端连接着地,当按键s2按下时烟雾阈值增加;当s3按下时烟雾阈值减少;当s4按下时天然气阈值增加;当s5按下时天然气阈值减少,分别与之对应将单片机的P1.0~P1.3端口电平拉低,单片机检测到电平拉低则认为按键按下。
分模块设计了整体系统的硬件,包括主控、传感器、显示、蜂鸣器以及按键模块,根据元器件的性能,合理的设计了驱动电路。
漫漫长夜想学习
- 粉丝: 311
- 资源: 1
最新资源
- SBT 226-2007 食品机械通用技术条件 焊接、铆接件技术要求.pdf
- SBT 10148.6-1993 粮油加工机械通用技术条件 焊接件.pdf
- SHJ 509-1988 石油化工工程焊接工艺评定.pdf
- SH 3525-1992 石油化工低温钢焊接规程(附条文说明).pdf
- SDCV0041-2002 钢结构焊接节点.pdf
- SHJ 520-1991 石油化工工程铬钼耐热钢管道焊接技术规程(现编号SH3520-91).pdf
- SHS 01012-2004 常压立式圆筒形钢制焊接储罐维护检修规程.pdf
- 基于RFID的物联网STM32单片机图书档案管理系统源码(高分毕业设计)
- 在Debian上安装Docker Engine.pdf
- 岚精灵课程预约系统(教师端+学院端)
- 齿环研磨机sw16可编辑全套技术开发资料100%好用.zip
- 大卡车头模型step全套技术开发资料100%好用.zip
- c语言文件读写操作代码.txt
- ysaggxgzvhgvzshvhgvahg
- c语言文件读写操作代码.txt
- c语言文件读写操作代码.txt