前言
具有测距、温度补充、实时时钟、记忆、阈值警报、串口数据发送等等功能,通过LCD1602显示,按键进行相关操作。
一、功能描述
LCD1602显示共有五个界面,按键一用于切换显示界面。
一、界面一
此界面测距为连续测距模式,LCD1602不间断刷新测量距离和温度,一旦测量距离小于设置的阈值,单片机将会发出警报。此界面按下按键4可进入与上位机连接状态,当上位机发送1至单片机后,mcu立刻将测量数据发送至上位机。
二、界面二
此界面为阈值设置界面,按键二用于改变设置位(上限还是下限),设置位会闪烁显示,以此提示。按键三四用于加减。
三、界面三
此界面测距为单次测距模式,按键二按下测量一次,按键三按下则将当前测量距离和测量时间(如23:59:45时测量距离为45cm)保存到EEPROM里面,最多可以记录十次,第十一次将会覆盖第一次数据。
四、界面四
此界面测距为回放模式,按下按键二三切换回放序号,LCD1602会显示在界面三时记录的距离和测量时间。
五、初始界面
上电后,LCD1602会显示DS1302的初始时间设置,此时需要通过按键二三四进行时间设置。设置完成后,按下按键一,系统进入界面一,开始工作。
二、编程实现
核心代码main.c如下:
#include "main.h"
typedef unsigned char u8;
#define outputp0(y,x) P0=x,P2&=0x1f,P2=y,P2&=0x1f;
u8 keynum=0,show_page=0,distance_set_flag=0,save_times=1,set_time_flag=0,save_distance_addr=0x04;
int distance_h=350,distance_l=6,LCD_showflag=0;
u8 distance_limit[4]={
0};
float temper=0;
void main_Delay1ms(int t) //@11.0592MHz
{
unsigned char data i, j;
while(t--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void work_key()
{
if(keynum)
{
if(keynum==1)
{
show_page++;
show_page%=4;
if(show_page==0)
{
TR0=0;
temper=rd_temper();
TR0=1;
work_ultra();
LCD_ShowString(1,1,"Distance: . CM");
LCD_ShowString(2,1,"Temper: . C ");
}
else if(show_page==1)
{
outputp0(0xa0,0x00);
distance_set_flag=0;LCD_showflag=0;
LCD_ShowString(1,1,"High: CM ");
LCD_ShowString(2,1,"Low: CM ");
}
else if(show_page==2)
{
LCD_ShowString(1,1,"Distance: . CM");
LCD_ShowString(2,1,"Time: - - ");
}
else if(show_page==3)
{
save_distance_addr=0x04;save_times=1;
LCD_ShowString(1,1,"Save_Dis: . CM");
LCD_ShowString(2,1,"Time: - - ");
TR0=0;
at24c02_read_multi(read_time,save_distance_addr,3);
distance=at24c02_read(save_distance_addr+3)*256+at24c02_read(save_distance_addr+4);
TR0=1;
}
}
else if(keynum==2)
{
if(show_page==1)
distance_set_flag=!distance_set_flag;
else if(show_page==2)
{
TR0=0;
temper=rd_temper();
TR0=1;
work_ultra();
}
else if(show_page==3)
{
if(save_distance_addr<=48