📄 keyboard.c
字号:
#include <reg51.h>
#define CHECK_KEY_DOWN 0 //处在检测按键压下阶段标志
#define CHECK_KEY_UP 1 //处在检测按键抬起阶段标志
#define KEY_UP 0 //按键抬起标志
#define KEY_DOWN 1 //按键压下标志
sbit _p33 = P3^3;
sbit _p34 = P3^4;
sbit _p35 = P3^5;
sbit _p36 = P3^6;
char data_out;
char _key_status = CHECK_KEY_DOWN; //按键检测状态(初值为检测压下阶段)
char _key_idx = 0; //按键序号
void _delay_1ns() {
}
void _p34_plus() { //发生移位脉冲,SH_CP
_p34 = 0;
_delay_1ns();
_p34 = 1;
_delay_1ns();
_p34 = 0;
}
void _p35_plus() { //发生锁存脉冲,ST_CP
_p35 = 0;
_delay_1ns();
_p35 = 1;
_delay_1ns();
_p35 = 0;
}
void serial_output(unsigned char out) { //通过595串行输出数据
char i = 0;
for (i = 7; i >= 0 ; i--) {
_p33 = (out >> i)& 0x01; //将数据移到最低位后由P33送出,DS信号
_p34_plus();
}
_p35_plus();
}
char _check_key(unsigned char _key_idx) { //检查按键状态
serial_output((~(0x01<<_key_idx))&0x0f); //将待查按键键码转换成扫描码后输出
if (_p36 == 0) { //根据P36状态决定返回值
return KEY_DOWN;
} else {
return KEY_UP;
}
}
char get_key(void) { //获取键值
char result = -1; //无键按下时键值为-1
if (_key_status == CHECK_KEY_DOWN) { //如果当前处于检查压下阶段,进行以下操作
if (_check_key(_key_idx) == KEY_DOWN) { //判断当前扫描键的状态,若为压下标志则
_key_status = CHECK_KEY_UP; //将检查阶段标志设置为抬起
} else { //否则,将检查阶段标志设置为压下
_key_status = CHECK_KEY_DOWN;
_key_idx++; //判断是否4个按键已经轮流扫描一遍
if (_key_idx == 4) {
_key_idx = 0; //是,则将待扫描按键号设为0
}
}
} else if (_key_status == CHECK_KEY_UP) { //如果当前处于检查抬起阶段,进行以下操作
if (_check_key(_key_idx) == KEY_UP) { //判断当前扫描键的状态,若为抬起标志则
result = _key_idx; //键值输出
_key_status = CHECK_KEY_DOWN; //按键检查阶段标志改为压下
if (++_key_idx == 4) { //判断是否4个按键已经轮流扫描一遍
_key_idx = 0; //是,则将待扫描按键号设为0
}
} else {
_key_status = CHECK_KEY_UP;
}
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -