单个按键是通过 链接到一个IO 口中,然后 检查是否得到低电平来识别是否按下
先来 实现这么一个功能 按一个按钮 数码管上就显示 +1 最多加到999
LED.h
#include <REGX52.H>
#ifndef __LED_H__
#define __LED_H__
extern void delay(unsigned int ms);
extern void delay2ms();
extern void showNumberDigit(unsigned int n,char digit);
//最多显示到百位 999
extern void showNumber(unsigned int n);
#endif
LED.c
#include <LED.H>
/**
*0~F 码表
**/
char code numbers[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//段选
sbit SEG_DLE = P2^6;
//位选
sbit SEG_WLE = P2^7;
#define DIGIT_BAI 0xF7
#define DIGIT_SHI 0xEF
#define DIGIT_GE 0xDF
extern void delay(unsigned int ms){
int i,j;
for(i = ms;i>0;i--){
for(j = 250;j>0;j--){
}
}
}
/**
*延时两毫秒
**/
extern void delay2ms(){
delay(2);
}
extern void showNumberDigit(unsigned int n,char digit){
SEG_WLE = 1;
P0 = digit;
SEG_WLE = 0;
SEG_DLE = 1;
P0 = numbers[n];
SEG_DLE = 0;
}
//最多显示到百位 999
extern void showNumber(unsigned int n){
//个位的数
int bai = n/100;
int shi = (n%100)/10;
int ge = n%10;
showNumberDigit(bai,DIGIT_BAI);
delay2ms();
showNumberDigit(shi,DIGIT_SHI);
delay2ms();
showNumberDigit(ge,DIGIT_GE);
delay2ms();
}
KYE.C
/**
按下s2 LED就+1;最多999
**/
#include <REGX52.H>
#include "LED.H"
sbit key_s2 = P3^4;
unsigned int click_count;
void s2OnClick(){
click_count++;
}
void main(){
//P3口 比较特殊,有三态
P3 = 0xFF;
click_count = 0;
while(1){
if(key_s2 == 0){
//按下去的抖动修正
delay(10);
//按下了,开始检查放手
while(!key_s2){
//因为这里会做等待,等待的时候也要显示数字
showNumber(click_count);
};
s2OnClick();
//放手的抖动修正
delay(10);
}
showNumber(click_count);
};
}
看最后 KEY.c
P3 =0xFF 为什么要设置这个值,因为 P3口比较特殊,是拥有3态的IO口(低电平,高电平,高阻态),不同于其他的IO口,比如P0 P1 P2 他们都是只有 高低电平 ,而且默认是 高电平,但是P3口却是默认是 高阻态,所以这里要预先设置一个 高电平给他。
key_s2 就是 按钮链接到IO 口,当按下的时候 这会变成低电平
为什么 判断 key_s2 == 0 之后 需要 delay 10ms 以后再 去检查 是否松手呢?原来 按钮在按下的时候会出现 “抖动”的现象,如果在抖动期间去判断的话 会出现问题,如图