📄 main.c
字号:
#include <reg52.h>
#include"ds18b20.h"
#include"DS1302.h"
#include"TG12864P.h"
#include"beep.h"
#include"key.h"
#include"led.h"
#include"keyboard.h"
#include"delay.h"
unsigned char(* bmp[4])[256]={ &bmp0,&bmp1,&bmp2,&bmp3}; //图片指针
/******************************************************************
操作系统主框架
系统全局变量声明区:
menu 系统菜单指针
fun 系统功能函数指针
*************************************************************************/
unsigned char menu=0;
unsigned char fun1=0,fun2=0,
clock_flag=0; //闹钟开关的标志位
unsigned char test=0; //tsst
unsigned char * print[]={0,0,0,0,0,0,0} ;
extern unsigned char hour_sound, //闹钟 时
minute_sound, //闹钟 秒
zhengshu;
/******************************************************************
系统初始话函数
包括全部模块的初始化函数
*******************************************************************/
void init_system()
{
Reset_18B20();
LcmInit();
init_1302();
init_keyboard();
init_1302();
Time0_Init();
}
/******************************************************************
接着是主函数与各个模块的联动函数
*******************************************************************/
/*****************************************************************
12864与键盘联动函数
在12864上显示键盘输入的字符
按下esc 或者win 建就
要求操作者选择是否保存输入的
文本。
然后
返回主界面
*****************************************************************/
void screen()
{
uchar t=0,
temp=0,
pos=0, //记录输入光标位置 ,输入一个字母或数字,光标加一
cap=0,
flag=0;
PutStr(0,2,"请选择");//按下推出建: esc 或win 后
PutStr(1,0,"1 输入文本");
PutStr(2,0,"2 打开文本");
while(1)
{
led_display(test);
temp=sp2key_scan();
if(temp!=255)
{
test=temp;
LcmClearTXT();
t=temp;
temp=key_table[t];
if(temp=='1')flag=1;
if(temp=='2')flag=2;
led_display(t); //数码管显示
if(!flag)
{
PutStr(1,1,"输入错误!");
delayms(700);
LcmClearTXT();
PutStr(0,2,"请选择");//按下推出建: esc 或win 后
PutStr(1,0,"1 输入文本");
PutStr(2,0,"2 打开文本");
}
if(flag)
{
if(flag==1) break;
else
{ //读取24c256中的文本
while(1)
{
temp=sp2key_scan();
if(temp!=255) //按下任意建推出
{
break;
flag=3;
}
if(flag==3)break;
}
}
}
}
}
LcmClearTXT();
while(1)
{
temp=sp2key_scan();
if(temp!=255)
{
t=temp;
if(t<48) //输入为字母或其他符号
{
if(pos==64)
{
pos=0;
LcmClearTXT();
}
if(t==47) //删除
{
if(pos)
{
Lcm_clear_char(pos);
if((pos%2))pos-=1;
if(pos)pos--;
}
}
else
{
temp=key_table[t];
if(t>9&&t<36)temp-=cap*32;//根据cap 令显示为大写或小写
input(temp,pos);
pos++;
}
}
if(t==48)//换行
{
if(pos<48)
{
pos+=16;
Location_xy_12864(pos/16,(pos%16)/2);
}
else
{
LcmClearTXT();
pos=0;
}
}
if(t==49)cap=!cap;//cap:大小写转换
if(t==51||t==52) //按下推出建: esc 或win 后
break;
}
led_display(t);
}
LcmClearTXT();
PutStr(0,2,"save ?");
PutStr(1,0,"y save");
PutStr(2,0,"n no");
while(1)
{
temp=sp2key_scan();
if(temp!=255)
{
LcmClearTXT();
t=temp;
temp=key_table[t];
if(temp=='y'||temp=='Y')
{
LcmClearTXT();
PutStr(1,2,"saving....");
delayms(500);
PutStr(2,2,"please wait..");
//write_24c256(unsigned char *Data,unsigned char length,unsigned int add)
delayms(1000);
LcmClearTXT();
return;
}
if(temp=='n'||temp=='N')return;
led_display(t); //数码管显示
LcmClearTXT();
PutStr(1,1,"输入错误!");
delayms(800);
LcmClearTXT();
PutStr(0,0,"save"); //按下推出建: esc 或win 后
PutStr(1,0,"y save");
PutStr(2,0,"n no");
}
}
}
/**************************************************************************
系统菜单选择函数
***************************************************************************/
void menu_select()
{
unsigned char key=0,temp1=0,temp2=0;
temp1=getch();
temp2=sp2key_scan();
if(temp1!=255)
{
switch (temp1) //清除选中状态
{
case 12: PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu++;break;
case 13: fun1=menu+1;break; //进入功能函数
case 14:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu--;break;
case 15:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu+=2;break;
}
menu=menu%4;
PutBMP2(menu*4+1,0,5, 32,bmp[menu],0); //将选中的功能函数反白
beeping(12,20);
}
if(temp2!=255)
{
switch(temp2)
{
case 8:
case 2:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu+=2;break;
case 6:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu++;break;
case 4:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu--;break;
case 48: fun1=menu+1;break;
}
menu=menu%4;
PutBMP2(menu*4+1,0,5, 32,bmp[menu],0);//将选中的功能函数反白
test=temp2;
beeping(12,20);
}
led_display(test);
}
/*****************************************************************
从键盘中获取二位数
******************************************************************/
unsigned char get_num()
{
unsigned char q=0,temp=0,key2=0;
Location_xy_12864(2,2);
while(1)
{
key2=sp2key_scan();
if(key2<10)
{
q++;
if(q==1)temp+=key2*10;
if(q==2)temp+=key2;
input(key_table[key2],q);
beeping(12,20);
delayms(100);
if(q==2)break;
}
}
return temp;
}
/*************************************************************
时钟服务函数
包括:修改时间
定闹钟
开闹钟
关闹钟
*************************************************************/
void clockser()
{
unsigned char key2=255,i=0,q=0,print[7];
LcmClearTXT();
PutStr(0,2,"service:");
PutStr(1,0,"1.adjust timer");
PutStr(2,0,"2.set ring");
while(1)
{
key2=sp2key_scan();
if(key2!=255)
{
if(key_table[key2]=='1')
{
LcmClearTXT();
PutStr(0,0,"hour");
do
{
print[2]=get_num();
}while(print[2]>24);
LcmClearBMP();
LcmClearTXT();
PutStr(0,0,"min");
do
{
print[1]=get_num();
}while(print[1]>60);
LcmClearBMP();
LcmClearTXT();
PutStr(0,0,"month");
do
{
print[4]=get_num();
}while(print[4]>12);
LcmClearBMP();
LcmClearTXT();
PutStr(0,0,"day");
do
{
print[3]=get_num();
}while(print[3]>24);
LcmClearBMP();
LcmClearTXT();
PutStr(0,0,"year");
do
{
print[6]=get_num();
}while(print[7]>99);
LcmClearBMP();
LcmClearTXT();
v_BurstW1302T(print);
LcmClearBMP();
return;
}
if(key2==2)
{
LcmClearTXT();
PutStr(0,0,"1.adjust ring");
PutStr(1,0,"2.open ring");
PutStr(2,0,"3.close ring");
while(1)
{
key2=sp2key_scan();
if(key2!=255)
{
if(key_table[key2]=='1')
{
LcmClearTXT();
PutStr(0,0,"hour:");
do
{
print[2]=get_num();
}while(print[2]>24);
LcmClearTXT();
PutStr(0,0,"min:");
do
{
print[1]=get_num();
}while(print[1]>60);
hour_sound=print[2];
minute_sound=print[1];
clock_flag=1;
LcmClearTXT();
LcmClearBMP();
return;
}
if(key_table[key2]=='2')
{
clock_flag=1;
LcmClearTXT();
PutStr(1,0,"ring opened");
delayms(1600);
LcmClearBMP();
LcmClearTXT();
return;
}
if(key_table[key2]=='3')
{
clock_flag=0;
LcmClearTXT();
PutStr(1,0,"ring closed");
delayms(1500);
LcmClearBMP();
LcmClearTXT();
return;
}
}
}
}
}
}
}
/**************************************************************
ring 闹钟检测
*****************************************************************/
void ring()
{
if(clock_flag)
{
if(reach_time())
{
Play_Song();
clock_flag=0;
}
}
}
/********************************************************************
温度报警函数
**********************************************************************/
void warning()
{
Read_18B20() ;
if(zhengshu>temp_h||zhengshu<temp_l)
{
while(1)
{
beep=!beep;
delayms(500);
if(getch()!=255)break;
}
play_respond();
}
}
/**********************************************************
温度服务函数
查看温度
设置温度上限
设置温度下限
激活温度报警功能
*********************************************************/
void temp_serve()
{
unsigned char key2=255;
LcmClearTXT();
PutStr(0,2,"service:");
PutStr(1,0,"1.open warner");
PutStr(2,0,"2.close warner");
PutStr(3,0,"3.set temperate");
while(1)
{
key2=sp2key_scan();
if(key2!=255)
{
if(key2==1)
{ LcmClearTXT();
PutStr(1,0,"warner opened");
delayms(1600);
LcmClearTXT();
return;
}
if(key2==2)
{
PutStr(1,0,"warner closed");
delayms(1600);
LcmClearTXT();
return;
}
if(key2==3)
{
LcmClearTXT();
PutStr(0,0,"the highesst");
temp_h=get_num();
LcmClearTXT();
PutStr(0,0,"the highesst:");
put_num(2,3,temp_h);
delayms(1500);
LcmClearTXT();
PutStr(0,0,"the lowest");
temp_h=get_num();
LcmClearTXT();
PutStr(0,0,"the lowest");
put_num(2,3,temp_l);
delayms(1500);
LcmClearTXT();
return;
}
}
}
}
void main()
{
unsigned char i=0,
key1=255,
key2=255,
temp[2]={1,2};
unsigned int dela=0;
init_system();
delayms(100);
PutStr(1,2,"loading...");
delayms(10000);
LcmClearTXT();
for(i=0;i<4;i++)PutBMP2(1+i*4,0,5, 32,bmp[i],1);
while(1)
{
menu_select();
ring(); //闹钟
warning(); //温度报警
if(!fun2)
{
LcmClearBMP();
LcmClearTXT();
for(i=0;i<4;i++)PutBMP2(1+i*4,0,5, 32,bmp[i],1);
fun2=255;
}
switch(fun1)
{
case 1: LcmClearBMP(); fun2=fun1;fun1=0;break;
case 2:
{
LcmClearBMP();
v_BurstR1302T(print);
showtime(print);
dela=0;
fun2=fun1;
fun1=0;
break;
}
case 3:
LcmClearBMP();
PutBMP2(1+2*4,0,5, 32,bmp[2],1);
PutStr(1,2,"playing");
fun2=3;
fun1=0;
break;
case 4:
LcmClearBMP();
fun2=4;fun1=0;
put_num(1,1,zhengshu);
PutStr (1,4,"C");
break;
}
switch(fun2)
{
case 1: //文本输入 功能
{
key1=getch();
key2=sp2key_scan();
screen();
fun2=0;
break;
}
case 2:
key1=getch();
key2=sp2key_scan();
dela++;
if(dela>20)
{
v_BurstR1302T(print);
showtime(print);
dela=0;
}
ring();
if(key2!=255)
{
if(key2==48)
{
clockser();
LcmClearBMP();
}
if(key2==51||key2==52)
fun2=0;
}
break;
case 3:
{
Play_Song();
fun2=0;
break;
}
case 4:
dela++;
if(dela>40)
{
Read_18B20();
put_num(1,1,zhengshu);
PutStr (1,4,"C");
dela=0;
}
key2=sp2key_scan();
if(key2!=255)
{
if(key2==48)temp_serve();
if(key2==51||key2==52)
fun2=0;
}
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -