www.pudn.com > armexamples.rar > keyboard.c
#include#include "2410addr.h" #include "2410lib.h" #include "timer.h" #include "interrupt.h" #define RECV_CMD_MAX_BUF 2048 char 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; // 键盘扫描 int timer1_count = 0; enum KEYBOARD_SCAN_STATUS { KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_SECOND, KEYBOARD_SCAN_THIRD, KEYBOARD_SCAN_FOURTH }; int row = 0; extern unsigned char output_0x10000000; unsigned char ascii_key, input_key[4], input_key1[4], key_mask = 0x0F; unsigned char* keyboard_port_scan = (unsigned char*)0x10000000; unsigned char* keyboard_port_value = (unsigned char*)0x10000002; int keyboard_scan_status[4] = { KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST }; char key_get_char(int row, int col) { char key = 0; switch( row ) { case 0: if((col & 0x01) == 0) key = '0'; else if((col & 0x02) == 0) key = 'A'; else if((col & 0x04) == 0) key = 'B'; else if((col & 0x08) == 0) key = 'F'; break; case 1: if((col & 0x01) == 0) key = '7'; else if((col & 0x02) == 0) key = '8'; else if((col & 0x04) == 0) key = '9'; else if((col & 0x08) == 0) key = 'E'; break; case 2: if((col & 0x01) == 0) key = '4'; else if((col & 0x02) == 0) key = '5'; else if((col & 0x04) == 0) key = '6'; else if((col & 0x08) == 0) key = 'D'; break; case 3: if((col & 0x01) == 0) key = '1'; else if((col & 0x02) == 0) key = '2'; else if((col & 0x04) == 0) key = '3'; else if((col & 0x08) == 0) key = 'C'; break; default: break; } return key; } /******************************************************************** // Function name : recv_key // Description : 将获取的键值加入按键缓冲区 // Return type : void // Argument : int key *********************************************************************/ void 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; } } /******************************************************************** // Function name : Kbd_Scan // Description : 定时器1中断服务程序,用于扫描键盘,每隔10ms一次中断 // Return type : void // Argument : void *********************************************************************/ 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_0x10000000 & (~(0x00000001< = RECV_CMD_MAX_BUF) key_recv_read = 0; } return ch; } /******************************************************************** // Function name : Key_GetKeyPoll(查询方式) // Description : 如果有键按下返回键,否则返回0 // Return type : char // Argument : *********************************************************************/ char Key_GetKeyPoll() { int row; unsigned char ascii_key, input_key, input_key1, key_mask = 0x0F; for( row = 0; row < 4; row++) { *keyboard_port_scan = output_0x10000000 & (~(0x00000001< |