总的来说这届赛题细节挺多,标志位我建了三四个,需要注意矩阵键盘的按下检测和松开检测
//******************************************************头文件******************************************************
#include<STC15F2K60S2.h>
#include "ds18b20.h"
#include "ds1302.h"
//******************************************************变量声明******************************************************
extern unsigned char shijian[];
unsigned char n[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,
0XBF,0XFF,0XC1};
unsigned char a,b,c,d,e,f,g,h;
char mode=0;
char flag=0;
char flag1=0;
char flag2=0;
char flag3=0;
int fazhi=24;
long wendu;
int t=0;
//******************************************************函数声明******************************************************
void Allint(void);
void yanchi(int ms);
void juzhen16(void);
void lzh1(unsigned char a,unsigned char b);
void lzh2(unsigned char c,unsigned char d);
void lzh3(unsigned char e,unsigned char f);
void lzh4(unsigned char g,unsigned char h);
void shumaguan(void);
void wenduget(void);
void anjian(void);
void Timer0Init(void);
void jidianqi1(void);
void jidianqi2(void);
//******************************************************主函数******************************************************
void main(void)
{
Allint();
ds1302_init();
while(1)
{
ds1302_get();
Timer0Init();
jidianqi1();
jidianqi2();
wenduget();
shumaguan();
juzhen16();
anjian();
lzh1(a,b);
lzh2(c,d);
lzh3(e,f);
lzh4(g,h);
}
}
//******************************************************初始化函数******************************************************
void Allint(void)
{
P2=0X80;
P0=0XFF;
P2=0XA0;
P0=0X00;
P2=0XC0;
P0=0XFF;
P2=0XE0;
P0=0XFF;
}
//******************************************************延迟函数******************************************************
void yanchi(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
//******************************************************短按键******************************************************
void juzhen16(void)
{
unsigned char temp;
P44=1;P42=1;P3=0XDF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
yanchi(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XD7:
switch(mode)
{
case 0: mode=1; break;
case 1: mode=2; break;
case 2: mode=0; break;
}
break;
case 0XDB: if(flag==0) {flag=1;}
else if(flag==1) {flag=0;}
break;
case 0XDD: ; break;
case 0XDE: ; break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
}
//******************************************************按下检测键******************************************************
void anjian(void)
{
P34=0;P44=1;P42=1;P35=1;
if((P32==0)&&(P34==0))
{
yanchi(5);
if(P32==0)
{
if(mode==1) {flag1=1;}
else if(mode==2) {flag1=2;}
}
}
else if((P32==1)&&(flag1==1))
{
flag1=0;
}
else if((P32==1)&&(flag1==2))
{
flag1=0;
if(fazhi--<=10) fazhi=10;
}
else if((P33==0)&&(P34==0))
{
yanchi(5);
if(P33==0)
{
if(mode==2) if(fazhi++>=99) fazhi=99;
}
while(!P33);
}
}
//******************************************************数码管******************************************************
void lzh1(unsigned char a,unsigned char b)
{
P2=0XC0;
P0=0X01;
P2=0XE0;
P0=n[a];
yanchi(1);
P2=0XC0;
P0=0X02;
P2=0XE0;
P0=n[b];
yanchi(1);
}
void lzh2(unsigned char c,unsigned char d)
{
P2=0XC0;
P0=0X04;
P2=0XE0;
P0=n[c];
yanchi(1);
P2=0XC0;
P0=0X08;
P2=0XE0;
P0=n[d];
yanchi(1);
}
void lzh3(unsigned char e,unsigned char f)
{
P2=0XC0;
P0=0X10;
P2=0XE0;
P0=n[e];
yanchi(1);
P2=0XC0;
P0=0X20;
P2=0XE0;
P0=n[f];
yanchi(1);
}
void lzh4(unsigned char g,unsigned char h)
{
P2=0XC0;
P0=0X40;
P2=0XE0;
P0=n[g];
yanchi(1);
P2=0XC0;
P0=0X80;
P2=0XE0;
P0=n[h];
yanchi(1);
P2=0XC0;
P0=0XFF;
P2=0XE0;
P0=0XFF;
}
//******************************************************数码管显示******************************************************
void shumaguan(void)
{
if(mode==0)
{
a=22,b=1,c=21,d=21,e=21,f=wendu/100,g=wendu%100/10+10,h=wendu%10;
}
else if(mode==1)
{
if(flag1==0)
{
a=22,b=2,c=21,d=shijian[2]/10,e=shijian[2]%10,f=20,g=shijian[1]/10,h=shijian[1]%10;
}
else if(flag1==1)
{
a=22,b=2,c=21,d=5,e=3,f=20,g=2,h=0;
}
}
else if(mode==2)
{
a=22,b=3,c=21,d=21,e=21,f=21,g=fazhi/10,h=fazhi%10;
}
}
//******************************************************温度获取******************************************************
void wenduget(void)
{
init_ds18b20();
wendu=Tempget();
}
//******************************************************继电器标志位和指示灯********************************************
void jidianqi1(void)
{
if(wendu>fazhi*10)
{
flag2=1;P2=0X80;P0=0XFD;
}
else if((shijian[1]==0)&&(shijian[0]==0))
{
flag3=1;EA=1;ET0=1;
}
else if((wendu<=fazhi*10)&&(flag3==0))
{
flag2=0;P2=0X80;P0=0XFD;
}
}
//******************************************************继电器状态******************************************************
void jidianqi2(void)
{
if(flag2==0)
{
P2=0XA0;P0=0X00;
}
else if(flag2==1)
{
P2=0XA0;P0=0X10;
}
}
//******************************************************定时器******************************************************
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
//******************************************************中断******************************************************
void timer0_int (void) interrupt 1
{
if(flag3==1)
{
t++;
P2=0X80;P0=0XFE;
P2=0XA0;P0=0X10;
if(t%100==0)
{
P2=0X80;P0=0XFA;
}
if(t==5000)
{
t=0;
if(wendu>fazhi*10) flag2=1;
else if(wendu<=fazhi*10) flag2=0;
flag3=0;
}
}
}