|
//矩陣鍵盤(pán)說(shuō)明:[4.1]設(shè)置時(shí)間,[4,2]保存設(shè)置,[4,3]設(shè)置鬧鐘,[4,4]關(guān)閉鬧鐘
//[1,1]~[3,2]按鈕分別代表數(shù)字0~9,按下數(shù)字自動(dòng)進(jìn)一位
#include<reg52.h>
#define uchar unsigned char
sbit beep=P2^3;//蜂鳴器
sbit dula=P2^6;//段選
sbit wela=P2^7;//位選
uchar s,f,m,key,temp; //時(shí),分,秒,鍵盤(pán)數(shù)字,矩陣鍵盤(pán)
uchar modify,wei,clock,change,one_min;//修改,位選變量,定時(shí),模式切換,一分鐘定時(shí)
uchar shi20,shi10,fen20,fen10,miao20,miao10,a1,a0,b1,b0,c1,c0;//中間變量
unsigned int time; //定時(shí)器
unsigned char code table[]={
0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x40};//0123456789- 共陰極
void delay(unsigned int z)//delay定時(shí)函數(shù)
{
unsigned int x,y;
for(x = z;x > 0;x--){
for(y =110;y > 0;y--);
}
}
void init()//初始化函數(shù)
{
TMOD = 0x01;//設(shè)置定時(shí)器0為工作方式1
TH0 = (65536-46080)/256;//裝入初值 頻率為11.0592MHz時(shí)46080
TL0 = (65536-46080)%256;//裝入初值 如果頻率為12MHz改為50000
EA = 1;//開(kāi)總中斷
ET0 = 1;//開(kāi)定時(shí)器0中斷
TR0 = 1;//開(kāi)啟定時(shí)器0
modify=1;//1為確認(rèn),0為修改
}
void display(uchar shi2,uchar shi1,uchar separate2,uchar fen2,uchar fen1,uchar separate1,uchar miao2,uchar miao1)//00-00-00,時(shí)-分-秒
{
dula=1;
P0=table[shi2];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[shi1];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[separate2];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;
P0=table[fen2];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1;
P0=table[fen1];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[separate1];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
dula=1;
P0=table[miao2];
dula=0;
P0=0xff;
wela=1;
P0=0xbf;
wela=0;
delay(1);
dula=1;
P0=table[miao1];
dula=0;
P0=0xff;
wela=1;
P0=0x7f;
wela=0;
delay(1);
}
void keyscan0()//判斷調(diào)整開(kāi)關(guān)函數(shù)
{
P3 = 0xf7;
temp = P3;
temp = temp & 0xf0;
if(temp != 0xf0)
{
delay(10);
temp = P3;
temp = temp & 0xf0;
if(temp != 0xf0)
{
temp = P3;
switch(temp)
{
case 0xe7: //[4,1]
modify = 0; //開(kāi)始調(diào)整時(shí)間
change = 1; //1:時(shí)鐘模式,2:鬧鐘模式
break;
case 0xd7: //[4,2]
modify = 1; //結(jié)束調(diào)整時(shí)間
change = 0; //設(shè)置鬧鐘模式
clock = 0; //結(jié)束設(shè)置鬧鐘
break;
case 0xb7: //[4,3]
modify = 0; //調(diào)整鬧鐘時(shí)間
clock = 1; //開(kāi)始設(shè)置鬧鐘
break;
case 0x77: //[4,4]
one_min = 0; //結(jié)束一分鐘鬧鈴
break;
}
}
}
}
void keyscan()//矩陣鍵盤(pán)掃描
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: //[1,1]
key=0;
wei++;
break;
case 0xde: //[1,2]
key=1;
wei++;
break;
case 0xbe: //[1,3]
key=2;
wei++;
break;
case 0x7e: //[1,4]
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: //[2,1]
key=4;
wei++;
break;
case 0xdd: //[2,2]
key=5;
wei++;
break;
case 0xbd: //[2,3]
key=6;
wei++;
break;
case 0x7d: //[2,4]
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: //[3,1]
key=8;
wei++;
break;
case 0xdb: //[3,2]
key=9;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}
void main()
{
init();
while(1)
{
keyscan0();
if(modify==1)
{
TR0=1;
wei=0;
a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,10,b1,b0,10,c1,c0);
}
else//(modify == 0)
{
if(change==1)
{
TR0=0;
keyscan();
switch(wei)
{
case 1: if(key<3) //小時(shí)最高位為2
a1=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key; //當(dāng)小時(shí)最高位為2時(shí),低位最高為4
break;
case 3: if(key<6) //分鐘最高位為5
b1=key;
else
wei--;
break;
case 4: b0=key; break;
case 5: if(key<6) //秒最高位為5
c1=key;
else
wei--;
break;
case 6: c0=key; break;
}
m=c1*10+c0;
f=b1*10+b0;
s=a1*10+a0;
display(a1,a0,10,b1,b0,10,c1,c0);
}
if(clock==1)
{
TR0=0;
display(shi20,shi10,10,fen20,fen10,10,miao20,miao10);
keyscan();
switch(wei)
{
case 1: if(key<3) //小時(shí)最高位為2
shi20=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
shi10=key;
else
if(key<5)
a0=key; //當(dāng)小時(shí)最高位為2時(shí),低位最高為4
break;
case 3: if(key<6) //分鐘最高位為5
fen20=key;
else
wei--;
break;
case 4: fen10=key; break;
case 5: if(key<6) //秒最高位為5
miao20=key;
else
wei--;
break;
case 6: miao10=key; break;
}
one_min=1;
display(shi20,shi10,10,fen20,fen10,10,miao20,miao10);
}
}
if(one_min==1)//鬧鈴
{
if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0==miao10))
beep=0;
}
if(((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10+1)&&(c1==miao20)&&(c0==miao10))||(one_min==0))//一分鐘報(bào)時(shí)提示,修報(bào)時(shí)時(shí)間在這
beep=1;
}//while
}
void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
time++;
if(time==20)
{
time=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24) //為24h一個(gè)循環(huán),若要12h,只需在此改為12即可。,并改下面為s=1;
s=0;
}
}
}
}
|
|