📄 keyboard.c
字号:
#include <stdio.h>#include <sys/time.h>#include <signal.h>#include "../include/44b.h"struct timeval key_tpstart;char key_get_char(int row, int col){ char key; switch( row ) { case 0: if((col & 0x01) == 0) key = '7'; else if((col & 0x02) == 0) key = '1'; else if((col & 0x04) == 0) key = '0'; else if((col & 0x08) == 0) key = '4'; break; case 1: if((col & 0x01) == 0) key = '8'; else if((col & 0x02) == 0) key = '2'; else if((col & 0x04) == 0) key = 'A'; else if((col & 0x08) == 0) key = '5'; break; case 2: if((col & 0x01) == 0) key = '9'; else if((col & 0x02) == 0) key = '3'; else if((col & 0x04) == 0) key = 'B'; else if((col & 0x08) == 0) key = '6'; break; case 3: if((col & 0x01) == 0) key = 'E'; else if((col & 0x02) == 0) key = 'C'; else if((col & 0x04) == 0) key = 'F'; else if((col & 0x08) == 0) key = 'D'; break; default: break; } return key;}#define RECV_CMD_MAX_BUF 2048char recv_buf[RECV_CMD_MAX_BUF];int recv_read = 0;int recv_write = 0; char key_recv_buf[RECV_CMD_MAX_BUF];int key_recv_read = 0;int key_recv_write = 0;enum KEYBOARD_SCAN_STATUS{ KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_SECOND, KEYBOARD_SCAN_THIRD, KEYBOARD_SCAN_FOURTH};int row = 0;unsigned char output_0x02000000=0xff;unsigned char ascii_key, input_key[4], input_key1[4], key_mask = 0x0F;unsigned char* keyboard_port_scan = (unsigned char*)0x02000000;unsigned char* keyboard_port_value = (unsigned char*)0x02000002;int keyboard_scan_status[4] = { KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST };void key_recv_key(int key){ key_recv_buf[key_recv_write] = key; key_recv_write ++; if(key_recv_write >= RECV_CMD_MAX_BUF) key_recv_write = 0; if(key_recv_write == key_recv_read) { key_recv_read ++; if(key_recv_read >= RECV_CMD_MAX_BUF) key_recv_read = 0; }}void Kbd_Scan(void){ int loopcnt = row, bexit = 0; int temp; for( loopcnt = row; loopcnt < row + 4; loopcnt ++) { if(loopcnt >= 4) temp = loopcnt - 4; else temp = loopcnt; switch(keyboard_scan_status[temp]) { case KEYBOARD_SCAN_FIRST: *keyboard_port_scan = output_0x02000000 & (~(0x00000001<<temp)); keyboard_scan_status[temp] = KEYBOARD_SCAN_SECOND; bexit = 1; break; case KEYBOARD_SCAN_SECOND: input_key[temp] = (*keyboard_port_value) & key_mask; if(input_key[temp] == key_mask) keyboard_scan_status[temp] = KEYBOARD_SCAN_FIRST; else { keyboard_scan_status[temp] = KEYBOARD_SCAN_THIRD; bexit = 1; } break; case KEYBOARD_SCAN_THIRD: if (((*keyboard_port_value) & key_mask) != input_key[temp]) keyboard_scan_status[temp] = KEYBOARD_SCAN_FIRST; else { ascii_key = key_get_char(temp, input_key[temp]); keyboard_scan_status[temp] = KEYBOARD_SCAN_FOURTH; *keyboard_port_scan = output_0x02000000 & (~(0x00000001<<temp)); bexit = 1; } break; case KEYBOARD_SCAN_FOURTH: input_key1[temp] = (*keyboard_port_value) & key_mask; if(input_key1[temp] == key_mask) { key_recv_key(ascii_key); keyboard_scan_status[temp] = KEYBOARD_SCAN_FIRST; }else { *keyboard_port_scan = output_0x02000000 & (~(0x00000001<<temp)); bexit = 1; } break; } if(bexit) break; } row = temp;}char DrvKeyGet(){ char ch; if(key_recv_write == key_recv_read) { /* no key found */ ch = 0; }else { ch = key_recv_buf[key_recv_read]; key_recv_read ++; if(key_recv_read >= RECV_CMD_MAX_BUF) key_recv_read = 0; } return ch;}char DrvKeyGetNoDel(){ char ch; if(key_recv_write == key_recv_read) { /* no key found */ ch = 0; }else { ch = key_recv_buf[key_recv_read]; } return ch;}void key_timer(int signo){ Kbd_Scan(); pulse_timer(); ad_poll_timer();} void key_init_sigaction(void){ struct sigaction act; act.sa_handler=key_timer; act.sa_flags=0; sigemptyset(&act.sa_mask); sigaction(SIGPROF,&act,NULL); /* begin get the time */ gettimeofday(&key_tpstart,NULL);}void key_init_time(){ struct itimerval value; value.it_value.tv_sec=0; value.it_value.tv_usec=1; value.it_interval=value.it_value; setitimer(ITIMER_PROF,&value,NULL);}void key_init(){ key_init_sigaction(); key_init_time();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -