一. 按键功能实现总结
-
“独立按键”电路图解析及接线
(1).独立按键模块电路图可以清楚的看到,所有从引脚JP1出来的电流都会接到GND,且当所有按键按下时被执行链接GND。所以,当JP1引脚各端口----识别----到“电流为低电平为0时”,说明按键被按下,否则为高电平按键没有被按下。
( 2).按键的原理其是需要我们单片机有检测的步骤,加上结合电路图的分析。当单片机检测到电平为低电平时,说明按键被按下,否则没有按下。
当按键按下时,如果单机检测按键为0,说明按键按下,程序执行静态数码管的数字显示
(3). 按键因为是硬件,所以他会在按下时会有电流波动------俗称按键抖动,这是硬件物理结构决定。所以在编程设计时要加上“延时时间进行软件的消抖”,用延时的时间给它规避掉抖动这部分所用的时间(我们只考虑软件方面的处理方式,硬件不在考虑范围内)。
(4).一个完整的按键事件分为“按键按下”和“按键弹起”两部分组成。
二. 程序编译与控制静态数码管显示1.2.0——9.的效果展示
/*****按键消抖实现每按一下(包括按下事件和弹起事件的完整 整个事件)按键数码管显示加一*******/
#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,至此整个按键结束。
程序编译如下:文章来源:https://www.toymoban.com/news/detail-513111.html
//主函数主程序
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);
}
四. 程序烧录与保存
程序编译无报错,烧录显示正常。文章来源地址https://www.toymoban.com/news/detail-513111.html
到了这里,关于51单片机“独立按键”控制静态数码管———显示数字0-9的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!