#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8; //对数据类型进行声明定义
unsigned int k,s,m,h;//对时分秒进行定义
sbit LSA=P2^2; //定义位锁存引脚
sbit LSB=P2^3; //定义位锁存引脚
sbit LSC=P2^4; //定义位锁存引脚
sbit k1=P3^1; //定义开关k1控制,默认状态下为高电位,1
sbit k2=P3^0; //定义开关k2控制,默认状态下为高电位,1
sbit k3=P3^2; //定义开关k3控制,默认状态下为高电位,1
sbit beep=P1^5;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//显示0~F的值 ,还有时钟的-
u8 mb[8];//调用段码数组
void yanshi ();//消隐延时
void delay();//延时消抖
u8 KeyScan(u8 mode); //调用函数按键控制开关K
void datapros(); //调用函数按键控制时分秒增加
void delay()//延时消抖
{
unsigned int j ;
for(j=1;j<1000;j++);
}
void yanshi(u16 i) //延时10us
{
while(i--);
}
u8 KeyScan(u8 mode)//按键按下时位低电平,而默认时为高电平
{
static u8 keyen=1;
if(mode==1)
{
keyen=1;
}
if(keyen==1&&(k1==0||k2==0||k3==0))
{
delay(); //消抖处理
keyen=0;
if(k1==0)return 1; //按键选择时
else if(k2==0)return 2; //按键选择 分
else if(k3==0)return 3; //按键选择清零秒
}
else if(k1==1&&k2==1&&k3==1)
{
keyen=1;
}
return 0;
}
void datapros()
{
u8 key=KeyScan(0);
switch(key)
{
case 1: h++;if(h==24)h=0; break;// 控制时加
case 2: m++;if(m==60)m=0; break; // 控制分加
case 3: s=0; break;//秒清零
}
}
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0X3C; //给定时器赋初值,定时50ms
TL0=0XB0;
ET0=1;
EA=1;
TR0=1;//打开定时器
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[mb[i]];//发送段码
yanshi(1); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
Timer0Init();
while(1)
{
datapros();
if(TF0==1)
{
TF0=0;
TH0=0X3C; //给定时器赋初值,定时50ms
TL0=0XB0;
k++;
}
if(k==20) //到达1s时间
{
k=0;
s++;
}
if(s==60) //到达一分钟
{
s=0 ;
m++ ;
}
if(m==60) //到达一小时
{m=0;
h++;
}
if(h==24)h=0;
mb[0]=s%10; //秒表个位
mb[1]=s/10; //秒表十位
mb[2]=16; //-
mb[3]=m%10; //分表个位
mb[4]=m/10; //分表十位
mb[5]=16; //-
mb[6]=h%10; //时表个位
mb[7]=h/10; //时表十位
DigDisplay();//输送段码
}
}
|