#include <stc15.h> //包含支持IAP15W4K58S4單片機的頭文件
#include <intrins.h>
#include <gpio.h> //I/O初始化文件
#define uchar unsigned char
#define uint unsigned int
#include <595hc.h>
/*--------定義k0、k1、k2輸入引腳----------*/
sbit k0=P3^2;
sbit k1=P3^3;
sbit k2=P3^4;
uchar data timedata[6]={0x00,0x00,0x00,0x00,0x02,0x01,}; //計時單元數據初值,共6個
uchar data con1s=0x00,con03s=0x00,con=0x00; //秒定時用
uchar a=16,b; //用于閃爍功能交換數據用
/*―――――系統(tǒng)時鐘為11.0592MHz時為10ms的延時函數―――――――――*/
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
/*-------------------鍵盤掃描子程序--------------------------*/
keyscan()
{
EA=0;
if(k0==0)
{
Delay10ms();
while(k0==0);
if(Dis_buf[7-con]==16)
{
b=Dis_buf[7-con];Dis_buf[7-con]=a;
a=b;
}
con++;TR0=0;ET0=0;TR1=1;ET1=1;
if(con>=6)
{con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
}
if(con!=0)
{
if(k1==0)
{
Delay10ms();
while(k1==0);
timedata[con]++;
switch(con)
{
case 1:
case 3: if(timedata[con]>=6) //判斷是否是分、秒十位,如是加到大于5,變?yōu)?
{timedata[con]=0;}
break;
case 2:
case 4: if(timedata[con]>=10) //判斷是否是時、分個位,如是加到大于9,變?yōu)?
{timedata[con]=0;}
break;
case 5: if(timedata[con]>=3) //判斷是否是小時十位,如是加到大于2,變?yōu)?
{timedata[con]=0;}
break;
default:;
}
Dis_buf[7-con]=timedata[con];a=0x10;
}
}
if(con!=0)
{
if(k2==0)
{
Delay10ms();
while(k2==0);
switch(con)
{
case 1:
case 3: if(timedata[con]==0) //判斷是否是分、秒十位,如是減到等于
//0,變?yōu)?
{timedata[con]=0x05;}
else {timedata[con]--;}
break;
case 2:
case 4: if(timedata[con]==0) //判斷是否是時、分個位,
//如是減到等于0,變?yōu)?
{timedata[con]=0x09;}
else {timedata[con]--;}
break;
case 5: if(timedata[con]==0) //判斷是否是小時十位,如是減到等于0,變?yōu)?
{timedata[con]=0x02;}
else {timedata[con]--;}
break;
default:;
}
Dis_buf[7-con]=timedata[con];a=0x10;
}
}
EA=1;
}
/*-------------定時器初始化------------------------------------*/
T_init()
{
int i;
for(i=0;i<6;i++) //將計時單元值填充到顯示緩沖區(qū)
{
Dis_buf[7-i]=timedata[i];
}
TH0 = 0X3C; TL0 = 0XB0; //50ms定時初值
TH1 = 0X3C; TL1 = 0XB0;
TMOD = 0X00; ET0 = 1;ET1 = 1; TR0 = 1; TR1 = 0; EA=1;
}
/*-----------------------主程序-------------------------------*/
main()
{
T_init();
while(1)
{
display();
keyscan();
}
}
/*--------------------------------T0中斷處理子程序-----------------*/
void Timer0_int (void) interrupt 1
{
ET0=0;TR0=0;TH0=0X3C;TL0=0XB0; TR0=1;
con1s++;
if(con1s==20)
{
con1s=0x00;
timedata[0]++;
if(timedata[0]>=10)
{
timedata[0]=0;timedata[1]++;
if(timedata[1]>=6)
{
timedata[1]=0;timedata[2]++;
if(timedata[2]>=10)
{
timedata[2]=0;timedata[3]++;
if(timedata[3]>=6)
{
timedata[3]=0;timedata[4]++;
if(timedata[4]>=10)
{
timedata[4]=0;timedata[5]++;
}
if(timedata[5]==2)
{
if(timedata[4]==4)
{
timedata[4]=0;timedata[5]=0;
}
}
}
}
}
}
Dis_buf[7]=timedata[0];
Dis_buf[6]=timedata[1];
Dis_buf[5]=timedata[2];
Dis_buf[4]=timedata[3];
Dis_buf[3]=timedata[4];
Dis_buf[2]=timedata[5];
}
ET0=1;
}
/*-----------------------0.3s閃爍中斷子程序----------------------*/
void Timer1_int (void) interrupt 3
{
con03s++;
if(con03s==6)
{
con03s=0x00;
b=Dis_buf[7-con];Dis_buf[7-con]=a;a=b;
}
}
|