⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 该源码是创维特ARM7 JX44B0X板的例子程序
💻 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 + -