实验开发板为CT107D蓝桥官方板,编译环境为MDK5
参考宋雪松老师的写法:
- 采用多个缓冲区
- 可以扩展至16个键码对应的指令
Keyboard.h:
#ifndef _KEYBOARD_H
#define _KEYBOARD_H
#include "main.h"
sbit Key_IN1 = P4^4;
sbit Key_IN2 = P4^2;
sbit Key_IN3 = P3^5;
sbit Key_IN4 = P3^4;
sbit Key_OUT1 = P3^0;
sbit Key_OUT2 = P3^1;
sbit Key_OUT3 = P3^2;
sbit Key_OUT4 = P3^3;
extern void KeyDrive();
extern void KeyScan();
extern void KeyAction(u8 cmd);
extern u8 Key_Sta[4][4];
extern u8 Key_CodeMap[4][4];
#endif
Keyboard.c:
#include "Keyboard.h"
#include "DataDeal.h"
u8 Key_Sta[4][4] = {
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1}
};//按键当前状态
u8 Key_CodeMap[4][4] = {
{'A', 'C', 'D', 'E'},
{'F', 'G', 'H', 'I'},
{'J', 'K', 'L', 'M'},
{'N', 'O', 'P', 'Q'}
};//按键对应指令集(字母的ASCII码仅用作标识)
void KeyAction(u8 cmd)//指令集对应动作(可扩展)
{
if(cmd == 'A')//也可以用switch写法
{
SwitchClock();
}
else if(cmd == 'F')
{
SwitchAlarm();
}
else if(cmd == 'J')
{
TimeADD();
}
else if(cmd == 'N')
{
TimeCut();
}
}
void KeyDrive()//KeyDrive和KeyScan需要同时在主函数中调用
{
u8 i, j;
static u8 backup[4][4] = {
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1}
};
for(i = 0; i < 4; i ++)
{
for(i = 0; i < 4; i ++)
{
if(Key_Sta[i][j] != backup[i][j])
{
KeyAction(Key_CodeMap[i][j]);
}
}
}
}
void KeyScan()
{
u8 i;
static u8 Key_OUT = 0;
static u8 Key_Buff[4][4] = {
{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}
};//备份区
switch(Key_OUT)//逐行扫描
{
case 0: Key_OUT1 = 0; Key_OUT4 = 1; break;
case 1: Key_OUT2 = 0; Key_OUT3 = 1; break;
case 2: Key_OUT3 = 0; Key_OUT2 = 1; break;
case 3: Key_OUT4 = 0; Key_OUT1 = 1; break;
default: break;
}
Key_Buff[Key_OUT][0] = (Key_Buff[Key_OUT][0] << 1) | Key_IN1; //一则变零则不变
Key_Buff[Key_OUT][1] = (Key_Buff[Key_OUT][1] << 1) | Key_IN2;
Key_Buff[Key_OUT][2] = (Key_Buff[Key_OUT][2] << 1) | Key_IN3;
Key_Buff[Key_OUT][3] = (Key_Buff[Key_OUT][3] << 1) | Key_IN4;
for(i = 0; i < 4; i ++) //每个按键状态判断4次
{
if( (Key_Buff[Key_OUT][i] & 0x0F) == 0x00) //按键按下
{
Key_Sta[Key_OUT][i] = 0;
}
else if( (Key_Buff[Key_OUT][i] & 0x0F) == 0x0F)//按键弹起
{
Key_Sta[Key_OUT][i] = 1;
}
}
Key_OUT ++;
Key_OUT &= 0x03;//达3即归0
}