#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define ucahr unsigned char
#define key P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5;
uint hour,min,sec;
ucahr date[8];
ucahr a;
uint code table[16]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴
void delay(uint x)
{
uint i,j;
for(i=0;i<x;++i)
for(j=0;j<110;++j);
}
/******************************************************************
函数:init
功能:初始化
******************************************************************/
void init()
{
TMOD=0x21; //定时器0模式,使用工作方式1
TH0=(65536-50000)/256;//赋予初值 50ms
TL0=(65536-50000)%256;
EA=1;
ES=1;
ET0=1; //打开定时器,容许中断
TR0=1; //打开终中断
//串口中断设置
SCON=0X50;
//TMOD=0X20;
PCON=0X80;
TH1=0Xf3;
TL1=0Xf3;
TR1=1;
hour=1;
min=1;
sec=5;
}
/******************************************************************
函数:display
功能:1\数码管数显 2输入时分秒进行数显
/******************************************************************/
void dispiay()
{
ucahr v;
//微位选打开所有数码管
for(v=0;v<8;v++)
{
switch(v)
{
case 0 :
LSA=1;LSB=1;LSC=1;break;
case 1 :
LSA=0;LSB=1;LSC=1;break;
case 2 :
LSA=1;LSB=0;LSC=1;break;
case 3 :
LSA=0;LSB=0;LSC=1;break;
case 4 :
LSA=1;LSB=1;LSC=0;break;
case 5 :
LSA=0;LSB=1;LSC=0;break;
case 6 :
LSA=1;LSB=0;LSC=0;break;
case 7 :
LSA=0;LSB=0;LSC=0;break;
}
P0=date[v];
delay(1);
P0=0x00;
}
}
void datepros()
{
date[0]=table[hour/10];
date[1]=table[hour%10];
date[2]=0x40;
date[3]=table[min/10];
date[4]=table[min%10];
date[5]=0x40;
date[6]=table[sec/10];
date[7]=table[sec%10];
}
/***********************************************
函数:timer0 interrupt 1
功能:定时0 中环函数
************************************************/
void timer0 () interrupt 1
{
ucahr t0;
TH0=(65536-50000)/256;//赋予初值 50ms
TL0=(65536-50000)%256;
t0++;//五十毫秒为基础单位,20此后达到一秒,进行时分秒的换换算
if(t0==20)
{
t0=0;
if(sec==0)//对清清零情况进行判定
{
if(hour==0&&min==0&&sec==0)
sec=0;
else
{
sec=59;
min--;
}
}
else//用以实现功能
sec--;
if(sec<0)//对秒的情况进行判定
{
//sec=59;
if(hour==0&&min==0)
{
hour=0;
min=0;
sec=0;
}
else //n套入对分的判定
{
if(min>0)
min--;
else
{
min=59;
if(hour!=0)
hour--;
}
}
if(min<0)//对分钟的判定
{
if(hour==0) //倒计时情况
{
min=0;
hour=0;
}
else //对分钟及前位的操作
{
min=59;
hour--;
}
}
}
}
if(sec==0&&min==0&&hour!=0)
{
hour--;
min=59;
sec=59;
}
if(hour==0&&min==0&&sec==0)
{
beep=~beep;
//delay(1);
}
}
/***********************************************
函数;keydown
功能;扫描对应矩阵按键,服赋予按键不同功能
*******************************************/
void keydown(void)
{
uint k1;
//uchar a;
key=0x0f;
if(key!=0x0f)
{
//waterfall_display();
delay(10);
if(key!=0x0f)
{
key=0X0F;//开列
switch(key)
{
case 0x07:k1=0;
break;
case 0x0b:k1=1;
break;
case 0x0d:k1=2;
break;
case 0x0e:k1=3;
break;
}
key=0xf0;//开行
switch(key)
{
case 0x70:k1=k1;
break;
case 0xb0:k1=k1+4;
break;
case 0xd0:k1=k1+8;
break;
case 0xe0:k1=k1+12;
break;
}
}
//while((key!=0xf0)&&(a<50))
while(key!=0xf0)
{
delay(10);
// a++;
}
}
//赋予按键功能
//0.1.2.3分别控制第一二位(时)
//4.5.6.7分别控制第三四位(分)
//8.9.10.11 控制七八位(秒)
//12.13.14.15 清空时,分,秒,全部
if(k1==0)
{
hour=hour+10;
}
if(k1==1)
{
if(hour>=10)
hour=hour-10;
else
hour=0;
}
if(k1==2)
hour++;
if(k1==3)
{
if(hour>=1)
hour--;
else
hour=0;
}
if(k1==4)
{
min=min+10;
if(min>=60)
min=min-60;
}
if(k1==5)
{
if(min>=10)
min=min-10;
else
{
if(min==0)
min=50;
else
min=60-min;
}
}
if(k1==6)
{
min++;
if(min>=60)
min=60-min;
}
if(k1==7)
{
if(min>=1)
min--;
else
min=59;
}
if(k1==8)
{
sec=sec+10;
if(sec>=60)
sec=sec-60;
}
if(k1==9)
{
if(sec>10)
sec=sec-10;
else
{
if(sec==0)
sec=50;
else
sec=60-sec;
}
}
if(k1==10)
{
sec++;
if(sec>=60)
sec=sec-60;
}
if(sec==11)
{
if(sec>=1)
sec--;
else
{
if(sec==0)
sec=59;
else
sec=60-sec;
}
}
if(k1==12)
hour=0;
if(k1==13)
min=0;
if(k1==14)
sec=0;
if(k1==15)
{
hour=0;
min=0;
sec=0;
}
}
/***********************************************
函数;chuankou
功能;利用上位机直接修改数值
********************************************/
void Usr() interrupt 4
{
uint re;
//ucahr re1;
//ucahr re2;
re=SBUF;
RI=0;
SBUF=re;
while(TI==0);
TI=0;
a++;
re=re/16*10+re%16;
if(a==1)
hour=re;
if(a==2)
min=re;
if(a==3)
{
sec=re;
a=0;
}
}
/************************************************
主函数
*************************************************/
void main()
{
init();
while(1)
{
keydown(); //矩阵扫描并修改数值
datepros();//产传送数值到数组内
dispiay();//数显
}
}
普中的板子
|