#include //头文件
#include //这是模块化处理函数,里面包含一些年份处理函数和温度部分
#include
#define uint unsigned int
#define uchar unsigned char
***it jia=P2^5;//设置时间和闹铃时 加数据
***it jian=P2^4;//设置时间和闹铃时 减数据
***it lcdrs=P2^7;//LCD数据命令选择端
***it lcden=P2^6;//LCD使能端
***it setsj=P2^0;//设置时间 按照次数 调整光标闪到的对应数据
***it setnl=P2^2;//设置闹铃 按照次数 调整光标闪到的对应数据
***it knl=P2^3;//按一次开闹铃,按2次关闹铃
***it wd=P2^1;//查看温度
***it fm=P3^6;//蜂鸣器端口
bit sjjianflag,nljianflag; //时间标志位,闹铃标志位
uint nian=2014;//年应为4位,必需是无符号整形
uchar t1,t2,l***,m***,wdnum,sj,nlflag,ri=26,yue=5,xq=1,hwnum;
uchar hour,minute,second,tcnt,nlhour,nlminute,nldk,lnl;
// 时、 分、 秒、20次1S,闹时、闹分,闹开关标志,lnl(闹符号闪烁标志)
/***********************************************************************************/
/////////////////////////////////////////////////////////////////////////////
/*//*********************************************************************//*/
/*//****************第二部分:Lcd1602、各种函数的显示部分****************//*/
/*//*********************************************************************//*/
/////////////////////////////////////////////////////////////////////////////
/***********************************************************************************/
uchar code riqi[]="2014-05-26 MON";
uchar code table[]=" 23:59:55";
void wcmd(uchar cmd) //lcd1602写命令 注意RW端已经接地
{
lcden=0;
lcdrs=0;
P0=cmd;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void wdata(uchar dat) //lcd1602写数据 注意RW端已经接地
{
lcden=0;
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void goxy(uchar x,uchar y) //定位2*16 数据显示在具体哪个位置
{
if(x==1)
wcmd(0x80+y); // 第一行+
else
wcmd(0x80+0x40+y);// 第二行+
}
void disp_str(uchar *str)//上电时显示数据 第一行 2014-05-24、第二行 23:59:55
{
while(*str)
{
wdata(*str);
str++;
}
}
void lcd_init()//液晶初始化,整体用延时代替读忙状态
{
wcmd(0x38);//显示模式设置:16*2,5*7,8位数据接口
wcmd(0x0c);//开显示,不显光标,光标不闪烁
wcmd(0x06);//地址自动加1
wcmd(0x01);//清屏
wcmd(0x40);//写CGRAM
goxy(1,0);
disp_str(riqi);
goxy(2,0);
disp_str(table);
}
void disp_sfm(uchar x,uchar y,uchar date)//显示月、日、时、分、秒
{
uchar shi,ge;
shi=date/10+'0';
ge=date%10+'0';
goxy(x,y);
wdata(shi);
wdata(ge);
}
void disp_sfm1(uint x,uint y,uint date)//显示年
{
uint qian,bai,shi,ge;
qian=date/1000+'0';
bai=date%1000/100+'0';
shi=date%100/10+'0';
ge=date%10+'0';
goxy(x,y);
wdata(qian);
wdata(bai);
wdata(shi);
wdata(ge);
}
void write_week(uchar xq) //显示星期函数
{
goxy(1,11);
switch(xq)
{
case 0x01: wdata('M'); wdata('O');wdata('N');break;
case 0x02: wdata('T'); wdata('U'); wdata('E');break;
case 0x03: wdata('W'); wdata('E'); wdata('D');break;
case 0x04: wdata('T'); wdata('H'); wdata('U');break;
case 0x05: wdata('F'); wdata('R');wdata('I');break;
case 0x06: wdata('S'); wdata('A');wdata('T');break;
case 0x07: wdata('S'); wdata('U');wdata('N');break;
default:break;
}
}
void nl0()//调整闹铃时显示 ":"处理
{
goxy(2,0);
wdata('N');
disp_sfm(2,2,nlhour);
wdata(':');
disp_sfm(2,5,nlminute);
}
void nldisappear()//闹铃调整设置时 将显示的地方清除处理" "
{
uchar i;
goxy(2,0);
for(i=0;i<7;i++)
wdata(' ');
delay(1);
}
/***********************************************************************************/
/////////////////////////////////////////////////////////////////////////////
/*//*********************************************************************//*/
/*//*****第三部分:正常走时、调整时间和闹铃、对年月日,时分秒的处理******//*/
/*//*********************************************************************//*/
/////////////////////////////////////////////////////////////////////////////
/***********************************************************************************/
void inc_nian()//正常走和调整时间 年的处理
{
if(sjjianflag==1){sjjianflag=0;
nian--;
if(nian==1999){nian=9999;}}
else{
nian++;
if(nian==10000)
nian=2000;}
}
void inc_yue()//正常走 月的处理
{
yue++;
if(yue==13)
yue=1;
inc_nian();
disp_sfm1(1,0,nian);
}
void inc_ri()//正常走 日的处理
{
ri++;
xq++;
if(xq==8){xq=1;}
write_week(xq);
if(ri==29&&yue==2&&!((nian%4==0&&nian%100!=0)||nian%400==0))//平年
{
ri=1;
inc_yue();
disp_sfm(1,5,yue);
}
if(ri==30&&yue==2&&((nian%4==0&&nian%100!=0||nian%400==0)))//闰年
{
ri=1;
inc_yue();
disp_sfm(1,5,yue);
}
if(ri==31&&(yue==4||yue==6||yue==9||yue==11))//小月30天
{
ri=1;
inc_yue();
disp_sfm(1,5,yue);
}
if(ri==32)//大月31天
{
ri=1;
inc_yue();
disp_sfm(1,5,yue);
}
}
void inc_hour()//正常走 时处理
{
hour++;
if(hour==24)
hour=0;
inc_ri();
disp_sfm(1,8,ri);
}
void inc_minute() //正常走 分处理
{
minute++;
if(minute==60)
{
minute=0;
inc_hour();
}
}
void inc_second()//正常走 秒处理
{
second++;
if(second==60)
{
second=0;
inc_minute();
}
if(second%2) //隔一秒":"闪一次,偶数":",奇数" "
{goxy(2,13);wdata(' ');}
else
{goxy(2,13);wdata(':');}
}
void yue_nop()//调整时间 月的加减过程
{
if(sjjianflag==1){sjjianflag=0;
yue--;
if(yue==0){yue=12;}}
else{
yue++;
if(yue==13)
yue=1;}
}
void ri_nop()//调整时间 日的加加过程
{
if(sjjianflag==1){
sjjianflag=0;
xq--;
if(xq==0){xq=7;}
write_week(xq);
ri--;
if(ri==0){ri=31;}}
else{
xq++;
if(xq==8){xq=1;}
write_week(xq);
ri++;
if(ri==32)
ri=1;}
}
void inc_hour_nop()//调整时间 时的加减处理
{ if(sjjianflag==1){sjjianflag=0;
hour--;
if(hour==(-1)){hour=23;}}
else{
hour++;
if(hour==24)
hour=0;}
}
void inc_minute_nop()//调整时间 分的加减处理
{ if(sjjianflag==1){sjjianflag=0;
minute--;
if(minute==(-1)){minute=59;}}
else{
minute++;
if(minute==60)
minute=0;}
}
void inc_second_nop()//调整时间 秒的加减处理
{ if(sjjianflag==1){sjjianflag=0;
second--;
if(second==(-1)){second=59;}}
else{
second++;
if(second==60)
second=0;}
}
void inc_nlhour() //调整闹钟 时的加减处理
{
if(nljianflag==1){nljianflag=0;
nlhour--;
if(nlhour==(-1)){nlhour=23;}}
else{
nlhour++;
if(nlhour==24)
nlhour=0;}
}
void inc_nlminute() //调整闹钟 分的加减处理
{
if(nljianflag==1){nljianflag=0;
nlminute--;
if(nlminute==(-1)){nlminute=23;}}
else{
nlminute++;
if(nlminute==60)
nlminute=0;}
}
/***********************************************************************************/
/////////////////////////////////////////////////////////////////////////////
/*//*********************************************************************//*/
/*//******************第四部分:设置时间、闹铃的过程*********************//*/
/*//*********************************************************************//*/
/////////////////////////////////////////////////////////////////////////////
/***********************************************************************************/
void tzsjfun()/*******时间设置函数*******/
{
if(nlflag==0)//若闹铃没按下,则可设置时间,否则无效
{
if(wdnum==0)//若切换温度也没按下,则可设置时间
{
if(lnl==0)//若闹铃没有在响
{
if(setsj==0)
{
delay(2);
while(!setsj);
delay(2);
if(setsj==1) //表示按下了设置时间,且已经消抖
{ TR0=0;
++sj;
if(sj){
goxy(2,13);
wdata(':');
}//设置时间是":",固定不在闪烁
wcmd(0x0f);
switch(sj){
case 0x01:TR0=0;wcmd(0x80+0x03);break;
case 0x02:wcmd(0x80+0x06);break;
case 0x03:wcmd(0x80+0x09);break;
case 0x04:wcmd(0x80+0x40+0x09);break;
case 0x05:wcmd(0x80+0x40+0x0c);break;
case 0x06:wcmd(0x80+0x40+0x0f);break;
case 0x07:wcmd(0x0c);sj=0;TR0=1;TR1=1;break;
default:break;}
} }
if(sj)/****要调整时间 加的过程****/
{
if(jia==0){
delay(2);
while(!jia);
delay(2);
if(jia==1){
switch(sj){
case 0x01:inc_nian();wcmd(0x80+0x03);disp_sfm1(1,0,nian);wcmd(0x80+0x03);break;
case 0x02:yue_nop();disp_sfm(1,5,yue);wcmd(0x80+0x06);break;
case 0x03:ri_nop();disp_sfm(1,8,ri);wcmd(0x80+0x09);break;
case 0x04:inc_hour_nop();disp_sfm(2,8,hour);wcmd(0x80+0x40+0x09);break;
case 0x05:inc_minute_nop();disp_sfm(2,11,minute);wcmd(0x80+0x40+0x0c);break;;
case 0x06:inc_second_nop();disp_sfm(2,14,second);wcmd(0x80+0x40+0x0f);break;
default:break;}
}
}
if(jian==0)/****要调整时间 减的过程****/
{
delay(2);
while(!jian);
delay(2);
if(jian==1){ sjjianflag=1;//减标志
switch(sj){
case 0x01:inc_nian();wcmd(0x80+0x03);disp_sfm1(1,0,nian);wcmd(0x80+0x03);break;
case 0x02:yue_nop();disp_sfm(1,5,yue);wcmd(0x80+0x06);break;
case 0x03:ri_nop();disp_sfm(1,8,ri);wcmd(0x80+0x09);break;
case 0x04:inc_hour_nop();disp_sfm(2,8,hour);wcmd(0x80+0x40+0x09);break;
case 0x05:inc_minute_nop();disp_sfm(2,11,minute);wcmd(0x80+0x40+0x0c);break;;
case 0x06:inc_second_nop();disp_sfm(2,14,second);wcmd(0x80+0x40+0x0f);break;
default:break;}
}
}
}
}
}
}
}
void tznlfun()/*******闹铃设置函数*******/
{
if(sj==0)//若设置时间没按下,则可设置闹铃,否则无效
{
if(wdnum==0) //若温度没有按下,则可设置闹铃,否则无效
{
if(lnl==0)//若闹钟没有响
{
if(setnl==0)
{
while(!setnl);
disp_sfm(2,2,nlhour);
disp_sfm(2,5,nlminute);
if(setnl==1)
{
nlflag++;
wcmd(0x0f);
switch(nlflag){
case 0x01:nl0();wcmd(0x80+0x40+0x03);break;
case 0x02:wcmd(0x80+0x40+0x06);break;
case 0x03:wcmd(0x0c);nlflag=0;nldisappear();break;
default:break;}
}
}
if(nlflag)/******要设置闹铃*****/
{
if(jia==0) //加的过程
{
while(!jia);
delay(4);
if(jia==1){
if(nlflag==1){inc_nlhour();disp_sfm(2,2,nlhour);wcmd(0x80+0x40+0x03);}
if(nlflag==2){inc_nlminute();disp_sfm(2,5,nlminute);wcmd(0x80+0x40+0x06);}
}
}
if(jian==0)//减的过程
{
while(!jian);
delay(4);
if(jia==1){nljianflag=1;
if(nlflag==1){inc_nlhour();disp_sfm(2,2,nlhour);wcmd(0x80+0x40+0x03);}
if(nlflag==2){inc_nlminute();disp_sfm(2,5,nlminute);wcmd(0x80+0x40+0x06);}
}
}
}
}
}
}
}
/************************************************************************************/
/////////////////////////////////////////////////////////////////////////////
/*//*********************************************************************//*/
/*//*****************第五部分:DS18B20的温度部分(1)**********************//*/
/*//*********************************************************************//*/
/////////////////////////////////////////////////////////////////////////////
/************************************************************************************/
void disp_temperature() //温度部分
{
rd_temperature();
process_temperature();
delay(1);
goxy(2,0);
disp_str(di***uf);
goxy(2,6);
wdata('C');
}
void wdscan()//温度部分
{ uchar i;
if((sj==0)&&(nlflag==0))
{
if(wd==0)
{
while(!wd);
delay(5);
if(wd==1)
{
wdnum++;
if(wdnum==2)
{
wdnum=0;
goxy(2,0);
for(i=0;i<7;i++)
wdata(' ');
}
}
}
}
if(wdnum)
{ delay(2);
disp_temperature();
delay(20);
}
}
void wbzd0() interrupt 0
{
hwnum++;
if(hwnum==1)
nldk=0;
else
{
hwnum=0;
nldk=1;
}
}
/************************************************************************************/
/////////////////////////////////////////////////////////////////////////////
/*//*********************************************************************//*/
/*//*********第六部分:按钮检测、闹铃开关了、闹铃是否到时****************//*/
/*//********* 中断20次为一秒,以及主函数 ****************//*/
/*//*********************************************************************//*/
/////////////////////////////////////////////////////////////////////////////
/***********************************************************************************/
void kgnlfun()//闹铃开启光闭的标志符号处理
{
if(!sj)
{
if(knl==0)
{
while(!knl);
delay(2);
if(knl==1)
{
nldk++;
if(nldk==1){
goxy(1,15);
wdata(0xef);}
if(nldk==2){
goxy(1,15);
wdata(' ');
nldk=0;}
}
}
}
}
void nljx()//闹铃时间检测看是否到时
{ uchar x ;
lnl=0;
fm=1;
if(nldk==1){
if((nlhour==hour)&&(nlminute==minute))
{ lnl=1;
for(x=20;x>0;x--)
{
fm=0;
delay(2);
fm=1;
delay(2);}
}
}
}
void timer0() interrupt 1 //中断处理
{ uchar nlfh;
TH0=0x3c; //重装初值,定时0,工作方式1
TL0=0xb0;
tcnt++;
if(tcnt==20)//20次为一秒
{ tcnt=0;
inc_second();//控制":"闪烁
disp_sfm(2,8,hour);
disp_sfm(2,11,minute);
disp_sfm(2,14,second);
if(lnl==1)//若闹铃时间到,则闹铃符号间隔1秒闪烁
{ nlfh++;
if(nlfh==1){
goxy(1,15);
wdata(' ');
}
if(nlfh==2){
goxy(1,15);
wdata(0xef);
nlfh=0;
}
}
}
}
void main() //主函数
{
TMOD=0X01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
EA=1;
EX0=1;
IT0=1;
hour=23;
minute=59;
second=55;
lcd_init();
TR0=1;
while(1)
{
tzsjfun();
tznlfun();
kgnlfun();
nljx();
wdscan();
}
} |