//矩陣鍵盤說明:[4.1]設置時間,[4,2]保存設置,[4,3]設置鬧鐘,[4,4]關閉鬧鐘
//[1,1]~[3,2]按鈕分別代表數字0~9,按下數字自動進一位
#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; //時,分,秒,鍵盤數字,矩陣鍵盤
uchar modify,wei,clock,change,one_min;//修改,位選變量,定時,模式切換,一分鐘定時
uchar shi20,shi10,fen20,fen10,miao20,miao10,a1,a0,b1,b0,c1,c0;//中間變量
unsigned int time; //定時器
unsigned char code table[]={
0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x40};//0123456789- 共陰極
void delay(unsigned int z)//delay定時函數
{
unsigned int x,y;
for(x = z;x > 0;x--){
for(y =110;y > 0;y--);
}
}
void init()//初始化函數
{
TMOD = 0x01;//設置定時器0為工作方式1
TH0 = (65536-46080)/256;//裝入初值 頻率為11.0592MHz時46080
TL0 = (65536-46080)%256;//裝入初值 如果頻率為12MHz改為50000
EA = 1;//開總中斷
ET0 = 1;//開定時器0中斷
TR0 = 1;//開啟定時器0
modify=1;//1為確認,0為修改
}
void display(uchar shi2,uchar shi1,uchar separate2,uchar fen2,uchar fen1,uchar separate1,uchar miao2,uchar miao1)//00-00-00,時-分-秒
{
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()//判斷調整開關函數
{
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; //開始調整時間
change = 1; //1:時鐘模式,2:鬧鐘模式
break;
case 0xd7: //[4,2]
modify = 1; //結束調整時間
change = 0; //設置鬧鐘模式
clock = 0; //結束設置鬧鐘
break;
case 0xb7: //[4,3]
modify = 0; //調整鬧鐘時間
clock = 1; //開始設置鬧鐘
break;
case 0x77: //[4,4]
one_min = 0; //結束一分鐘鬧鈴
break;
}
}
}
}
void keyscan()//矩陣鍵盤掃描
{
{
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) //小時最高位為2
a1=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key; //當小時最高位為2時,低位最高為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) //小時最高位為2
shi20=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
shi10=key;
else
if(key<5)
a0=key; //當小時最高位為2時,低位最高為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))//一分鐘報時提示,修報時時間在這
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一個循環(huán),若要12h,只需在此改為12即可。,并改下面為s=1;
s=0;
}
}
}
}
|