?? 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 + -