#include "stc15f2k60s2.h"
#include "iic.h"
#include "ds18b20.h"
//0 1 2 3 4 5 6 7 8 9 熄滅 C P
code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x8C};
unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10}; //顯示緩沖區
unsigned char dspcom=0;//數碼管碼段
unsigned char yi=10,er=10,san=10,si=10,wu=10,liu=10,qi=10,ba=10;
unsigned char key_temp;
unsigned char key_num;//鍵值
bit key_flag;//按鍵掃描標記位 10ms
unsigned char key_press;//消抖的標記變量
unsigned char key_value=0xff;
unsigned char key_re;
unsigned char intr;
bit s4_cnt=0;//按鍵s4切換狀態
bit s5_cnt=0;//按鍵s5切換狀態
bit flag_set=1;//進入設置狀態標記位
unsigned char T_min=20;//溫度下限值
unsigned char T_max=30;//溫度上限值
unsigned char Tmin;
unsigned char Tmax;
unsigned char temper=25;//實時溫度
unsigned char p_flag=0xff;
unsigned char t_cnt=0;
//上電初始化
void power_init()
{
P2=0XA0;P0=0X00;
P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void display()//數碼管顯示
{
dspbuf[0]=yi;
dspbuf[1]=er;
dspbuf[2]=san;
dspbuf[3]=si;
dspbuf[4]=wu;
dspbuf[5]=liu;
dspbuf[6]=qi;
dspbuf[7]=ba;
P2=0x00;
P0=0xff; //消隱
P2=(0xE0|(P2&0x1f));
P2&=0x1f;
P0=0x01<<dspcom;
P2=(0xC0|(P2&0x1f));
P2&=0x1f;
P0=tab[dspbuf[dspcom]];
P2=(0xE0|(P2&0x1f));
P2&=0x1f;
if(++dspcom>=8)
{
dspcom=0;
}
}
unsigned char read_keyboard(void) //獨立按鍵
{
static unsigned char col;
P3 = 0xff;
if((P3&0x0f)!=0x0f) //有按鍵按下 或者抖動
key_press++;
else
key_press = 0;
if(key_press == 3)
{
key_press = 0;
key_re = 1;
if((P3 & 0x01) == 0) col = 1;
if((P3 & 0x02) == 0) col = 2;
if((P3 & 0x04) == 0) col = 3;
if((P3 & 0x08) == 0) col = 4;
}
//連續三次檢測到按鍵被按下,并且該按鍵已經釋放
P3 = 0xff;
if(((key_re == 1) && ((P3&0x0f)==0x0f)))
{
key_re = 0;
key_value=col;
return key_value;
}
return 0xff; //無按鍵按下或被按下的按鍵未被釋放
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x20; //設置定時初值
TH0 = 0xD1; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1;
EA=1;
}
void timer0(void) interrupt 1 //定時器0的中斷處理函數 1ms
{
display();//數碼管顯示
if(++intr>=10)
{
intr=0;
key_flag=1;
}
t_cnt++;
if(s4_cnt==0)
{
yi=11,er=10,san=10,si=10,wu=10,liu=10,qi=temper/10,ba=temper%10;
}
else
{
yi=12,er=10,san=10,si=T_max/10,wu=T_max%10,liu=10,qi=T_min/10,ba=T_min%10;
}
if(s4_cnt==0&&flag_set==1)
{
flag_set=0;
if(T_max<T_min)
{
T_max=Tmax;
T_min=Tmin;
p_flag=0xf7;
}
else
{
Tmax=T_max;Tmin=T_min;
p_flag=0xff;
}
}
else if(s4_cnt==1&&flag_set==0)
{
flag_set=1;
Tmax=T_max;Tmin=T_min;
}
}
void main()
{
//上電初始化
power_init();
Timer0Init();
while(1)
{
if(t_cnt>=200)
{
t_cnt=0;
temper=rd_temperature(); //獲取溫度值
if(temper>Tmax)
{
SetDACOut(204);
P2=0X00;P0=0XFF;P2=0X80;P0=0XFE&p_flag;
}
else if(temper>=Tmin)
{
SetDACOut(153);
P2=0X00;P0=0XFF;P2=0X80;P0=0XFD&p_flag;
}
else
{
SetDACOut(102);
P2=0X00;P0=0XFF;P2=0X80;P0=0XFB&p_flag;
}
}
if(key_flag)//按鍵標記10ms進來一次
{
key_flag=0;
key_temp=read_keyboard();
if(key_temp!=0xff) //有效按鍵
{
key_num=key_temp;
switch(key_num)
{
case 1: //s7 -
if(s4_cnt==1)
{
if(s5_cnt==0)
{
if(T_min--<=0)
T_min=0;
}
else
{
if(T_max--<=0)
T_max=0;
}
}
break;
case 2://s6 +
if(s4_cnt==1)
{
if(s5_cnt==0)
{
if(++T_min>=100)
T_min=99;
}
else
{
if(++T_max>=100)
T_max=99;
}
}
break;
case 3://s5
s5_cnt=~s5_cnt;
break;
case 4://s4 界面切換
s4_cnt=~s4_cnt;
break;
}
}
}
}
}
|