|
#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);
}
/******************************************************************
函數(shù):init
功能:初始化
******************************************************************/
void init()
{
TMOD=0x21; //定時(shí)器0模式,使用工作方式1
TH0=(65536-50000)/256;//賦予初值 50ms
TL0=(65536-50000)%256;
EA=1;
ES=1;
ET0=1; //打開定時(shí)器,容許中斷
TR0=1; //打開終中斷
//串口中斷設(shè)置
SCON=0X50;
//TMOD=0X20;
PCON=0X80;
TH1=0Xf3;
TL1=0Xf3;
TR1=1;
hour=1;
min=1;
sec=5;
}
/******************************************************************
函數(shù):display
功能:1\數(shù)碼管數(shù)顯 2輸入時(shí)分秒進(jìn)行數(shù)顯
/******************************************************************/
void dispiay()
{
ucahr v;
//微位選打開所有數(shù)碼管
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];
}
/***********************************************
函數(shù):timer0 interrupt 1
功能:定時(shí)0 中環(huán)函數(shù)
************************************************/
void timer0 () interrupt 1
{
ucahr t0;
TH0=(65536-50000)/256;//賦予初值 50ms
TL0=(65536-50000)%256;
t0++;//五十毫秒為基礎(chǔ)單位,20此后達(dá)到一秒,進(jìn)行時(shí)分秒的換換算
if(t0==20)
{
t0=0;
if(sec==0)//對(duì)清清零情況進(jìn)行判定
{
if(hour==0&&min==0&&sec==0)
sec=0;
else
{
sec=59;
min--;
}
}
else//用以實(shí)現(xiàn)功能
sec--;
if(sec<0)//對(duì)秒的情況進(jìn)行判定
{
//sec=59;
if(hour==0&&min==0)
{
hour=0;
min=0;
sec=0;
}
else //n套入對(duì)分的判定
{
if(min>0)
min--;
else
{
min=59;
if(hour!=0)
hour--;
}
}
if(min<0)//對(duì)分鐘的判定
{
if(hour==0) //倒計(jì)時(shí)情況
{
min=0;
hour=0;
}
else //對(duì)分鐘及前位的操作
{
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);
}
}
/***********************************************
函數(shù);keydown
功能;掃描對(duì)應(yīng)矩陣按鍵,服賦予按鍵不同功能
*******************************************/
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分別控制第一二位(時(shí))
//4.5.6.7分別控制第三四位(分)
//8.9.10.11 控制七八位(秒)
//12.13.14.15 清空時(shí),分,秒,全部
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;
}
}
/***********************************************
函數(shù);chuankou
功能;利用上位機(jī)直接修改數(shù)值
********************************************/
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;
}
}
/************************************************
主函數(shù)
*************************************************/
void main()
{
init();
while(1)
{
keydown(); //矩陣掃描并修改數(shù)值
datepros();//產(chǎn)傳送數(shù)值到數(shù)組內(nèi)
dispiay();//數(shù)顯
}
}
普中的板子
|
|