一、程序实战
(五)键盘相关
基础概念:
1、键盘分类
矩阵式键盘:
1、独立键盘按键控制LED
#include <reg52.h>
sbit led1 = P1^0;
sbit key1 = P3^5;
void main() {
led1 = 1;
key1 = 1;
while (1) {
if(key1 == 0){
led1 = 0;
}
else{
led1 = 1;
}
}
}
按下按键灯亮,松开灯灭,测试成功。
2、独立键盘按下数码管数字+1且led闪烁
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1 = P1^0;
sbit key1 = P3^5;
sbit SMG = P2^0;
uchar num;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
void main() {
led1 = 1;
key1 = 1;
SMG = 0;
num = 0;
P0 = table[num];
while (1) {
if(key1 == 0){
led1 = 0;
num ++;
P0 = table[num];
if(num > 9){
num = 0;
}
}
else{
led1 = 1;
}
}
}
数码管数值显示不正常,主要由于按键存在抖动,测试失败。
3、按键消抖程序
消抖方式:软件消抖与硬件消抖
消抖处理:
(1)加入wile()让程序停留
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1 = P1^0;
sbit key1 = P3^5;
sbit SMG = P2^0;
uchar num;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
void main() {
led1 = 1;
key1 = 1;
SMG = 0;
num = 0;
P0 = table[num];
while (1) {
if(key1 == 0){
led1 = 0;
num ++;
P0 = table[num];
if(num > 9){
num = 0;
}
while(!key1);
}
else{
led1 = 1;
}
}
}
(2)加入11.0592MHZ延时函数:(10ms)
#include <reg52.h>
sbit led1 = P1^0;
#define uint unsigned int
#define uchar unsigned char
void delay(uint z){
uint x,y;
for (x = 200; x > 0; x--) {
for(y = z; y > 0; y--);
}
}
void main(){
led1 = 1;
delay(210);
led1 = 0;
delay(210);
}
加入延时函数的完整按键消抖程序:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1 = P1^0;
sbit key1 = P3^5;
sbit SMG = P2^0;
uchar num;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
};
void delay(uint z){
uint x,y;
for (x = 200; x > 0; x--) {
for(y = z; y > 0; y--);
}
}
void main() {
led1 = 1;
key1 = 1;
SMG = 0;
num = 0;
P0 = table[num];
while (1) {
if(key1 == 0){
delay(4);
if(key1 == 0){
led1 = 0;
num ++;
P0 = table[num];
if(num > 9){
num = 0;
}
}
while(!key1);
delay(4);
while(!key1);
}
else{
led1 = 1;
}
}
}
测试成功。
备注:
矩阵键盘原理类似,加入多列扫描和按位与程序,测试板无此类键盘,暂不扩展。