往期回顾
题目
一、前期准备
1:本文使用的头文件是由stc生成
点击保存文件之后,保存至自己文件目录下方即可
2:本文使用的都是官方提供的底层驱动代码
二、代码详情
1.基础代码
蜂鸣器/继电器/led/定时器之类的代码
参考之前写的文章
第四届蓝桥杯代码讲解
2.矩阵按键详解
按键写法讲解
直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解
3.驱动的处理
驱动写法讲解
直接跳转以前的文章即可
蓝桥杯驱动处理
4.总代码
#include<stc15f2k.h>
#include<onewire.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela,temp,key,ms,sign,bz,run;
int a,b,c,d,max,min;
int date,yi=11,er=11,san=11,si=11;
bit flag,shezhi,stop;
void buzz()
{
P2=((P2&0x1f)|0xa0);
P0=0X00;
P2&=0X1F;
P2=((P2&0x1f)|0x80);
P0=0XFF;
P2&=0X1F;
}
void delay(int x)
{
int i;
while(x--)
for(i=0;i<5*123;i++);
}
void led(int x)
{
P2=((P2&0x1f)|0x80);
P0=x;
P2&=0X1F;
}
void din()
{
TMOD=0X10;
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
EA=1;
ET1=1;
TR1=1;
}
void display()
{
P2=((P2&0x1f)|0xe0);
P0=0XFF;
P2&=0X1F;
P2=((P2&0x1f)|0xc0);
P0=1<<diswela;
P2&=0X1F;
P2=((P2&0x1f)|0xe0);
P0=dula[disdula[diswela]];
P2&=0X1F;
if(++diswela>=8)diswela=0;
}
void display_temp()
{
disdula[0]=10;
disdula[1]=date;
disdula[2]=10;
disdula[3]=11;
disdula[4]=11;
disdula[5]=11;
disdula[6]=temp/10%10;
disdula[7]=temp/1%10;
}
void wendu()
{
int LSB,MSB;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay(100);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
Init_DS18B20();
temp=MSB;
temp=(temp<<8)|LSB;
if((temp&0xf800)==0x0000)
{
temp>>=4;
temp=temp*1;
temp=temp+(LSB&0X0F)*0.0625;
}
}
char anjian()
{
static int key_up=1;
int keyscan=0;
P3=0x0f;P42=P44=0;
if(key_up&&(s4==0||s5==0||s6==0||s7==0))
{
key_up=0;
delay(10);
P34=P35=P42=P44=1;
P44=0;
if(s7==0){keyscan=0;bz=1;}
else if(s6==0){keyscan=3;bz=1;}
else if(s5==0){keyscan=6;bz=1;}
else if(s4==0){keyscan=9;bz=1;}
P34=P35=P42=P44=1;
P42=0;
if(s7==0){keyscan=1;bz=1;}
else if(s6==0){keyscan=4;bz=1;}
else if(s5==0){keyscan=5;bz=1;}
else if(s4==0){keyscan=21;}
P34=P35=P42=P44=1;
P35=0;
if(s7==0){keyscan=2;bz=1;}
else if(s6==0){keyscan=5;bz=1;}
else if(s5==0){keyscan=8;bz=1;}
else if(s4==0){keyscan=22;}
P34=P35=P42=P44=1;
}else if(s4==1&&s5==1&&s6==1&&s7==1)key_up=1;
P3=0x0f;P42=P44=0;
return keyscan;
}
void display_shezhi()
{
disdula[0]=10;
disdula[1]=yi;
disdula[2]=er;
disdula[3]=11;
disdula[4]=11;
disdula[5]=10;
disdula[6]=san;
disdula[7]=si;
}
void sheding()
{
if(yi==11&&bz==1)
{
a=key;
yi=a;
bz=0;
}
else if(er==11&&bz==1)
{
b=key;
er=b;
bz=0;
}
else if(san==11&&bz==1)
{
c=key;
san=c;
bz=0;
}
else if(si==11&&bz==1)
{
d=key;
si=d;
bz=0;
max=a*10+b;
min=c*10+d;
}
if(max<min)led(0xfd);
else if(max>=min)led(0xff);
}
void led_run()
{
if(min>temp)date=0;
else if((min<temp)&&(max>temp))date=1;
else if(max<temp)date=2;
}
void main()
{
din();
buzz();
while(1)
{
if(shezhi==0)
{
wendu();
display_temp();
led_run();
}
else if(shezhi==1)
{
led(0xff);date=5;
sheding();
display_shezhi();
}
if(flag==1)
{
flag=0;
key=anjian();
switch(key)
{
case 21:
if(shezhi==0)
{
shezhi=1;
yi=er=san=si=11;
}
else if(shezhi==1)
{
shezhi=0;
}
break;
case 22:
if(shezhi==1)
{
if(si==d&&bz==0){si=11;}
else if(san==c&&bz==0){san=11;}
else if(er==b&&bz==0){er=11;}
else if(yi==a&&bz==0){yi=11;}
}
break;
}
}
}
}
void qa() interrupt 3
{
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
ms++;run++;
if(!(ms%100))flag=1;
else if(ms>=1500)ms=0;
if((run>=800)&&(date==0))
{
run=0;
if(stop==0){stop=1;led(0xfe);}
else if(stop==1){stop=0;led(0xff);}
}
else if((run>=400)&&(date==1))
{
run=0;
if(stop==0){stop=1;led(0xfe);}
else if(stop==1){stop=0;led(0xff);}
}
else if((run>=200)&&(date==2))
{
run=0;
if(stop==0){stop=1;led(0xfe);}
else if(stop==1){stop=0;led(0xff);}
}
display();
}