长短按键流程图
- 格式:doc
- 大小:35.50 KB
- 文档页数:4
4.3.2 按键扫描处理程序流程图(1)按键扫描处理代码/* 功能实现参数,参数mode为Key_Menu按键选择的功能模块*/void Displa y(unsign ed char mode){switch (mode)//显示模式,0为显示实时温度,1为显示温度上限,2为显示温度下限{case 0: if (temper ature < 0)//温度小于0{temper ature = -temper ature;//换为正温度Displa ySeg(0x40, temper ature % 1000); //0x40为负号}else Displa ySeg(codeSe g[temper ature% 10000/ 1000], temper ature % 1000);break;case 1: Displa ySeg(0x76, alarm_temp_H * 10); break;//显示温度上限,0x76为H字符case 2: Displa ySeg(0x38, alarm_temp_L * 10); break;//显示温度下限,0x38为L字符defaul t:break;}}/* 按键扫描和处理函数*/void KeyScan(void){if (Key_Menu == 0)//判断按键是否被按下{DelayM s(10);//延时10毫秒,去抖动干扰if (Key_Menu == 0)//再次确认按键是否被按下{while(Key_Menu == 0)Displa y(menu);//等待按键释放,器件扫描数码管menu++;//功能键,功能切换if (menu == 3)menu = 0;//三个功能切换完}}if (Key_Ad d == 0){DelayM s(10);if (Key_Ad d == 0){while(Key_Ad d == 0)Displa y(menu);switch (menu){case 1: if (alarm_temp_H < 50)alarm_temp_H++;break;//加温度上限case 2: if (alarm_temp_L< 27)alarm_temp_L++;break;//加温度下限defaul t:break;}}}if (Key_De c == 0){DelayM s(10);if (Key_De c == 0){while(Key_De c == 0)Displa y(menu);switch (menu){case 1: if (alarm_temp_H > 30)alarm_temp_H--;break;//减温度上限case 2: if (alarm_temp_L > 7)alarm_temp_L--;break;//减温度下限defaul t:break;}}。
多功能时钟流程图一. 功能确认● 时钟功能:1. 时钟显示小时和分钟2. 用户可以通过按键调整时钟的时间3. 无论当前时钟是否在前台显示,时钟始终是运行的。
● 定时闹铃功能:1. 用户可以通过按键设置闹铃时间(小时和分钟),设置完成后可以按确定键退出设置。
2. 当系统时钟的时间等于预设的闹铃时间时,系统蜂鸣器响5秒钟。
3. 用户可以设置两个闹铃。
● 秒表功能:1. 用户可以通过按键进入秒表功能,也可以退出秒表状态。
2. 秒表高2位显示秒,低2位显示百分之一秒。
3. 可以通过按键暂停、(继续)运行秒表,可以通过按键对秒表清零。
二. 状态分析及模块分割根据以上的分析,系统共有三个大的功能:时钟、设置定时、秒表,各个功能之间可以通过按键来切换,且各个功能内部仍需要使用按键来处理,故可以考虑将系统定义为三个状态(statu s ):时钟状态、设置定时状态、秒表状态。
显然,同一个按键在不同状态下的功能是不一样的。
这样,在某种状态下,按下某个按键,代表唯一确定的含义。
这种处理方法可以称为“状态—按键”法。
这样我们可以把程序对应地分成以下三个任务模块。
这个流程就可以作为主流程(main ()函数),当然,A 、B 、C 三框内部的流程仍(处理时钟状态下的所有事务)(处理设置闹铃状态下的所有事务)(处理秒表状态下的所有事务)有待于细化。
三.详细设计A框内部要处理的事务见第一部分:功能确认。
在此,为了完成时钟调整功能,我们可以定义K ey_2为小时调整键,Key_3为分钟调整键,每次按下键,小时数或分钟数加1。
当然,当用户没有按键的时候,我们还得经常保持显示屏上的时间刷新。
A框:时钟状态下的处理流程:B框要处理的功能是设置定时闹铃的事务,这里需要预设闹铃时间,同样可以定义Key_2为小时预设键,Key_3为分钟预设键,而Key_1则负责状态切换,当我们预设好时间之后,按下Key_1,就算完成了闹铃预设,让系统离开当前状态,转到秒表状态上去。
//FileName:识别四个独立按键是短按还是长按//Function: 不同按键短按或长按分别显示不同的LED//author:liu yong//QQ:545018331//Date:2013/03/13/********************************************/#include PIC.H>__CONFIG(0X3B31);#define uint8 unsigned charunsigned int time_10ms_ok=0;uint8 KeyValue;bit KeyShortpressFlag,KeyLongpressFlag;//=========定义长按键断口的TICK数及连发间隔的TICK数=======// #define KEY_LONG_PERIOD 200//=========定义按键断口=======//#define io_key_1 RB0#define io_key_2 RB1#define io_key_3 RB2#define io_key_4 RB3//=========定义按键键值=======//#define KEY_VALUE_1 0X0e#define KEY_VALUE_2 0X0d#define KEY_VALUE_3 0X0b#define KEY_VALUE_4 0X07#define KEY_NULL 0X0f//=========定义按键返回值状态(按下,长按,连发,释放)=======// #define KEY_SHORT 0X80#define KEY_LONG 0X40//=========定义按键状态=======//#define KEY_STATE_INIT 0#define KEY_STATE_WOBBLE 1#define KEY_STATE_PRESS 2#define KEY_STATE_LONG 3#define KEY_STATE_RELEASE 4void initial(void){TRISB=0xff;TRISC=0;PORTC=0XFF;RBPU=0;T1CON=0X01;//1:1TMR1H=-(10000 >> 8);TMR1L=-(10000 0XFF);TMR1IF=0;TMR1IE=1;INTCON=0XC0;}void interrupt timer1_isr(void) // 定时器10ms中断服务{if(TMR1IF){TMR1H=-(10000 >> 8);TMR1L=-(10000 0XFF);time_10ms_ok = 1;TMR1IF=0;}}void KeyInit(void){io_key_1 = 1;io_key_2 = 1;io_key_3 = 1;io_key_4 = 1;}uint8 KeyScan(void){if(io_key_1 == 0)return KEY_VALUE_1;if(io_key_2 == 0)return KEY_VALUE_2;if(io_key_3 == 0)return KEY_VALUE_3;if(io_key_4 == 0)return KEY_VALUE_4;return KEY_NULL;}uint8 GetKey(void){static uint8 s_u8KeyState = KEY_STATE_INIT ;static uint8 s_u8KeyTimeCount = 0;uint8 i ;uint8 KeyTemp=KEY_NULL;KeyTemp = KeyScan();//0x0e 0fswitch(s_u8KeyState){case KEY_STATE_INIT:{if(KEY_NULL != KeyTemp)s_u8KeyState = KEY_STATE_WOBBLE ;}}break;case KEY_STATE_WOBBLE:{s_u8KeyState = KEY_STATE_PRESS ;}break;case KEY_STATE_PRESS://识别哪个键{if(KEY_NULL != KeyTemp) // KeyTemp=0x0e short press {s_u8KeyState = KEY_STATE_LONG ;i=KeyTemp;//0x0e}else{s_u8KeyState = KEY_STATE_INIT;}}break;case KEY_STATE_LONG: //判断按键是短按还是长按{if(KEY_NULL != KeyTemp){if(++s_u8KeyTimeCount > KEY_LONG_PERIOD){s_u8KeyTimeCount = 0;KeyLongpressFlag=1;KeyShortpressFlag=0;s_u8KeyState = KEY_STATE_RELEASE;}}else{s_u8KeyTimeCount = 0;KeyShortpressFlag=1;KeyLongpressFlag=0;s_u8KeyState = KEY_STATE_RELEASE;}break;case KEY_STATE_RELEASE://按键释放去抖{if(KEY_NULL == KeyTemp) //此语句必须加上去不然程序不稳定{if(KeyShortpressFlag){KeyShortpressFlag=0;i=i | KEY_SHORT;//0x0e | 0x80=0x8es_u8KeyState = KEY_STATE_INIT;}if(KeyLongpressFlag){KeyLongpressFlag=0;i=i | KEY_LONG;s_u8KeyState = KEY_STATE_INIT;}}}break;default:break;}return i;}void main(void){initial();KeyInit();while(1){if (time_10ms_ok) //每10ms执行一次,{time_10ms_ok =0;KeyValue=GetKey();if(KeyValue == (KEY_VALUE_1 | KEY_SHORT)) PORTC = ~1;if(KeyValue == (KEY_VALUE_1 | KEY_LONG)) PORTC = ~3;if(KeyValue == (KEY_VALUE_2 | KEY_SHORT))PORTC = ~7;if(KeyValue == (KEY_VALUE_2 | KEY_LONG)) PORTC = ~0X0F; if(KeyValue == (KEY_VALUE_3 | KEY_SHORT))PORTC = ~0X1F; if(KeyValue == (KEY_VALUE_3 | KEY_LONG)) PORTC = ~0X3F; if(KeyValue == (KEY_VALUE_4 | KEY_SHORT)) PORTC = ~0X7F; if(KeyValue == (KEY_VALUE_4 | KEY_LONG)) PORTC = ~0XFF;} }。
51单片机密码锁制作的程序和流程图(很详细)、基本组成:单片机小系统+4* 4矩阵键盘+ 1 6 0 2显示+ DC电机基本电路:键盘和和显示键盘接P1 口,液晶的电源的开、关通过P2.7 口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。
2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。
但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。
3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。
因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。
b)同时将LCD背光灯关闭4. DC电机模拟开锁动作。
a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。
DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。
三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。
超过10位时系统将自动截取前10位、但不作密码长度溢出提示。
2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。
3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。
4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。
5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。
6.0 修改密码键和恢复初始密码键最好置于室内。
这是Proteus仿真结果:输入密码123456:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接I N T O引脚接的一个独立按键,用于唤醒C P U工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。
DS18B20初始化程序流程图DS18B20读字节程序流程图DS18B20写字节程序流程图DS18B20获取温度程序流程图图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示。
N图按键程序流程图附1 源程序代码/********************************************************************* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
* 编程者:ZPZ* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫描函数get_temperature(0); //获取温度函数keyscan(); //按键扫描函数display(temp,temp_d*0.625);//显示函数alarm(); //报警函数keyscan(); //按键扫描函数}}/********************************************************************* 程序名; __ds18b20_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2009/10/2* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。
西南科技大学信息工程学院电子技术与创新实验基地课程设计报告课程名称:电子设计基础设计题目:长按键识别电路姓名:学号:班级:电话:指导教师:起止日期:综合评分表平时成绩(10分)实验成绩(20分)电路实训(20分)课程报告(30分)答辩成绩(20分)总分(100分)课程设计任务书长按键识别电路设计:当点动按键单次点击时,两位数码管按照+1或-1的方式显示计数结果,当长按键达到5s以上,数码管按照较快的速度显示计数结果,直到按键松开后停止计数,需要完成3位数码管设计。
课程设计报告评分表(满分:30分)项目分值得分备注选题难度等级 5 由命题教师给定系统设计思想、原理及深度 2 扩展部分电路设计部分内容阐述及参数计算 3 过程详细仿真及分析 5 仿真波形、关键点捕捉电路原理图绘制及规范 2 端口、IC利用率PCB图元件布局 3 幅面尺寸,布局规则、紧凑PCB图完成效果 5 线宽、安全间距、布通率仿真图、原理图、PCB图打印质量 5 白底、无栅格合计30教师评语教师:___________________月日目录模块一基础实验实验一电子电路的设计与仿真 (1)实验二基于Protel 99SE的电路图编辑与PCB板设计 (3)实验三元器件基础 (6)实验四焊接工艺训练 (7)实验五电路的装焊与调试 (8)模块二课程设计设计课题:长按键识别电路 (10)元件统计 (24)参考文献: (24)实验一 电子电路的设计与仿真一、 实验目的1. 初始Multisim 软件,运行Multisim 软件,了解该软件的基本界面并且学会做简单的电子元件的放置,属性参数的修改。
2. 运用Multisim 软件仿真电源单晶体共射放大电路,观察仿真结果并分析结果。
3. 课后运用该软件做电子技术基础实验仿真,把该软件当成常用工具使用。
二、 实验内容 1.实验步骤(1) 安装multisim 软件,运行multisim 软件,大概了解一下该软件的操作界面和各项菜单、子菜单的功能。
第十一节:同一个按键短按与长按的区别触发开场白:上一节讲了类似电脑键盘组合按键触发的功能,这节要教会大家一个知识点:如何在上一节的基础上,略作修改,就可以实现同一个按键短按与长按的区别触发。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺51单片机学习板。
用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。
(2)实现功能:两个独立按键S1和S5,按住其中一个按键,在短时间内松手,则认为是短按,触发蜂鸣器短鸣一声。
如果一直按住这个按键不松手,那么超过规定的长时间内,则认为是长按,触发蜂鸣器长鸣一声。
(3)源代码讲解如下:#include "REG52.H"#define const_voice_short 20 //蜂鸣器短叫的持续时间#define const_voice_long 140 //蜂鸣器长叫的持续时间/* 注释一:* 调整抖动时间阀值的大小,可以更改按键的触发灵敏度。
* 去抖动的时间本质上等于累计定时中断次数的时间。
*/#define const_key_time_short1 20 //短按的按键去抖动延时的时间#define const_key_time_long1 400 //长按的按键去抖动延时的时间#define const_key_time_short2 20 //短按的按键去抖动延时的时间#define const_key_time_long2 400 //长按的按键去抖动延时的时间void initial_myself();void initial_peripheral();void delay_long(unsigned int uiDelaylong);void T0_time(); //定时中断函数void key_service(); //按键服务的应用程序void key_scan(); //按键扫描函数放在定时中断里sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平sbit beep_dr=P2^7; //蜂鸣器的驱动IO口unsigned char ucKeySec=0; //被触发的按键编号unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志unsigned char ucShortTouchFlag1=0; //短按的触发标志unsigned int uiKeyTimeCnt2=0; //按键去抖动延时计数器unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志unsigned char ucShortTouchFlag2=0; //短按的触发标志unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器void main(){initial_myself();delay_long(100);initial_peripheral();while(1){key_service(); //按键服务的应用程序}}void key_scan()//按键扫描函数放在定时中断里{/* 注释二:* 长按与短按的按键扫描的详细过程:* 第一步:平时只要按键没有被按下时,按键的自锁标志,去抖动延时计数器一直被清零。