我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1283|回复: 0

时分秒计时并能进行按键更改

[复制链接]

该用户从未签到

135

主题

2418

回帖

6591

积分

二级逆天

积分
6591

社区居民社区劳模原创达人最爱沙发忠实会员终身成就奖优秀斑竹奖

QQ
发表于 2015-3-19 15:59:24 | 显示全部楼层 |阅读模式
/*=============================程序说明===============================
项目名称:
    :
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/
//==========================头文件加载===============================
#include <reg52.h>
//===========================端口声明================================
sbit Key1=P3^2;//声明按键1Key1)接在单片机的P3.2端口。
sbit Key2=P3^3;//声明按键2Key2)接在单片机的P3.3端口。
sbit Key3=P3^4;//声明按键3Key3)接在单片机的P3.4端口。
sbit Key4=P3^5;//声明按键4Key4)接在单片机的P3.5端口。
//=========================全局常量声明==============================

//=========================全局变量声明==============================
unsigned char sec=0;//秒计数。(059
unsigned char min=0;//分计数。(059
unsigned char hour=0;//小时计数。(023
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位数据(0F)。
    入: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);
                            }
                           
                   }
         }        
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表