分享

完美运行

 龙龙生日是多少 2016-03-08
,将跳线J2调整为KBD模式
* 2.按键功能可参考按键处理函数:void key_proc(unsigned char key);
* 日期版本:2012-9-4/V1.0a
*******************************************************************************/
#include 'reg52.h' //定义51单片机特殊功能寄存器
#include 'onewire.h' //单总线函数库
#include 'absacc.h'
unsigned char dspbuf[8] = {11,1,11,10,10,10,0,0};
unsigned char dspbuf1[8] = {11,10,10,10,10,11,10,10};//显示缓冲区
unsigned char dspcom = 0;
unsigned char intr,intr1;
unsigned char temper_flag = 0;//温度读取标志
code unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xff,0xbf};
unsigned char wendusheding[4]={3,0,2,0};

sbit LCD_E = P1^7; sbit RELAY = P0^4;
unsigned char temperature;
void display(void);
void displayer(void);
unsigned int tmax=30;
unsigned int tmin=18;
bit key_re;
unsigned char key_press;
unsigned char key_value;

unsigned int low;
unsigned int mid;
unsigned int high;

unsigned int modelflag;

bit shezhi;

bit model_low;
bit model_mid;
bit model_high;
unsigned int model=0;


bit flag;
bit key_flag;
unsigned char intr;
void led();
unsigned char read_keyboard(void);
void key_proc(unsigned char key);

//主函数
void main(void)
{
unsigned char key_temp = 0xff;
shezhi=0;
TMOD |= 0x01; //配置定时器工作模式
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
EA = 1;
ET0 = 1; //打开定时器中断
TR0 = 1; //启动定时器

while(1)
{ key_temp = 0xff; //清除旧键值
P0=0xff;
if(temper_flag)
{
temper_flag = 0;
if(rd_temperature()<50)

temperature = rd_temperature(); //读温度

}

//显示数据更新


if(key_flag)
{
key_flag = 0;
key_temp = read_keyboard();
}

if(temperature<50)
{ dspbuf[6] = temperature/10;
dspbuf[7] = temperature%10;
if(temperature<tmax){if(temperature>tmin)
dspbuf[1]=1;else dspbuf[1]=0;}
else dspbuf[1]=2;
}



led();




if(shezhi)
{ dspbuf1[1]=wendusheding[0];
dspbuf1[2]=wendusheding[1];
dspbuf1[6]=wendusheding[2];
dspbuf1[7]=wendusheding[3];


tmax= dspbuf1[1]*10 dspbuf1[2];
tmin=dspbuf1[6]*10 dspbuf1[7] ;


}

key_proc(key_temp);
key_temp = 0xff;
}

}










//定时器中断服务函数
void isr_timer_0(void) interrupt 1 //默认中断优先级 1
{

TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256; //定时器重载
P2 &= 0x1f;
P0 = 0xff;
P2 = ((P2&0x1f)|0x80);
P2 &= 0x1f;
if(shezhi)
displayer();
else
display();


if( intr == 15) //2ms执行一次
{
intr = 0;
key_flag = 1; //20ms按键扫描标志位置1
temper_flag=1;
modelflag ; if(modelflag==100)modelflag=0;

}





}

void led()
{
if(dspbuf[1]==0)low ; else low=0;
if(low == 25)
{
model_low=1;
low =0;
P0 = 0x00;
P2 = ((P2&0x1f)|0xa0);
P0 = 0x00;
P2 = P2&0x1f;
P0 = 0xff;

}
if(dspbuf[1]==1)mid ;else mid=0;
if(mid == 25)
{
model_mid=1;
mid=0;
P0 = 0x00;
P2 = ((P2&0x1f)|0xa0);
P0 = 0x00;
P2 = P2&0x1f;
P0 = 0xff;

}
if(dspbuf[1]==2)high ; else high=0;
if(high == 50)
{
model_high=1;
high =0;
P0 = 0x10;
P2 = ((P2&0x1f)|0xa0);
P0 = 0x10;
P2 = P2&0x1f;
P0 = 0xff;

}



if(model_mid)
{ model_mid = 0;
if(modelflag==25)
{
P0 = 0xfe;
P2 = ((P2&0x1f)|0x80);

P2 &= 0x1f;
P0 = 0xff;
modelflag=0;
}
}

if(model_low)
{ model_low = 0;
if(modelflag==11)
{ P0 = 0xfe;
P2 = ((P2&0x1f)|0x80);

P2 &= 0x1f;
modelflag=0;
P0 = 0xff;
}
}


if(model_high)
{ model_high = 0;
if(modelflag==5)
{
P0 = 0xfe;
P2 = ((P2&0x1f)|0x80);

P2 &= 0x1f;
P0 = 0xff;
modelflag=0;
}
}


if(tmax>tmin)flag=0;
else flag=1;
if(flag)
{
P0 = 0xfd;
P2 = ((P2&0x1f)|0x80);

P2 &= 0x1f;


}
}


//读取矩阵键盘键值
unsigned char read_keyboard(void)
{
unsigned char key_temp;
static unsigned char col;

P3 = 0xf0;
key_temp = (P3&0xf0);

if(key_temp != 0xf0) //有按键按下
key_press ;
else
key_press = 0; //抖动

if(key_press == 3)
{
key_press = 0;
key_re = 1;
switch(key_temp)
{
case 0x70:
col = 1; //第一列按键按下
break;
case 0xb0:
col = 2; //第二列按键按下
break;
case 0xd0:
col = 3; //第三列按键按下
break;
case 0xe0:
col = 4; //第四列按键按下
break;
}

P3 = 0x0f;
key_temp = (P3&0x0f);

switch(key_temp)
{
case 0x0e:
key_value = (col-1); //第一行按键按下
break;
case 0x0d:
key_value = (3 col); //第二行按键按下
break;
case 0x0b:
key_value = (7 col); //第三行按键按下
break;
case 0x07:
key_value = (11 col); //第四行按键按下
break;
}
}
//连续三次检测到按键被按下,并且该按键已经释放
P3 = 0x0f;
key_temp = (P3&0x0f);

if((key_re == 1) && (key_temp == 0x0f))
{
key_re = 0;
return key_value;
}

return 0xff; //无按键按下或被按下的按键未被释放
}


//按键处理函数:S7,S11
void key_proc(unsigned char key)
{ unsigned int i;
switch(key)
{
case 0: wendusheding[i]=1;i ;
break;

case 1: //
wendusheding[i]=2;i ;
break;
case 2: //
wendusheding[i]=3;i ;
break;
case 4: //
wendusheding[i]=4;i ;
break;
case 5: //
wendusheding[i]=5;i ;
break;
case 6: //
wendusheding[i]=6;i ;
break;
case 8: //
wendusheding[i]=7;i ;
break;
case 9: //
wendusheding[i]=8;i ;
break;
case 10: //
wendusheding[i]=9;i ;
break;
case 12: //
shezhi=~shezhi;
break;
case 13: //
wendusheding[i]=0;i ;
break;
case 14: //
{
dspbuf1[1]=10;
dspbuf1[2]=10;
dspbuf1[6]=10;
dspbuf1[7]=10;
wendusheding[0]=dspbuf1[1];
wendusheding[1]=dspbuf1[2];
wendusheding[2]=dspbuf1[6];
wendusheding[3]=dspbuf1[7];


i=0;
}

break;



}
}


//显示函数
void display(void)
{
P0 = 0xff;
P2 = ((P2&0x1f)|0xE0);
P2 = P2&0x1f;



P2 = ((P2&0x1f)|0xC0);
P0 = 1<<dspcom;
P2 = P2&0x1f;



P0 = tab[dspbuf[dspcom]];
P2 = ((P2&0x1f)|0xE0);
P2 = P2&0x1f;
P0 = 0xff;
if( dspcom == 8){
dspcom = 0;
}
}

void displayer(void)
{
P0 = 0xff;
P2 = ((P2&0x1f)|0xE0);
P2 = P2&0x1f;

P2 = ((P2&0x1f)|0xC0);
P0 = 1<<dspcom;
P2 = P2&0x1f;


P0 = tab[dspbuf1[dspcom]];
P2 = ((P2&0x1f)|0xE0);
P2 = P2&0x1f;
P0 = 0xff;
if( dspcom == 8){
dspcom = 0;
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多