|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/*=============================程序说明===============================
项目名称:
作 者:
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/
//==========================头文件加载===============================
#include <reg52.h>
//===========================端口声明================================
sbit Key1=P3^2;//声明按键1(Key1)接在单片机的P3.2端口。
sbit Key2=P3^3;//声明按键2(Key2)接在单片机的P3.3端口。
sbit Key3=P3^4;//声明按键3(Key3)接在单片机的P3.4端口。
sbit Key4=P3^5;//声明按键4(Key4)接在单片机的P3.5端口。
//=========================全局常量声明==============================
//=========================全局变量声明==============================
unsigned char sec=0;//秒计数。(0~59)
unsigned char min=0;//分计数。(0~59)
unsigned char hour=0;//小时计数。(0~23)
unsigned char Data[]={0,0,16,0,0,16,0,0};
//数码管显示数组。
//===========================函数声明================================
void delay(unsigned int Time);//延时函数
void display(unsigned char Data[]);//数码管动态显示函数。
void TestKey(void);//按键测试函数。
//============================主函数=================================
void main()//主函数
{
unsigned char t=0;
//---------------------------系统初始化--------------------------
sec=0;//从0秒开始。
min=0;//从0分开始。
hour=0;//从0时开始。
while(1)//死循环
{
//------------------拆分时、分秒到Data数组中-----------------
Data[0]=hour/10;//拆分“时”的十位到第1个数码管上显示
Data[1]=hour%10;//拆分“时”的个位到第2个数码管上显示
Data[3]=min/10;//拆分“分”的十位到第4个数码管上显示
Data[4]=min%10;//拆分“分”的个位到第5个数码管上显示
Data[6]=sec/10;//拆分“秒”的十位到第7个数码管上显示
Data[7]=sec%10;//拆分“秒”的个位到第8个数码管上显示
//------------------------显示Data数组-----------------------
for(t=0;t<20;t++)
display(Data);//数码管显示。
//--------------------------按键判断-------------------------
TestKey();
//--------------------------计时自加-------------------------
sec++;//秒加1计时。
if(sec>59)//如果秒到了60
{
sec=0;//秒位清0
min++;//分位加1计时
if(min>59)//如果分到60。
{
min=0;//分位清0。
hour++;//时位加1计时。
if(hour>23)//如果时到24。
hour=0;//则从0时开始
}
}
}
}
//==========================功能子函数===============================
/*-------------------------------------------------------------------
函数名称:延时函数
功 能:进行软件延时
输 入:Time(延时的时间,单位US)
输 出:无
说 明:
-------------------------------------------------------------------*/
void delay(unsigned int Time)
{
while(Time--);
}
/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
功 能:在数码管上显示8位数据(0~F)。
输 入:Data[]//8位数码管要显示的数据。
输 出:无
说 明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
unsignedchar code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
0xa1,0x86,0x8e,0xbf,0xff};
unsignedchar code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsignedchar i=0;//记录显在哪位上。
unsignedchar Time=0; //延时计数。
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data];//送段选码。
WR=0;//开
WR=1;//关
//---------位选------------
P2=0xf8;
P0=Bit;
WR=0;
WR=1;
//---------扫频延时------------
Time=50;
while(Time--);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
}
/*-----------------------------------------------------------------
函数名称:按键测试函数
功 能:
输 入:无
输 出:无
说 明:
-------------------------------------------------------------------*/
void TestKey(void)
{
//---------------------按键1,每按下,时位加1--------------------
if(Key1==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key1==0)
display(Data);
{
//-----------hour变量加一------------
hour++;
//----------过界判断-----------------
if(hour>23)hour=0;
//----------松手检测-----------------
while(Key1==0)
{
display(Data);
}
}
}
//---------------------按键2,每按下,时位减1--------------------
if(Key2==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key2==0)
display(Data);
{
//-----------cout变量减一------------
hour--;
//----------过界判断-----------------
if(hour==-1)hour=23;
//----------松手检测-----------------
while(Key2==0)
{
display(Data);
}
}
}
//---------------------按键3,每按下,分位加1--------------------
if(Key3==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key3==0)
display(Data);
{
//-----------cout变量减一------------
min++;
//----------过界判断-----------------
if(min>59) min=0;
//----------松手检测-----------------
while(Key3==0)
{
display(Data);
}
}
}
//---------------------按键4,每按下,分位减1--------------------
if(Key4==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key4==0)
display(Data);
{
//-----------cout变量减一------------
min--;
//----------过界判断-----------------
if(min==-1)min=59;
//----------松手检测-----------------
while(Key4==0)
{
display(Data);
}
}
}
} |
|