由于人手按按键会发生不可避免的抖动问题,所以消抖就成为不能避免的步骤,
消抖主要有两种方式:1·硬件消抖 2·软件消抖
硬件消抖,说白了也是一种延时的处理方式,感觉还没有软件直接延时来的直接,直观,方便呢!
独立式键盘:直观,容易理解,占用io资源比较多
行列式矩阵键盘,节省io资源,很少的io口,可以做出很多的按键出来
如图搜索导入元器件并连线
编写c代码并编译hex文件
#include"reg52.h"
sbit k=P1^0;
unsigned char dat[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴极数码管取值0到9;
unsigned int num=0, flag=0;
void delay(unsigned int n){
unsigned int i=0, j=0;
for(i=0; i<n; i++){
for(j=0; j<120; j++);
}
}
void key(){
// if(k==0){
// delay(20); // 这个延时消抖函数如果没有,后面的num就会加的很快。
// if(k==0){
// num++;
// if(num > 9){
// num=0;
// }
// }
// } // 前面的num加的太快,不符合一一个的加的要求。
if(k==0 && flag==0){ // 如果按键没有按下且标志位为0
flag=1; // 就把标志位设为1
}
if(k==1 && flag==1){ // 如果按键按下了 且 标志位为1
num++; // num加1
flag=0; // 标志位设为0
if(num>9){ // 如果num大于9了
num=0; // num就等于0, 大于9了就超过了前面的数组dat的取值范围了,只能清0,从头算
}
}
}
void seg(){
P2=dat[num]; // 数码管的显示取数组dat的第num个值
}
void main(){
while(1){
key();
seg();
}
}
proteus导入hex文件后模拟运行,这样不论你按键安多快多慢,都能保证每次按下数码管加一个数