声明:代码确实写的不好,用的都是最笨的方法实现功能,不喜勿喷
这也是我第一次写蓝桥杯的省赛,第一次接触确实我个人觉得比计较艰辛,这个第八届的电子钟我写了两天,并且写的代码也比较杂糅,不精细,用的是最基础的最笨的方法写的。我写这篇文章是想我自己以后回头看的时候能发现自己努力过,也是告诉那些还没着手开始写的朋友,难度是有的但是是可以解决的。
关于蓝桥杯的往届题目可以去蓝桥杯官网查看http://upload.lanqiao.cn/file/20170922/1506067660866378.rar
下面我也贴出题目要求:
第一次看到这个题目确实我是被吓到了,就只有一个想法,还不如不报名。当自己着手开始写之后一开始是很迷茫不知道从哪下手,后来时有了一点思路,再后来就是感觉越来越清晰。
我在这说一下我写的时候的思路,不一定对,如果实在没有下手的缺口,可以参考一下。
第一步:确保初始化的时候显示的是题目要求的值
第二步:确保时间是00-00-00的时候LED灯能够按要求显示
第三步:在LED亮的时候,按下任意键关闭闪烁
第四步:按下S7时钟显示切换
第五步:实现在时钟或闹钟状态下S5和S4加减的功能
第六步:将S7换成S6重复第四步和第五步
最后一步:在时钟显示状态下,按下S4显示温度
让我说的很清楚我也做不到,我就直接让大家看代码了,功能比较多所以我写的是多文件形式的代码:
贴出来的都是.c文件.h文件没有贴出来,我想大家也应该会写。
第一:按键函数
#include "key.h"
#include "shuma.h"
#include "DS18B20.h"
extern char yi,er,san,si,wu,liu,qi,ba;
extern uchar shijian[7];
extern uchar wendu;
extern u8 Dis_wendu_flag;
u8 Key_flage[4]={0,0,0,0};
u8 T_Tkeyscan[4]={0,0,0,0};
u8 wu_flag[2]={0,0};
u8 si_flag[2]={0,0};
u8 yi_flag[2]={0,0};
u8 ba_flag[2]={0,0};
u8 qi_flag[2]={0,0};
u8 wendu_flag;
//独立按键扫描函数
void D_Keyscan(void)
{
if(P30==0) //P30是按键S7
{
Delay5ms();
if(P30==0)
{
Key_flage[0] += 1;//S7按键标志位
if(Key_flage[0] == 4)//当S6按键按下第四次时,归零,重新开始计数
Key_flage[0] = 0;
}
while(!P30);
}
else if(P31==0) //P31是按键S6
{
Delay5ms();
if(P31==0)
{
Key_flage[0] = 0;
Key_flage[1] += 1;//S6按键标志位
if(Key_flage[1] == 5)//当S6按键按下第五次时,归零,重新开始计数
Key_flage[1] = 0;
}
while(!P31);
}
else if(P32==0) //P32是按键S5
{
Delay5ms();
if(P32==0)
{
if(Key_flage[1] == 2)//在S6按键第二次按下的情况下,检测S5按键按下的次数
Key_flage[2] += 1;
if(Key_flage[1] == 3)//在S6按键第三次按下的情况下,检测S5按键按下的次数
wu_flag[0] +=1;
if(Key_flage[1] == 4)//在S6按键第四次按下的情况下,检测S5按键按下的次数
ba_flag[0] +=1;
if(Key_flage[0] == 1)//在S7按键第一次按下的情况下,检测S5按键按下的次数
yi_flag[0] +=1;
if(Key_flage[0] == 2)//在S7按键第二次按下的情况下,检测S5按键按下的次数
si_flag[0] +=1;
if(Key_flage[0] == 3)//在S7按键第三次按下的情况下,检测S5按键按下的次数
qi_flag[0] +=1;
}
while(!P32);
}
else if(P33==0) //P33是按键S4
{
Delay5ms();
if(P33==0)
{
if(Dis_wendu_flag == 1)//此标志位只有在时钟显示的情况会等于一
{
Dis_wendu_flag = 0;
wendu_flag = 1; //将温度显示标志位赋值为一
}
if(Key_flage[1] == 2) //在S6按键第二次按下的情况下,检测S4按键按下的次数
Key_flage[3] += 1;
if(Key_flage[1] == 3)//在S6按键第三次按下的情况下,检测S4按键按下的次数
wu_flag[1] +=1;
if(Key_flage[1] == 4)//在S6按键第四次按下的情况下,检测S4按键按下的次数
ba_flag[1] +=1;
if(Key_flage[0] == 1)//在S7按键第一次按下的情况下,检测S4按键按下的次数
yi_flag[1] +=1;
if(Key_flage[0] == 2)//在S7按键第二次按下的情况下,检测S4按键按下的次数
si_flag[1] +=1;
if(Key_flage[0] == 3)//在S7按键第三次按下的情况下,检测S4按键按下的次数
qi_flag[1] +=1;
}
while(!P33)
{
if(wendu_flag == 1)//在时钟显示状态下,按键S4按下显示温度
{
wendu = Date_Handing(); //读取温度
yi = 12;er = 12;san = 12;si = 12;
wu = 12;
liu = wendu%100/10; //分离温度数据
qi = wendu%10;
ba = 11;
Display1_2(yi,er);
Display4_5(si,wu);
Display3_6(san,liu);
Display7_8(qi,ba);
}
}
wendu_flag = 0; //当S4按键松手之后,将温度显示标志位清零,确保在松手之后回到时钟显示界面
}
}
void KeyS6_1(void)//第一二个数码管闪烁
{
char temp;
if(Key_flage[1] == 2)
{
yi = 0;er = 0;san = 10;si = 0;
wu = 0;liu = 10;qi = 0;ba = 0;
temp = Key_flage[2] - Key_flage[3] ; //将S5和S4按下的次数进行计算,确定数字应该增加的数量
if(temp <= 0)//如果小于零那就等于零,并且清空两个标志位
{
yi = 0;
er = 0;
Key_flage[2] = 0;
Key_flage[3] = 0;
}
else if((temp >= 10) && (temp < 20))
{
yi = 1;
er = temp - 10;
}
else if((temp >= 20) && (temp < 30))
{
yi = 2;
er = temp - 20;
}
else if((temp >= 30) && (temp < 40))
{
yi = 3;
er = temp - 30;
}
else if((temp >= 40) && (temp < 50))
{
yi = 4;
er = temp - 40;
}
else if((temp >= 50) && (temp < 60))
{
yi = 5;
er = temp - 50;
}
else if(temp == 60)
{
yi = 6;
er = 0;
}
else if(temp > 60)
{
yi = 0;
er = 0;
Key_flage[2] = 0;
Key_flage[3] = 0;
}
else
{
er = temp;
}
if(shijian[0]%2 == 0)//实现数码管的闪烁功能,当时间是偶数时数码管熄灭,是奇数时显示
{
P2=0XC0;//打开位选573 U8
P0=0X03;//选择第一个数码管
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
else
{
Display1_2(yi,er);
}
}
}
void KeyS6_2(void)//第四五个数码管闪烁
{
char temp;
if(Key_flage[1] == 3)
{
yi = 0;er = 0;san = 10;si = 0;
wu = 0;liu = 10;qi = 0;ba = 0;
temp = wu_flag[0] - wu_flag[1];
if(temp <= 0)
{
wu = 0;
si = 0;
wu_flag[0] = 0;
wu_flag[1] = 0;
}
else if((temp >= 10) && (temp < 20))
{
si = 1;
wu = temp - 10;
}
else if((temp >= 20) && (temp < 30))
{
si = 2;
wu =temp - 20;
}
else if((temp >= 30) && (temp < 40))
{
si = 3;
wu =temp - 30;
}
else if((temp >= 40) && (temp < 50))
{
si = 4;
wu =temp - 40;
}
else if((temp >= 50) && (temp < 60))
{
si = 5;
wu =temp - 50;
}
else if(temp == 60)
{
si = 6;
wu = 0;
}
else if(temp > 60)
{
si = 0;
wu = 0;
wu_flag[0] = 0;
wu_flag[1] = 0;
}
else
{
wu =temp;
}
if(shijian[0]%2 == 0)
{
P2=0XC0;//打开位选573 U8
P0=0X18;//
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
else
{
Display4_5(si,wu);
}
}
}
void KeyS6_3(void)//第七八个数码管闪烁
{
char temp;
if(Key_flage[1] == 4)
{
yi = 0;er = 0;san = 10;si = 0;
wu = 0;liu = 10;qi = 0;ba = 0;
temp = ba_flag[0] - ba_flag[1];
if(temp <= 0)
{
ba = 0;
qi = 0;
ba_flag[0] = 0;
ba_flag[1] = 0;
}
else if((temp >= 10) && (temp < 20))
{
qi = 1;
ba = temp - 10;
}
else if((temp >= 20) && (temp < 30))
{
qi = 2;
ba = temp - 20;
}
else if((temp >= 30) && (temp < 40))
{
qi = 3;
ba = temp - 30;
}
else if((temp >= 40) && (temp < 50))
{
qi = 4;
ba = temp - 40;
}
else if((temp >= 50) && (temp < 60))
{
qi = 5;
ba = temp - 50;
}
else if(temp == 60)
{
qi = 6;
ba = 0;
}
else if(temp > 60)
{
qi = 0;
ba = 0;
ba_flag[0] = 0;
ba_flag[1] = 0;
}
else
{
ba = temp;
}
if(shijian[0]%2 == 0)
{
P2=0XC0;//打开位选573 U8
P0=0XC0;
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
else
{
Display7_8(qi,ba);
}
}
}
void KeyS7_1(void)//第一二个数码管闪烁
{
char temp;
static uchar flag = 0;
if(Key_flage[0] == 1)
{
temp = yi_flag[0] - yi_flag[1];
if(flag == 0)
{
if(temp <= 0)
{
yi_flag[0] = 0;
yi_flag[1] = 0;
}
else if(((er + temp) >= 10) && ((er + temp) < 20))
{
yi = yi + 1;
er = temp + er - 10;
}
else if(((er + temp) >= 20) && ((er + temp) < 30))
{
yi = yi + 2;
er = temp + er - 20;
}
else if(((er + temp) >= 30) && ((er + temp) < 40))
{
yi = yi + 3;
er = temp + er - 30;
}
else if((er + temp) == 40)
{
yi = 0;
er = 0;
yi_flag[0] = 0;
yi_flag[1] = 0;
}
else
{
er = temp + er;
}
}
if((si==0) && (wu==0) && (qi==0) && (ba==0))
{
flag =1;
yi = 0;
er = 0;
yi_flag[0] = 0;
yi_flag[1] = 0;
}
if(flag == 1)
{
if(temp <= 0)
{
yi = 0;
er = 0;
yi_flag[0] = 0;
yi_flag[1] = 0;
}
else if((temp >= 10) && (temp < 20))
{
yi = 1;
er = temp - 10;
}
else if((temp >= 20) && (temp < 30))
{
yi = 2;
er = temp - 20;
}
else if((temp >= 30) && (temp < 40))
{
yi = 3;
er = temp - 30;
}
else if((temp >= 40) && (temp < 50))
{
yi = 4;
er = temp - 40;
}
else if((temp >= 50) && (temp < 60))
{
yi = 5;
er = temp - 50;
}
else if(temp == 60)
{
yi = 6;
er = 0;
}
else if(temp > 60)
{
yi = 0;
er = 0;
yi_flag[0] = 0;
yi_flag[1] = 0;
}
else
{
er = temp;
}
}
if(ba%2 == 0)
{
P2=0XC0;//打开位选573 U8
P0=0X03;//选择第一个数码管
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
else
{
Display1_2(yi,er);
}
}
}
void KeyS7_2(void)//第四五个数码管闪烁
{
char temp;
if(Key_flage[0] == 2)
{
temp = si_flag[0] - si_flag[1];
if(temp <= 0)
{
si = 0;
wu = 0;
si_flag[0] = 0;
si_flag[1] = 0;
}
else if((temp >= 10) && (temp < 20))
{
si = 1;
wu = temp - 10;
}
else if((temp >= 20) && (temp < 30))
{
si = 2;
wu = temp - 20;
}
else if((temp >= 30) && (temp < 40))
{
si = 3;
wu = temp - 30;
}
else if((temp >= 40) && (temp < 50))
{
si = 4;
wu = temp - 40;
}
else if((temp >= 50) && (temp < 60))
{
si = 5;
wu = temp - 50;
}
else if(temp == 60)
{
si = 6;
wu = 0;
}
else if(temp > 60)
{
si = 0;
wu = 0;
si_flag[0] = 0;
si_flag[1] = 0;
}
else
{
wu = temp;
}
if(ba%2 == 0)
{
P2=0XC0;//打开位选573 U8
P0=0X18;//选择第一个数码管
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
else
{
Display4_5(si,wu);
}
}
}
void KeyS7_3(void)//第七八个数码管闪烁
{
char temp;
if(Key_flage[0] == 3)
{
temp = qi_flag[0] - qi_flag[1];
if(temp <= 0)
{
qi_flag[0] = 0;
qi_flag[1] = 0;
}
else if(((temp + ba) >= 10) && ((temp + ba) < 20))
{
qi = qi + 1;
ba = ba + temp - 10;
}
else if(((temp + ba) >= 20) && ((temp + ba) < 30))
{
qi = qi + 2;
ba = ba + temp - 20;
}
else if(((temp + ba) >= 30) && ((temp + ba) < 40))
{
qi = qi + 3;
ba = ba + temp - 30;
}
else if(((temp + ba) >= 40) && ((temp + ba) < 50))
{
qi = qi + 4;
ba = ba + temp - 40;
}
else if(((temp + ba) >= 50) && ((temp + ba)< 60))
{
qi = qi + 5;
ba = ba + temp - 50;
}
else if((temp + ba) == 60)
{
qi = 6;
ba = 0;
qi_flag[0] = 0;
qi_flag[1] = 0;
}
else if((temp + ba) > 60)
{
qi = 0;
ba = 0;
qi_flag[0] = 0;
qi_flag[1] = 0;
}
else
{
ba = ba + temp;
}
if(ba%2 == 0)
{
P2=0XC0;//打开位选573 U8
P0=0XC0;//选择第一个数码管
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
else
{
Display7_8(qi,ba);
}
}
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
/*这个函数是为了实现在时钟显示状态下按任意键结束闹钟的流水灯闪烁提示(写这个函数也是无奈之举)*/
//独立按键
void T_keyscan()
{
if(P30==0)
{
Delay5ms();
if(P30==0) //按键S7
{
T_Tkeyscan[0] = 1;
}
while(!P30);
}
else if(P31==0) //按键S6
{
Delay5ms();
if(P31==0)
{
T_Tkeyscan[1] = 1;
}
while(!P31);
}
else if(P32==0) //按键S5
{
Delay5ms();
if(P32==0)
{
T_Tkeyscan[2] = 1;
}
while(!P32);
}
else if(P33==0) //按键S4
{
Delay5ms();
if(P33==0)
{
T_Tkeyscan[3] = 1;
wendu_flag = 1;
}
while(!P33);
}
}
第二:数码管
#include "shuma.h"
u8 shu_tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XC6,0XFF};//0XC6是英文C
char yi,er,san,si,wu,liu,qi,ba;
//第一和第二个数码管
void Display1_2(uchar yi,uchar er)
{
P2=0XC0;//打开位选573 U8
P0=0X01;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[yi];
Delay1ms();Delay1ms();
P2=0XC0;//打开位选573 U8
P0=0X02;//选择第二个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[er];
Delay1ms();Delay1ms();
}
//第四和第五个数码管
void Display4_5(uchar si,uchar wu)
{
P2=0XC0;//打开位选573 U8
P0=0X08;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[si];
Delay1ms();Delay1ms();
P2=0XC0;//打开位选573 U8
P0=0X10;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[wu];
Delay1ms();Delay1ms();
}
//第三和第六个数码管
void Display3_6(uchar san,uchar liu)
{
P2=0XC0;//打开位选573 U8
P0=0X04;//选择第三个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[san];
Delay1ms();Delay1ms();
P2=0XC0;//打开位选573 U8
P0=0X20;//选择第四个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[liu];
Delay1ms();Delay1ms();
}
//第七和第八个数码管
void Display7_8(uchar qi,uchar ba)
{
P2=0XC0;//打开位选573 U8
P0=0X40;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[qi];
Delay1ms();Delay1ms();
P2=0XC0;//打开位选573 U8
P0=0X80;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=shu_tab[ba];
Delay1ms();Delay1ms();
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
第三:DS18B20
#include "DS18B20.h"
//DS18B20初始化
void DS18Init()
{
DQ=0;
Delay500us();
DQ=1;
Delay500us();
}
//温度处理函数
uchar Date_Handing()
{
uchar high,low;
uchar temp;
DS18Init();
write(0xcc);
write(0x44);
//Delay500us();//Delay500us();
DS18Init();
write(0xcc);
write(0xbe);
low=read();
high=read();
temp=high<<4;
temp|=(low>>4);
return temp;
}
//向DS写控制字
void write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
Delay100us();
DQ=1;
dat>>=1;
}
}
//读取温度存储器的数据
uchar read()
{
uchar i,dat;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
dat>>=1;
DQ=1;
if(DQ==1)
{
dat|=0x80;
}
Delay100us();
}
return dat;
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
第四:DS1302
#include "ds1302.h"
uchar shijian[7];
uchar code ds[]={50,59,23,10,10,1,16};
//DS1302初始化
void DS13Init()
{
uchar i;
uchar add=0x80;
write_DS(0x8e,0x00);
for(i=0;i<7;i++)
{
write_DS(add,ds[i]);
add=add+2;
}
write_DS(0x8e,0x80);
}
//向DS1302写地址和数据
void write_DS(uchar add,uchar dat)
{
uchar num;
CE=0;
SCLK=0;
CE=1;
writebyte(add);
num=(dat/10<<4)|(dat%10);
writebyte(num);
CE=0;
}
//将数据存储到指定数组中
void Read_Time()
{
uchar i;
uchar add=0x81;
write_DS(0x8e,0x00);
for(i=0;i<7;i++)
{
shijian[i]=read(add);
add=add+2;
}
write_DS(0x8e,0x80);
}
//读取DS1302指定地址中的数据
uchar read(uchar add)
{
uchar i,temp;
uchar dat_low,dat_high;
CE=0;
SCLK=0;
CE=1;
writebyte(add);
for(i=0;i<8;i++)
{
SCLK=0;
temp>>=1;
if(IO)
{
temp|=0x80;
}
SCLK=1;
}
IO=0;//数据位要从零开始
dat_high=temp/16;
dat_low=temp%16;
temp=dat_high*10+dat_low;
return temp;
}
//向DS1302写数据
void writebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
IO=dat&0x01;
SCLK=1;
dat>>=1;
}
}
第五:一个初始化(以上的所有模块的.h都包含了这个模块的.h)的.c文件
#include "system.h"
void Init(void)
{
P2=0XA0;//打开蜂鸣器,继电器控制端
P0=0X00;//关闭蜂鸣器,继电器
P2=0X80;//打开LED灯控制端
P0=0XFF;//关闭LED灯
P2=0XC0;//打开数码管片选控制端
P0=0XFF;//选择所有数码管
P2=0XFF;//打开数码管段选控制端
P0=0XFF;//关闭所有数码管段选
}
//void delay(u16 i)
//{
// while(i--);
//}
初始化的.h文件
#ifndef __SYSTEM_H
#define __SYSTEM_H
#include "STC15F2K60S2.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
void Init(void);
//void delay(u16 i);
#endif
最后:主函数
#include "system.h"
#include "DS18B20.h"
#include "key.h"
#include "shuma.h"
#include "ds1302.h"
sbit Led_L1=P0^0;
void Timer0Init(void);
extern uchar shijian[7];
extern char yi,er,san,si,wu,liu,qi,ba;
extern u8 Key_flage[4];
extern u8 T_Tkeyscan[4];
extern u8 wendu_flag;
u8 Dis_wendu_flag;
u8 Led_flag;
uchar wendu;
void main(void)
{
yi = 12;er = 12;san = 12;si = 12;
wu = 12;liu = 12;qi = 12;ba = 12;
Init();
DS18Init();
DS13Init();
Timer0Init();
while(1)
{
Read_Time();
D_Keyscan();
wendu = Date_Handing();
yi=shijian[2]/10;er=shijian[2]%10;san=10;
si=shijian[1]/10;wu=shijian[1]%10;liu=10;
qi=shijian[0]/10;ba=shijian[0]%10;
if(Key_flage[1] == 1)//按键S6按下,显示00-00-00
{
Dis_wendu_flag = 0;
yi = 0;er = 0;san = 10;si = 0;
wu = 0;liu = 10;qi = 0;ba = 0;
Display1_2(yi,er);
Display4_5(si,wu);
Display3_6(san,liu);
Display7_8(qi,ba);
}
else if(Key_flage[1] == 2)//按键S6第二次按下,第一二个数码管闪烁
{
Dis_wendu_flag = 0;
KeyS6_1();
Display4_5(si,wu);
Display3_6(san,liu);
Display7_8(qi,ba);
}
else if(Key_flage[1] == 3)//按键S6第三次按下,第四五个数码管闪烁
{
Dis_wendu_flag = 0;
KeyS6_2();
Display1_2(yi,er);
Display3_6(san,liu);
Display7_8(qi,ba);
}
else if(Key_flage[1] == 4)//按键S6第四次按下,第七八个数码管闪烁
{
Dis_wendu_flag = 0;
KeyS6_3();
Display1_2(yi,er);
Display4_5(si,wu);
Display3_6(san,liu);
}
else if(Key_flage[0] == 1)//按键S7第一次按下,第一二个数码管闪烁
{
Dis_wendu_flag = 0;
KeyS7_1();
Display4_5(si,wu);
Display3_6(san,liu);
Display7_8(qi,ba);
if((yi==0) && (er==0) && (si==0) && (wu==0) && (qi==0) && (ba==0))
{
Led_flag = 1;
}
}
else if(Key_flage[0] == 2)//按键S7第二次按下,第四五个数码管闪烁
{
Dis_wendu_flag = 0;
KeyS7_2();
Display1_2(yi,er);
Display3_6(san,liu);
Display7_8(qi,ba);
if((yi==0) && (er==0) && (si==0) && (wu==0) && (qi==0) && (ba==0))
{
Led_flag = 1;
}
}
else if(Key_flage[0] == 3)//按键S7第三次按下,第七八个数码管闪烁
{
Dis_wendu_flag = 0;
KeyS7_3();
Display1_2(yi,er);
Display3_6(san,liu);
Display4_5(si,wu);
if((yi==0) && (er==0) && (si==0) && (wu==0) && (qi==0) && (ba==0))
{
Led_flag = 1;
}
}
else
{
Display1_2(yi,er);
Display4_5(si,wu);
Display3_6(san,liu);
Display7_8(qi,ba);
if((yi==0) && (er==0) && (si==0) && (wu==0) && (qi==0) && (ba==0))//LED报警闪烁
{
Led_flag = 1;
}
Dis_wendu_flag = 1;
}
}
}
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
}
void Time0(void) interrupt 1
{
uchar num1;
uint num2;
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
if(Led_flag == 1) //实现闹钟提醒时LED闪烁
{
T_keyscan();
if((T_Tkeyscan[0] == 1) || (T_Tkeyscan[1] == 1) || (T_Tkeyscan[2] == 1) || (T_Tkeyscan[3] == 1))
Led_flag = 0;
num1++;
num2++;
P2 = 0X80;//打开LED灯控制端
P0 = 0XFF;//关闭LED灯
P2&=0X1F;
if(num1 == 100)//以0.2秒闪烁
{
num1 = 0;
P2 = 0X80;//打开LED灯控制端
P0 = 0XFE;//L1亮
P2&=0X1F;
}
if(num2 == 2500)//闪烁总时长5秒
{
num2 = 0;
P2 = 0X80;//打开LED灯控制端
P0 = 0XFF;//关闭LED灯
Led_flag = 0;
}
}
}
到这里基本上就可以实现所有的功能。我会把完整的工程上传。