(1).独立按键模块电路图可以清楚的看到,所有从引脚JP1出来的电流都会接到GND,且当所有按键按下时被执行链接GND。所以,当JP1引脚各端口----识别----到“电流为低电平为0时”,说明按键被按下,否则为高电平按键没有被按下。
( 2).按键的原理其是需要我们单片机有检测的步骤,加上结合电路图的分析。当单片机检测到电平为低电平时,说明按键被按下,否则没有按下。
当按键按下时,如果单机检测按键为0,说明按键按下,程序执行静态数码管的数字显示
(3). 按键因为是硬件,所以他会在按下时会有电流波动------俗称按键抖动,这是硬件物理结构决定。所以在编程设计时要加上“延时时间进行软件的消抖”,用延时的时间给它规避掉抖动这部分所用的时间(我们只考虑软件方面的处理方式,硬件不在考虑范围内)。
(4).一个完整的按键事件分为“按键按下”和“按键弹起”两部分组成。
/*****按键消抖实现每按一下(包括按下事件和弹起事件的完整 整个事件)按键数码管显示加一*******/ #include "reg51.h" typedef unsigned char u8; typedef unsigned int u16; sbit Key1 = P0^0; //定义全局变量dnumber u8 dnumber = 0; //静态数码管数组定义 u8 vol[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08}; //延时函数声明 void Delay_10us(u16 time); //按键处理函数声明 void ADDDisplay(); //主函数主程序 void main(void) { u8 flag = 0; while(1) { if(Key1 == 0) { Delay_10us(1000); if(Key1 == 0) { if(flag == 0) { ADDDisplay(); flag = 1; } } } else { Delay_10us(1000); if(Key1 == 1) { if(flag == 1) { // ADDDisplay(); flag = 0; } } } } Delay_10us(1000); } //定义延时函数 void Delay_10us(u16 time) { while(time--); } //定义按键处理函数 void ADDDisplay(void) { dnumber += 1; if(dnumber > 9) { dnumber = 0; } P2 = vol[dnumber]; }
*这里需要着重强调的是“按键按下” 和 “弹起"的整个事件程序逻辑应该怎么去设计:
定义一个名为flag的变量用于记录按键周期状态flag,初始周期状态为0。
当按键按下时判断按键Key1是否为低电平,如果为低电平,说明按键被按下。接着判断flag是否为0,如果为0那么执行按键处理函数显示静态数码管显示数字,并且flag记录一次按键周期,flag = 1赋值为1。
当按键弹起时,判断按键Key1是否为高电平,如果为高电平说明按键被弹起。接着判断flag是否为1,如果为1,那么flag = 0,至此整个按键结束。
程序编译如下:
//主函数主程序 void main(void) { u8 flag = 0; while(1) { if(Key1 == 0) { Delay_10us(1000); if(Key1 == 0) { if(flag == 0) { ADDDisplay(); flag = 1; } } } else { Delay_10us(1000); if(Key1 == 1) { if(flag == 1) { // ADDDisplay(); flag = 0; } } } } Delay_10us(1000); }
程序编译无报错,烧录显示正常。