按键处理程序分析与设计

合集下载

按键处理程序C语言单片机

按键处理程序C语言单片机

按键处理程序C语言单片机分享一种按键处理程序(用C)//头文件定义:Ustruct KEY{Uchar Val;#define Key_Model_C 0 //按键1值#define Key_AddVal_C 1 //按键2值Uint ScanOnTime;Uchar LongKeyState;Uchar LongKeyRestState;Uchar SetInRn;Uchar Model; //按键状态(模式)#define Off_C 0 //之前未按下#define On_C 1 //现按下#define Delay_C 2 //按键处理后标志}Key;//----------------定义两个IO输入口为按键入口--------------------//#define KeyMo_Bin (GPIOB->IDR.Bit.B5)#define KeyAdd_Bin (GPIOB->IDR.Bit.B6)/*===================================== ==========================*/GPIO_Init(GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); //初始化为上拉输入无中断/*===================================== ==========================*///主程序大循环中每1毫秒扫描1次void KeyScan(void){if(Key.LongKeyRestState == 1) //长按键标志(复位处理长按键){if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1)) //当两按键均抬起{if(++Key.ScanOnTime >= 130) //延时后复位{Key.LongKeyRestState=0;Key.Model=Delay_C;}}elseKey.ScanOnTime=0;return;}if(Key.Model == Off_C) //如果当前按键状态为未按下“Off_C”{if((KeyMo_Bin == 0) || (KeyAdd_Bin == 0))//按键1或按键2已按下(低有效){if(++Key.ScanOnTime >= 10) //当按下后自加1,加够10次即1ms*10=10ms去抖动{Key.ScanOnTime=0;if(KeyMo_Bin == 0) //如果按键1为0即按下{Key.Val=Key_Model_C; //付当键1值(看头文件定义)Key.Model=On_C; //置按键已按下标志}else if(KeyAdd_Bin == 0) //如果按键2为0即按下{Key.Val=Key_AddVal_C; //付当键2值(看头文件定义)Key.Model=On_C; //置按键已按下标志}BellOn(200); //蜂鸣器响}}elseKey.ScanOnTime=0; //清去抖延时计数值}else if(Key.Model == Delay_C) //如果当前按键状态为已按下且已处理“Delay_C”{if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1))//如果两按键均抬起{if(++Key.ScanOnTime >= 100) //延时100ms后复位按键状态为“Off_C”{Key.SetInRn=0;Key.ScanOnTime=0;Key.Model=Off_C;}}else //如果按键没有被抬起,对应上面if{if(++Key.ScanOnTime >= 1000) //延时1000ms后再复位按键状态为“Off_C”(为长按处理){Key.ScanOnTime=0;Key.Model=Off_C;}}}}//===================================== ========================================= ========void LoadCheckKeyRest(void){Key.LongKeyRestState=1;Key.ScanOnTime=0;}//===================================== ========================================= ========//处理相应按键(可250ms才调用一次)长按if(Key.Model == On_C) //按键状态为已按下{if(Key.Val == Key_Model_C) //是键1按下(看头文件定义){if(++Key.SetInRn >= 3) //连计3次数3秒后为长按键(对应上面,如果按下未抬起的话会延时1000ms){Key.SetInRn=0;LoadCheckKeyRest(); //调清长按处理BellOn(600); //蜂鸣器响//-----------长按需处理的内容-----下-----------//WorkStateBit.Bit.SettingMo=1;SetOverTime=0;SetMoRn=0;SetBak[0]=Rtc_InitDate.RTC_Year;SetBak[1]=Rtc_InitDate.RTC_Month;SetBak[2]=Rtc_InitDate.RTC_Date;SetBak[3]=Rtc_InitDate.RTC_WeekDay;SetBak[4]=Rtc_InitTime.RTC_Hours;SetBak[5]=Rtc_InitTime.RTC_Minutes;//-----------长按需处理的内容------上----------//Key.Model=Delay_C; //置按键模式为:已处理按键(看头文件定义)return;}}elseKey.SetInRn=0;Key.Model=Delay_C;}。

单片机按键课程设计

单片机按键课程设计

单片机按键课程设计一、课程目标知识目标:1. 让学生掌握单片机基础知识和按键的工作原理;2. 帮助学生了解按键在单片机系统中的应用和编程方法;3. 使学生能够运用所学知识设计简单的单片机按键控制系统。

技能目标:1. 培养学生动手实践能力,能够独立完成单片机按键电路的搭建;2. 提高学生编程能力,掌握单片机按键程序的设计与调试;3. 培养学生解决问题的能力,能够针对实际需求设计合适的单片机按键方案。

情感态度价值观目标:1. 培养学生对单片机技术及电子制作的兴趣,激发创新意识;2. 培养学生团队合作精神,学会分享和交流;3. 增强学生面对困难的勇气和毅力,培养勇于挑战的精神。

课程性质分析:本课程为实践性较强的课程,注重理论知识与实践操作的相结合,以培养学生的动手能力和创新能力为核心。

学生特点分析:学生处于初中或高中年级,具有一定的物理和数学基础,对电子技术和编程有一定了解,好奇心强,喜欢动手实践。

教学要求:结合学生特点,注重理论与实践相结合,充分调动学生的积极性,引导学生主动参与,提高学生的实践能力和创新能力。

在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。

二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理、引脚功能等,结合教材相关章节,为学生建立单片机的基本概念。

2. 按键工作原理:讲解按键的物理原理、电路连接方式、去抖动方法等,使学生了解按键在单片机系统中的应用。

3. 单片机按键编程:教授单片机按键程序设计方法,包括I/O口编程、中断处理等,结合教材实例进行讲解。

4. 按键电路搭建:指导学生动手搭建单片机按键电路,学会使用面包板、电子元件等,培养实际操作能力。

5. 按键程序设计与调试:教授编程软件的使用,引导学生编写、调试按键程序,掌握程序设计的基本方法。

6. 应用实例分析:分析典型单片机按键控制系统实例,使学生了解实际应用中的设计方法和技巧。

教学进度安排:1. 第1课时:单片机基础知识及按键工作原理介绍;2. 第2课时:单片机按键编程方法讲解;3. 第3课时:按键电路搭建及编程实践;4. 第4课时:按键程序设计与调试;5. 第5课时:应用实例分析及总结。

ZStack协议按键处理流程分析

ZStack协议按键处理流程分析

在分析之前我先说一下ZStack协议栈有很多版本,版本不一样,代码多少有一些不一样,我的ZStack是ZStack-CC2530-2.3.1-1.4.0。

另外我的这篇文章中有很多内容是参考网友的文章,不知道有没有侵犯版权。

我自己总结一下按键处理流程,在ZStack协议栈中,按键的处理有两种方式,一种是中断方式,另一种是轮询方式,在这里,我以中断的方式来处理按键。

我的按键接在P0_1,如图所示:从图中可以看出,当按键没有按下的时候P0_1引脚为高电平,当按键按下时,引脚变成低电平,在这里,我的按键的中断触发方式为下降沿有效。

为了让按键按下后,程序能做点事情,我以LED灯为例,也就是说,当按键按下后,我让LED的状态翻转,也就是说按键按下一次,LED灯亮,在按下一次,LED灯灭,在按一下一次,LED灯亮……。

下图是LED的引脚图:纵观总的ZStack协议栈,我们发现P0_1和P1_0接的正好是按键和LED灯,因此在协议栈中,关于的按键和LED灯的代码我们不需要修改的太多。

我从main函数开始一步一步的分析,为了减小篇幅和代码量,我只分析与按键和中断有关的代码。

Int main(){// Turn off interrupts关闭中断osal_int_disable( INTS_ALL );//就是设置EA为0,EA为各种中断的总开关// Initialization for board related stuff such as LEDs//初始化系统时钟,LED等HAL_BOARD_INIT();//这个里面我没有动//电压检测,最好是能保证芯片能正常工作的电压// Make sure supply voltage is high enough to runzmain_vdd_check();// Initialize board I/O初始化板载IOInitBoard( OB_COLD );// Initialze HAL drivers初始化HAL驱动HalDriverInit();// Initialize NV System初始化NV系统osal_nv_init( NULL );// Initialize the MAC初始化MACZMacInit();// Determine the extended address确定IEEE地址zmain_ext_addr();#if defined ZCL_KEY_ESTABLISH// Initialize the Certicom certificate information. zmain_cert_init();#endif// Initialize basic NV items//初始化基本NV条目zgInit();#ifndef NONWK// Since the AF isn't a task, call it's initialization routine afInit();#endif// Initialize the operating system//初始化操作系统osal_init_system();// Allow interrupts使能所有中断,就是让EA为1 osal_int_enable( INTS_ALL );// Final board initialization最后的板载初始化InitBoard( OB_READY );// Display information about this devicezmain_dev_info();/* Display the device info on the LCD */#ifdef LCD_SUPPORTEDzmain_lcd_init();#endif#ifdef WDT_IN_PM1/* If WDT is used, this is a good place to enable it. */ WatchDogEnable( WDTIMX );#endifosal_start_system(); // No Return from herereturn 0; // Sh}在这里只分析红色部分的代码:// Initialize board I/O初始化板载IOInitBoard( OB_COLD );我们进入到到这个函数void InitBoard( uint8 level ){if ( level == OB_COLD ){// IAR does not zero-out this byte below the XSTACK.*(uint8 *)0x0 = 0;// Interrupts offosal_int_disable( INTS_ALL );// Check for Brown-Out resetChkReset();}else // !OB_COLD{/* Initialize Key stuff *///这个函数的作用是对按键使用的IO进行初始以及设置按键工作方式,按键IO初始化主要是将按键所对应的IO口定义为输入口//如果这个函数的第一个参数是HAL_KEY_INTERRUPT_ENABLE,那么按下该按键会触发IO终端,因此这个函数还要对IO终端//进行初始化的配置;如果这个函数的第一个参数是HAL_KEY_INTERRUPT_DISABLE,那么主程序后周期性的执行按键扫描程序//查看按键状态HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE,OnBoard_KeyCallback);//在TI的源码中,第一个参数是HAL_KEY_INTERRUPT_DISABLE}}进入这个函数的时候,if条件成立,在这个if语句中没有做什么实际的事情,我们不管它,else语句不成立,我暂且先部分分析,在下面还会被调用,在下面我们在分析这个else语句。

按键识别及程序设计与调试

按键识别及程序设计与调试

1.2程序的调试方法
软件设计可与硬件设计同时进行,这样便会出现没有硬 件调试平台的情况,此时可以进行软件仿真,人为地加入一 些信号,比如按键信号(高低电平)、中断信号(高低电平)。 与 Proteus结合,可以模拟出大部分的现场工作环境。 软件调试分成分调(调模块程序)和联调(调整个程序)两 个步骤,软件调试可以通过单步运行、设断点、连续运行、 观察变量等手段来进行。调试软件所花费的时间不比编写软 件所花的时间短,在写完一个子程序后,得反复考虑是否有 考虑不周的地方,它对特殊情况能否处理。 在调试的过程中,你会碰到这样那样的问题,你可以提 出这样那样的假设,但是你得去验证。也就是说你可以提出 一个个的可能,但是你得想法设法去验证每一个可能性,把 根本不可能的排除,剩下的那个就是故障了!
1.1按键识别设计
硬件设计1、独立式按Fra bibliotek 2、矩阵式按键
软件设计
1、设计思路:见《按键漫谈.pdf》。
1.2程序的编写思路
首先,要思考一下所要实现的功能,相应的应该进行哪 些步骤,写出主程序流程图。 接着,思考一下每一步骤的过程,相应的写出子程序的 流程图,是否有其它实现方法,并考虑一下每个子程序之间 的相互关系。 根据主程序流程图可以编写出主程序。 根据子程序流程图可以编写出各个子程序以及中断处理 函数。 当然,在编写过程中,可能会发现流程图并不完善,可 以随时返回修改流程图,并对源程序加以修改。

最为精辟和实用的按键处理程序

最为精辟和实用的按键处理程序

最为精辟和实用的按键处理程序1.新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。

我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。

因为这是实际项目中总结出来的经验,学校里面学不到的东西。

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。

当然,我自己也是在多个项目用过,效果非常好的。

好了,工程人员的习惯,废话就应该少说,开始吧。

以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。

用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。

核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。

有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。

1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

2:算法1,用来计算触发变量的。

一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

单片机按键处理方式(一)——典型的按键处理方式

单片机按键处理方式(一)——典型的按键处理方式

单⽚机按键处理⽅式(⼀)——典型的按键处理⽅式前⾔ 按键处理是学习单⽚机的必修课之⼀。

⼀次按键的过程,并⾮是⼀个理想的有⼀定宽度的电平脉冲,⽽是在按下、弹起过程中存在抖动,只有在中间阶段电平信号是稳定的。

⼀次典型的按键过程是酱紫的: 在抖动过程中,电平信号⾼低反复变化,如果你的按键检测是检测下降沿或上升沿或者是⽤外部中断检测按键,都可能在抖动时重复检测到多次按键。

这就是在未消抖的按⼀次键显⽰值加1的程序中,出现按⼀次键显⽰值+2、+3甚⾄加更多的原因。

对于按键消抖,常⽤的有硬件消抖和软件消抖。

本⽂是我个⼈对按键处理的⼀些常见⽅法的总结,由于我本⼈不太懂硬件,所以这⾥只讨论独⽴按键的软件消抖实现。

⽔平有限,如有错误请不吝指正。

硬件环境 本⽂代码均在单⽚机STC90C516RD+、晶振12.0MHz硬件环境下试验通过。

带消抖的简单的按键处理 最简单的消抖处理就是在⾸次检测到电平变化后加⼀个延时,等待抖动停⽌后再次检测电平信号。

这也是⼤多数单⽚机教程讲述的消抖⽅式。

但在实际应⽤中基本不⽤这种⽅式,原因后⾯讲,先看代码://⽅法⼀:带消抖的简单的按键处理#include <reg52.h>#define GPIO_KEY P1 //8个独⽴按键IO⼝#define GPIO_LED P0 //8个LED灯,⽤于显⽰键值unsigned char ScanKey();void DelayXms(unsigned char x);void main(){unsigned char key;GPIO_LED = 0x00; //初始化LEDwhile (1){key = ScanKey(); //读取键值// if (0xff != key) //若有键按下,则更新LED的状态GPIO_LED = ~key; //点亮LED}}unsigned char ScanKey(){unsigned char keyValue = 0xff; //赋初值,0xff表⽰没有键按下GPIO_KEY = 0xff; //给按键IO⼝置位if (0xff != GPIO_KEY) //检查按键IO⼝的电平,如有键按下则不为0xff{DelayXms(15); //延时15ms,滤掉抖动。

单片机按键程序设计及电路设计

单片机按键程序设计及电路设计

单片机按键程序设计及电路设计在单片机应用系统中,按键主要有两种形式:1、直接按键; 2、矩阵编码键盘。

直接按键的每个按键都单独接到单片机的一个I/O口上,直接按键则通过判断按键端口的电位即可识别按键操作;而矩阵键盘通过行列交叉按键编码进行识别。

下面我们以S51增强型单片机实验板的直接按键来学习单片机轻触按键在单片机系统中的应用。

S51增强型单片机实验板的4个轻触按键原理图。

S51增强型单片机轻触按键原理图图 1一、按键时序分析通常所用的按键为轻触机械开关,正常情况下按键的接点是断开的,当我们按压按钮时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而机械触点在闭合及断开的瞬间均伴随有一连串的抖动,按键的时序如下图2所示,抖动时间的长短由按键的机械特性及操作人员按键动作决定,一般为5ms~20ms;按键稳定闭合时间的长短是由操作人员的按键按压时间长短决定的,一般为零点几秒至数秒不等。

轻触按键操作时序示意图图 2从上面图2中我们可以看到,一次完整的击键过程,包含以下5个阶段:1. 等待阶段:此时按键尚未按下,处于空闲阶段。

2. 前沿(闭合)抖动阶段:此时按键刚刚按下,但按键信号还处于抖动状态,这个时间一般为5~20ms。

为了确保按键操作不会误动作,此时必须有个前沿消抖动延时。

3. 键稳定阶段:此时抖动已经结束,一个有效的按键动作已经产生。

系统应该在此时执行按键功能;或将按键所对应的键值记录下来,待按键释放时再执行。

4. 后沿(释放)抖动阶段:一般来说,考究一点的程序应该在这里再做一次消抖延时,以防误动作。

但是,如果前面“前沿抖动阶段”的消抖延时时间取值合适的话,可以忽略此阶段。

5. 按键释放阶段:此时后沿抖动已经结束,按键已经处于完全释放状态,如果按键是采用释放后再执行功能,则可以在这个阶段进行按键操作的相关处理。

二、按键实验例程下面我们通过几个实验例程来学习按键扫描编程及按键软件消抖动的编程,通过这些对比实验,给大家一个更加感性的认识。

单片机按键处理技巧及C语言编程方式

单片机按键处理技巧及C语言编程方式

单片机按键处理技巧及编程方式在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。

输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。

在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。

我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。

按键检测的原理: 它们和我们的单片机系统的I/O口连接一般如下:对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。

简单分析一下按键检测的原理。

当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。

这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。

结论:我们在程序中通过检测到该I/O 口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。

一切看起来很美好,是这样的吗?在我们通过上面的按键检测原理得出上述的结论的时候,那就是现实中按键按下时候的电平变化状态。

我们的结论是基于理想的情况得出来的,而实际中,由于按键的弹片接触的时候,并不是一接触就紧紧的闭合,它还存在一定的抖动,尽管这个时间非常的短暂,但是对于我们执行时间以us为计算单位的微控制器来说,它太漫长了。

因而,实际的波形图应该如下面这幅示意图一样。

这样便存在这样一个问题。

假设我们的系统有这样功能需求:在检测到按键按下的时候,将某个I/O的状态取反。

由于这种抖动的存在,使得我们的微控制器误以为是多次按键的按下,从而将某个I/O的状态不断取反,这并不是我们想要的效果,假如该I/O控制着系统中某个重要的执行的部件,那结果更不是我们所期待的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键处理程序分析与设计
参考程序:
/************************************************
时钟显示程序
设计:黄有全
2011年10月26日
关键词:动态显示程序设计
显示连接:P3→J_WM,接数码管的位控制,P1→J_DM,接共阳极数码管段码,动态显示。

按键连接:按键KEY→P2。

k1→P2.0,k2→P2.1,k3→P2.2,k4→P2.3。

按键作用说明:k1、k2小时加减,k3、k4分钟加减
************************************************/
#include<reg51.h>
unsigned char duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x8 3,0xc6,0xa1,0x86,0x8e,0x89,0xc7,0x8c,0xbf,0xff};
//数组,定义共阳极数码管显示段码:0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,H,L,P,-,熄灭。

#define uchar unsigned char
uchar ms=0,sec=0,min=30,hour=10;
uchar keyv;
/**************延时2.5ms函数***************/
void delay() //延时函数,带参数i。

{ //在调用函数时通过设置参数,改变延时时间。

int j=0,k=0;
// for(j=0;j<i;j++)
for(k=0;k<350;k++);
}
/**************延时250ms函数***************/
void delay_250() //延时函数,带参数i。

{ //在调用函数时通过设置参数,改变延时时间。

int j=0,k=0;
for(j=0;j<100;j++)
for(k=0;k<350;k++);
}
/**************时间显示函数***************/
void display()
{
P1=duanma[sec%10]; //送秒的个位的段码,显示;P3=0xfe; //送第一位的位码,点亮第1位数码管。

delay(); //延时2.5ms
P1=duanma[sec/10]; //送秒的十位的段码,显示;
P3=0xfd; //送第二位的位码,点亮第2位数码管。

delay(); //延时2.5ms
P1=duanma[19]; //送-的段码,显示-;
P3=0xfb; //送第三位的位码,点亮第3位数码管。

delay(); //延时2.5ms
P1=duanma[min%10]; //送分的个位的段码,显示;
P3=0xf7; //送第4位的位码,点亮第4位数码管。

delay(); //延时2.5ms
P1=duanma[min/10]; //送秒的十位的段码,显示;
P3=0xef; //送第5位的位码,点亮第5位数码管。

delay(); //延时2.5ms
P1=duanma[19]; //送-的段码,显示-;
P3=0xdf; //送第6位的位码,点亮第7位数码管。

delay(); //延时2.5ms
P1=duanma[hour%10]; //送小时的个位的段码,显示;P3=0xbf; //送第7位的位码,点亮第7位数码管。

delay(); //延时2.5ms
P1=duanma[hour/10]; //送秒的十位的段码,显示;
P3=0x7f; //送第8位的位码,点亮第8位数码管。

delay(); //延时2.5ms
}
/**************按键处理函数**************/
void key()
{ uchar i;
keyv=P2;
keyv=~keyv&0x1f; //取反,去掉高三位(只要5个按键)
if(keyv==1) //K1按键按下,小时单元在0-23之间循环加1
{if(hour<23)hour++;else hour=0; }
if(keyv==2) //K2按键按下,小时单元在0-23之间循环减1
{if(hour>0)hour--;else hour=23; }
if(keyv==4) //K3按键按下,分钟单元在0-59之间循环加1
{if(min<59)min++;else min=0; }
if(keyv==8) //K4按键按下,分钟单元在0-59之间循环减1
{if(min>0)min--;else min=59; }
if(keyv!=0){for(i=0;i<10;i++)display();}//延时0.2秒,用显示程序代替延时,等待按键松开
}
/**************时间数据产生函数************** */
void time()
{
ms++; //ms单元增加1
if(ms>=50) //ms单元>50(是否到1秒)
{
sec++;ms=0; //到1秒,则sec增加1,且ms清0.
if(sec>59) //sec单元>59(是否到1分)
{
min++;sec=0; //秒进位到分钟,即分钟加1.且sec清0. if(min>59)
{
hour++;min=0;
if(hour>23)
{
hour=0;
}
}
}
}
}
/**************主函数************** */
void main()
{
while(1)
{
display(); //调用显示函数,显示时钟。

耗时20ms time(); //时间测试函数
key(); //按键处理函数
}
}。

相关文档
最新文档