📄 main.c
字号:
//-----------------------------------------------------------------------
//Copyright (c) 2006
//Author: Wang Meng.
//Version: V1.0.
//Date: 2006.9.13.
//Description:
// LCD-----------P1(数据口)、P3.3、P3.4、P3.5(控制口)
// DS12887-------P0(数据口)、P2.6(片选)
// WAVE----------P2.4(发波)、P3.2(收波)
// DS18B20-------P2.3(数据口)
// KEY-----------P2.0(K2)、P2.1(K1)、P2.5(K3)、P2.7(K4)
//-------------------------------------------------------------------------
//头文件包含-----------------------------------------------------
#include<LCD.H>
#include<12887.H>
#include<DS18B20.H>
#include<WAVE.H>
#include<reg51.h>
//全局变量--------------------------------------------------------------
bit Ex0Flag=0; //外部中断标志
bit AlarmFlag=0; //定时中断标志
idata unsigned char Key=0; //键值
idata unsigned char CurIndex=0; //主菜单标号
idata unsigned char DisBuf; //距离变量
idata unsigned char TempBuf; //温度变量
idata unsigned char DateBuf[6]={6,9,7,4,2,0}; //时间日期变量
idata unsigned char AlarmBuf[3]={0}; //定时时间变量
idata unsigned char DateTbl[6]={2,6,10,0,4,8}; //时间在字符串中的位置
idata char Date[]="2006年09月08日"; //日期显示缓冲区
idata char Time[]="00:00:00"; //时间显示缓冲区
idata char Dis[]="测试距离:000mm"; //距离显示缓冲区
idata char Temp[]="温度:00^C"; //温度显示缓冲区
//系统函数声明--------------------------------------------------------
void FstGrap(void); //显示开机画面函数
void ShowTime(void); //显示时间函数
void ShowDate(void); //显示日期函数
void ShowDis(void); //显示距离函数
void ShowTemp(void); //显示温度函数
void ShowDis(void); //显示距离函数
void SetDate(void); //设置时间日期函数
void SetClk(void); //设置定时时间函数
unsigned char ReadKey(void); //按键扫描函数
void delay1(unsigned int t); //延时函数
struct MENU{ //菜单结构体
char code *name; //菜单的名字
void (*Fun)(void);} //对应的函数指针
Menu[]={ //菜单结构体数组初始化
{"显示时间",ShowTime},
{"显示日期",ShowDate},
{"显示温度",ShowTemp},
{"检测距离",ShowDis},
{"设置时间日期",SetDate},
{"设置定时时间",SetClk}};
//主函数----------------------------------------------------------------
main()
{
unsigned char i;
entry:
Lcd_init(); //系统初始化函数
DS12887_init();
Clr_grap();Scr_clr();
delay1(5000);
FstGrap();
do{Key=ReadKey();}
while(Key==0);
Clr_grap();
Scr_clr();
while(1)
{
if(Key!=0) //如果有间按下则进行相应的处理
{
switch(Key) //按键处理程序
{
case 1: //确定键,执行相应的函数
Menu[CurIndex].Fun();
break;
case 2: //光标上移
if(CurIndex++==5)
CurIndex=0;
break;
case 3: //光标下移
if(CurIndex--==0)
CurIndex=5;
break;
case 4: //取消键,返回
goto entry;
break;
}
Scr_clr(); //重新绘制显示界面
Set_addr(1,2);
if(CurIndex<4) //绘制前四个菜单
{
for(i=0;i<4;i++)
{
Set_addr(i+1,2);
Write_str(Menu[i].name);
}
Set_addr(CurIndex+1,1); //绘制光标
Write_char(62);
}
else
{
Set_addr(1,2); //绘制后两个菜单
Write_str(Menu[4].name);
Set_addr(2,2);
Write_str(Menu[5].name);
Set_addr((CurIndex+1)%4,1); //绘制光标
Write_char(62);
}
}
Key=ReadKey();
if(AlarmFlag) //如果闹铃开了,检测定时时间是否到了
{
Read_12887(DateBuf);
if((AlarmBuf[0]==DateBuf[3])&&(AlarmBuf[1]==DateBuf[4])&&(AlarmBuf[2]==DateBuf[5]))
{
Scr_clr();
delay1(5000);
Set_addr(2,2);
Write_str("定时时间到了");
do{Key=ReadKey();}
while(Key==0);
Key=2;
}
}
}
}
//中断函数-------------------------------------------------------
void extern0_ISR() interrupt 0
{
EX0=0;TR0=0;//WAV=0;
Ex0Flag=1;
}
//-----------------------------------底层函数声明--------------------------------------------------
//---------------------------------
//函数:void delay1(unsigned int t)
//声名:延时函数
//参数:延长时间
//---------------------------------
void delay1(unsigned int t)
{
while(--t);
}
//--------------------------------
//函数:char* itoa(unsigned char c)
//功能:将数值转换成两位字符串
//参数:数值
//返回:字符串
//-------------------------------
char* itoa(unsigned char c)
{
char str1[2];
str1[0]=c/10+48;
str1[1]=c%10+48;
return(str1);
}
//------------------------------------------------
//函数:void ProcAlarm(void)
//功能:将定时时间添加到显示缓冲区字符中
//------------------------------------------------
void ProcAlarm(void)
{
char *a;
a=itoa(AlarmBuf[0]); //时
Time[DateTbl[3]]=a[0];Time[DateTbl[3]+1]=a[1];
a=itoa(AlarmBuf[1]); //分
Time[DateTbl[4]]=a[0];Time[DateTbl[4]+1]=a[1];
a=itoa(AlarmBuf[2]); //秒
Time[DateTbl[5]]=a[0];Time[DateTbl[5]+1]=a[1];
}
//---------------------------------------------------
//函数:void ProcTime(void)
//功能:将时间添加到显示缓冲区字符中
//---------------------------------------------------
void ProcTime(void)
{
char *a;
a=itoa(DateBuf[3]); //时
Time[DateTbl[3]]=a[0];Time[DateTbl[3]+1]=a[1];
a=itoa(DateBuf[4]); //分
Time[DateTbl[4]]=a[0];Time[DateTbl[4]+1]=a[1];
a=itoa(DateBuf[5]); //秒
Time[DateTbl[5]]=a[0];Time[DateTbl[5]+1]=a[1];
}
//----------------------------------------------------
//函数:void ProcDate(void)
//功能:将日期添加到显示缓冲区字符中
//----------------------------------------------------
void ProcDate(void)
{
char *a;
a=itoa(DateBuf[0]); //年
Date[DateTbl[0]]=a[0];Date[DateTbl[0]+1]=a[1];
a=itoa(DateBuf[1]); //月
Date[DateTbl[1]]=a[0];Date[DateTbl[1]+1]=a[1];
a=itoa(DateBuf[2]); //日
Date[DateTbl[2]]=a[0];Date[DateTbl[2]+1]=a[1];
}
//---------------------------------被主函数调用的函数定义--------------------------------------
//---------------------------------------------
//函数:unsigned char ReadKey(void)
//功能:按键扫描程序
//返回:返回按键值
//---------------------------------------------
unsigned char ReadKey(void)
{
unsigned char KeyValue,a,i;
char code keytbl[]={0x02,0x01,0x20,0x80};
P2=P2|0xa3;
KeyValue=P2;
KeyValue=~KeyValue;
KeyValue=KeyValue&0xa3;
if(!KeyValue) return(0);
delay1(1000);
P2=P2|0xa3;
KeyValue=P2;
KeyValue=~KeyValue;
KeyValue=KeyValue&0xa3;
if(!KeyValue) return(0);
do{a=P2|~0xa3;}
while(a!=0xff);
for(i=0;i<4;i++)
if(KeyValue==keytbl[i])
return(i+1);
}
//------------------------------------------------------------
//函数:void ShowTime(void)
//功能:在液晶上显示时间
//------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -