📄 test02.c
字号:
//
PS2A_CTL = PS2A_CTL | 0x01; //set tx_on;
PS2A_D = PS2_MS_GET_STATUS;
//wait for tx_if
while(!(PS2A_STA & 0x10));
if(PS2A_STA & 0x20) return 1; //command fail, time-out
//check tx_ack
//if((PS2A_STA & 0x40)) return 2;
PS2A_STA = 0x10; //clr tx_if
//
//ACK stage
//
while(!(PS2A_STA & 0x01)); //wait rx_if
PS2A_STA = PS2A_STA & 0x01; //clr rx_if
if((PS2A_STA & 0x0E)) return 3; //command fail
if(PS2A_D != 0xFA) return 4; //rx data is not ACK
//
//Data Stage
//
//
// Get 3 bytes, 1:status 2:resolution 3:sampling rate
//
while(!(PS2A_STA & 0x01)); //wait rx_if
PS2A_STA = PS2A_STA & 0x01; //clr rx_if
if((PS2A_STA & 0x0E)) return 3; //command fail
MOUSE_STATUS[0] = PS2A_D;
//
while(!(PS2A_STA & 0x01)); //wait rx_if
PS2A_STA = PS2A_STA & 0x01; //clr rx_if
if((PS2A_STA & 0x0E)) return 3; //command fail
MOUSE_STATUS[1] = PS2A_D;
//
while(!(PS2A_STA & 0x01)); //wait rx_if
PS2A_STA = PS2A_STA & 0x01; //clr rx_if
if((PS2A_STA & 0x0E)) return 3; //command fail
MOUSE_STATUS[2] = PS2A_D;
return 0; //command succeed
}
unsigned char KB_SET_ONE(unsigned char cmd, unsigned char one_byte)
{
// send command byte 0xED
PS2A_CTL = PS2A_CTL | 0x32;
PS2A_STA = 0xFF;
//
PS2A_CTL = PS2A_CTL | 0x01; //set tx_on;
PS2A_D = cmd;
//wait for tx_if
while(!(PS2A_STA & 0x10));
if(PS2A_STA & 0x20) return 1; //command fail, time-out
//check tx_ack
if((PS2A_STA & 0x40)) return 2;
PS2A_STA = 0x10; //clr tx_if
//
//ACK stage
//
while(!(PS2A_STA & 0x01)); //wait rx_if
PS2A_STA = PS2A_STA & 0x01; //clr rx_if
//
// send one indicator byte
//
PS2A_CTL = PS2A_CTL | 0x01; //set tx_on;
PS2A_D = one_byte;
//wait for tx_if
while(!(PS2A_STA & 0x10));
if(PS2A_STA & 0x20) return 1; //command fail, time-out
//check tx_ack
if((PS2A_STA & 0x40)) return 2;
PS2A_STA = 0x10; //clr tx_if
//
//ACK stage
//
while(!(PS2A_STA & 0x01)); //wait rx_if
PS2A_STA = PS2A_STA & 0x01; //clr rx_if
if((PS2A_STA & 0x0E)) return 3; //command fail
if(PS2A_D != 0xFA) return 4; //rx data is not ACK
else {return 0;} //command succeed
}
//isr routine
void EXTINT_ISR (void) interrupt 0
{
return;
}
//isr routine
void TMR_ISR (void) interrupt 1
{
TIM_STA = TIM_STA | 0x08;
// convert character in buffer into usage scan_code
// mapping make/break scan_code
kb_check=1;
kb_idle_cnt++;
ms_idle_cnt++;
return;
}
unsigned char kb_scan(void)
{
unsigned char key;
unsigned char scan_code;
kb_check = 0;
mm_key0=0;
mm_key1=0;
key=0;
scan_code = KB_BUF_DATA[rd_kb_ptr];
if(scan_code==0xF0) {
get_next_scan_code();
// detect F0 break key
switch (scan_code) { //detect flag keys
case 0x59: {
right_shift_make=0;
break;
}
case 0x14: {
left_ctrl_make=0;
break;
}
case 0x11: {
left_alt_make=0;
break;
}
case 0x58: {
caps_make=0;
break;
}
case 0x12: {
left_shift_make=0;
break;
}
case 0x77: {
numlock_make=0;
break;
}
case 0x7E: {
scroll_make=0;
break;
}
default: {
break;
}
}//switch
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0xE0) {
scan_code = get_next_scan_code();
if(scan_code==0xF0) {
scan_code = get_next_scan_code();
if(scan_code==0x12) {
scan_code = get_next_scan_code();
if(scan_code==0xE0) {
scan_code = get_next_scan_code();
switch (scan_code) {//E0-F0-12-E0-
case 0x70:{
// shift + INSERT make
//shift_make = 1;
key = 73;
break;
}
case 0x71:{
// shift + DEL make
key = 76;
break;
}
case 0x6B:{
// shift + LEFT-ARROW make
key = 80;
break;
}
case 0x6C:{
// shift + HOME make
key = 74;
break;
}
case 0x69:{
// shift + END make
key = 77;
break;
}
case 0x75:{
// shift + UP make
key = 82;
break;
}
case 0x72:{
// shift + DOWN make
key = 81;
break;
}
case 0x7D:{
// shift + PAGE UP make
key = 75;
break;
}
case 0x7A:{
// shift + PAGE DOWN make
key = 78;
break;
}
case 0x74:{
// shift + RIGHT-ARROW make
key = 79;
break;
}
case 0x4A:{
// shift + (/) make
key = 84;
break;
}
default:{
//error
// flush ptr
rd_kb_ptr = rx_kb_ptr;
return 0;
}
}//end of switch
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return key;
} // E0
else { // error
// flush buffer
rd_kb_ptr = rx_kb_ptr;
return 0;
}
} // 12
else if(scan_code==0x11){ //E0-F0-11
// alt-r , break
right_alt_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x14){ //E0-F0-14
// CTRL_R , break
right_ctrl_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x1F){ //E0-F0-1F
// left-gui , break
left_gui_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x27){ //E0-F0-27
// right gui , break
right_gui_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x38 | scan_code==0x30 | scan_code==0x28 | scan_code==0x20 | scan_code==0x10){ //E0-F0-xx
//mm_key , break
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x18 | scan_code==0x3A | scan_code==0x48 | scan_code==0x23 | scan_code==0x21){ //E0-F0-xx
//mm_key , break
//mm_key=0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x32 | scan_code==0x34 | scan_code==0x3B | scan_code==0x15 | scan_code==0x4D){ //E0-F0-xx
//mm_key , break
//mm_key=0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x50 | scan_code==0x40 | scan_code==0x2B){ //E0-F0-xx
//mm_key , break
//mm_key=0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x5A){ //E0-F0-5A
// (Enter) , break
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x37){ //E0-F0-37
// CTRL_R , break
power_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x3F){ //E0-F0-3F
// CTRL_R , break
sleep_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x5E){ //E0-F0-5E
// CTRL_R , break
wakeup_make = 0;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x7C & !left_shift_make & !right_shift_make & !left_ctrl_make & !right_ctrl_make){
// Print break
get_next_scan_code(); //0xE0
get_next_scan_code(); //0xF0
get_next_scan_code(); //0x12
//
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x7C){
// Print break
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code>=0x69 & scan_code <=0x7D){
if((left_shift_make == numlock_make) | (right_shift_make == numlock_make)){
// INS, ... break
//
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(left_shift_make | right_shift_make) {
//
get_next_scan_code(); //0xE0
get_next_scan_code(); //0x12
//
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(numlock_make){ //numlock_make
//
get_next_scan_code(); //0xE0
get_next_scan_code(); //0xF0
get_next_scan_code(); //0x12
//
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else {
// error
rd_kb_ptr = rx_kb_ptr;
return 0;
}
}
else if(scan_code==0x4A & (left_shift_make | right_shift_make)){ // shift+(/) break
//E0-F0-4A
get_next_scan_code(); //0xE0
get_next_scan_code(); //0x12
//
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
//else if(scan_code==0x4A & right_shift_make){ // right_shift+(/) break
//{
// //E0-F0-4A
// get_next_scan_code(); //0xE0
// get_next_scan_code(); //0x12
// //
// rd_kb_ptr++;
// if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
//
// return 0;
//}
else {
// error
rd_kb_ptr=rx_kb_ptr;
return 0;
}
}//F0
else if(scan_code==0x11){ // ALT-R make, E0-11
right_alt_make = 1;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x14){ // CTRL-R make, E0-14
right_ctrl_make = 1;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x1F){ // left gui make, E0-1F
left_gui_make = 1;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x27){ // right gui make, E0-27
right_gui_make = 1;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x2F){ // APP make, E0-2F
//app_make = 1;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 101;
}
//=== Multi-Media Keyboard ===//
else if(scan_code==0x38){ // WWW Back make, E0-38
mm_key0=0x24;
mm_key1= 0x2;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x30){ // WWW Forward make, E0-30
mm_key0 = 0x25;
mm_key1 = 0x2;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x28){ // WWW stop make, E0-28
mm_key0=0x26;
mm_key1=0x2;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
else if(scan_code==0x20){ // WWW Refresh make, E0-20
mm_key0 = 0x27;
mm_key1 = 0x2;
rd_kb_ptr++;
if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -