#include <reg52.h>
#include <intrins.h>
#define GPIO_KEY P3
typedef unsigned int u16;
typedef unsigned char u8;
u8 num;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3; //使用独立按键
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
sbit beep=P2^5;
void lnit1(); //初始化函数 定时器
void keyDown();
void key1();
void key2();
void key3();
void key4();
void UartInit();
void Showsmg2();
void Timer0();
void UartInit();
void uart_init(u8 baud);
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
u8 t0,num,mshi,sshi,mge,sge,flag,a;
void lnit1() //初始化函数 定时器
{
t0=0;
num=60;
mshi=0;
sshi=0;
mge=0;
sge=0;
flag=0;
TMOD=0x01; //01方式
TH0=(65536-45872)/256; //50ms
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=0;
PT0=0;
}
void uart_init(u8 baud)
{
TMOD|=0X20; //设置计数器工作方式2
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=baud; //计数器初始值设置
TL1=baud;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void KeyDown(){ //按键检测
GPIO_KEY=0x0f; //定义独立按键端口
if(GPIO_KEY!=0x0f){ //延时消抖
Delay(10);
if(GPIO_KEY!=0x0f){
GPIO_KEY=0x0f;
switch(GPIO_KEY){
case 0x0d : key1();
break;
case 0x0e : key2();
break;
case 0x0b : key3();
break;
case 0x07 : key4();
break;
}
}while(GPIO_KEY!=0x0f); //松手检测
}
}
void key1()
{
flag=flag+10;
if(flag>=60)
{
flag=60;
}
}
void key2()
{
flag=flag-10;
}
void key3()
{
flag=flag+1;
}
void key4()
{
TR0=~TR0;
}
u8 smgduan[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
}; //段选数组
void Showsmg(u8 mshi,u8 mge,u8 sshi,u8 sge)
{
lsa=1; lsb=1; lsc=1;//第一位smg
P0=smgduan[mshi];
Delay(1);
P0=0x00;
lsa=0;lsb=1;lsc=1;//第二位smg
P0=smgduan[mge];
Delay(1);
P0=0x00;
lsa=1; lsb=0; lsc=1;//第三位smg
P0=smgduan[sshi];
Delay(1);
P0=0x00;
lsa=0; lsb=0; lsc=1;//第四位smg
P0=smgduan[sge];
Delay(1);
P0=0x00;
}
u8 s5,s6,s7,s8,m1,m2,m3,m4;
void Showsmg2(u8 m1,u8 m2,u8 m3,u8 m4)
{
lsa=1; lsb=1; lsc=0;//第一位smg
P0=smgduan[m1];
Delay(1);
P0=0x00;
lsa=0;lsb=1;lsc=0;//第二位smg
P0=smgduan[m2];
Delay(1);
P0=0x00;
lsa=1; lsb=0; lsc=0;//第三位smg
P0=smgduan[m3];
Delay(1);
P0=0x00;
lsa=0; lsb=0; lsc=0;//第四位smg
P0=smgduan[m4];
Delay(1);
P0=0x00;
}
void main() //主函数
{
TR0=0;//定时器关闭 不使用定时器
lnit1();
uart_init(0xfa);
while(1)
{
keyDown();
mshi=flag/10;
mge=flag%10;
sshi=num/10;
sge=num%10;
Showsmg(mshi,mge,sshi,sge);
Showsmg2(m1,m2,m3,m4);
if(m1==1&&m2==2&&m3==3&&m4==4)
{
TR0=0;
}
if(num==0&&flag==0)
{
while(3000)
{
beep=!beep;
Delay(1);
}
}
}
}
void Timer0() interrupt 1
{
TH0=(65536-45872)/256; //50ms
TL0=(65536-45872)%256;
t0++;
if(t0==20)
{ //循环二十次=1000ms
t0=0;
if(num==0&&flag!=0)
{
num=60;
flag--;
}
if(flag<=0)
{
flag=0;
}
num--;
}
}
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
RI = 0; //清除接收中断标志位
rec_data=SBUF; //存储接收到的数据
if(rec_data==1)
{
m1=1;
}
if(rec_data==2)
{
m2=2;
}
if(rec_data==3)
{
m3=3;
}
if(rec_data==4)
{
m4=4;
}
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}