📄 comm_drive.c
字号:
/* IAL输入引擎底层驱动。 本驱动程序是用于SmartARM2200开发板,开发板只有16个按键 输入,没有鼠标或触摸屏。*/#include "common.h"#include "minigui.h"/* P0口寄存器定义 */#define IO0PIN (*((volatile unsigned long *) 0xE0028000)) #define IO0DIR (*((volatile unsigned long *) 0xE0028008)) #define PINSEL1 (*((volatile unsigned long *) 0xE002C004))/* ZLG7290键盘中断引脚信号 */#define HAVE_KEY (1<<30)extern int fd_zlg7290;/* 注意:要跟据驱动SWAP_XY_EN定义来设置这两个宏 */#define GUI_LCM_XMAX 240 /* 定义液晶x轴的点数 */#define GUI_LCM_YMAX 320 /* 定义液晶y轴的点数 */static unsigned char key_in; // 按键值变量/* (模拟)鼠标左、中、右按键键值定义 */#define IAL_MOUSE_LEFTBUTTON 4#define IAL_MOUSE_MIDDLEBUTTON 2#define IAL_MOUSE_RIGHTBUTTON 1/* (模拟)鼠标上下左右移动按键键值定义 */#define MOUSE_UPMOUVE 80#define MOUSE_DOWNMOUVE 81#define MOUSE_LEFTMOUVE 82#define MOUSE_RIGHTMOUVE 83/* --------------------- For Common IAL Engine ----------------- *//* Should be implemented if you use common ial engine in MiniGUI */#define COMM_MOUSEINPUT 0x01 /* 鼠标或触摸屏事件 */#define COMM_KBINPUT 0x02 /* 按键事件 *//* 定义按键功能,16个按键安排如下: ----------------------------- | TAB | ENTER| ESC | BACK | ----------------------------- | 9 | 0 | - | SPACE| ----------------------------- | 5 | 6 | 7 | 8 | ----------------------------- | 1 | 2 | 3 | 4 | -----------------------------*/typedef struct{ unsigned char event; unsigned char value;} KEY_MOUSE_EVENT;KEY_MOUSE_EVENT EVENT_CHG_TAB[16] = { {COMM_KBINPUT, SCANCODE_1}, {COMM_KBINPUT, SCANCODE_2}, {COMM_KBINPUT, SCANCODE_3}, {COMM_KBINPUT, SCANCODE_4}, {COMM_KBINPUT, SCANCODE_5}, {COMM_KBINPUT, SCANCODE_6}, {COMM_KBINPUT, SCANCODE_7}, {COMM_KBINPUT, SCANCODE_8}, {COMM_KBINPUT, SCANCODE_9}, {COMM_KBINPUT, SCANCODE_0}, {COMM_KBINPUT, SCANCODE_MINUS}, {COMM_KBINPUT, SCANCODE_SPACE}, {COMM_KBINPUT, SCANCODE_TAB}, {COMM_KBINPUT, SCANCODE_ENTER}, {COMM_KBINPUT, SCANCODE_ESCAPE}, {COMM_KBINPUT, SCANCODE_BACKSPACE} };/* 判断是否有按键 有按键返回1,否则返回0 */unsigned char IsKeyIn(void){ int i; for(i=0; i<50; i++); if((IO0PIN&HAVE_KEY) != 0) return(0); else return(1);}/* 读取键值 返回值即为按键值,为0时表示无按键。*/unsigned char ZLG7290_GetKey(void){ unsigned char temp[2]; temp[0] = 1; temp[1] = 0; write(fd_zlg7290, temp, 1); read(fd_zlg7290, temp, 2); return(temp[0]);} /* * Waits for input for keyboard and touchpanel. * If no data, this function should go into sleep; * when data is available, keyboard or touchpanel driver should wake up * the task/thread in MiniGUI who call comm_wait_for_input. * * Normal implementation make this function sleep on a ucosii semaphore. * return COMM_MOUSEINPUT or COMM_KBINPUT according to type of the input event. */// 查询键盘或鼠标事件int comm_wait_for_input (void){ static unsigned char s_key_sta = 0; unsigned char key; /* 设置P0.30口为输入模式 */ PINSEL1 = PINSEL1 & 0xCFFFFFFF; IO0DIR = IO0DIR & 0xBFFFFFFF; while(1) { if(s_key_sta==0) // 上次没有按键 { if(IsKeyIn()) { key = ZLG7290_GetKey(); // 读取按键 } else { key = 0; } } else { if(!IsKeyIn()) { key = ZLG7290_GetKey(); // 读取按键 } } if(key) // 如果有按键,则判断是单击还是连击 { if(s_key_sta==0) // 按键单击 { /* 设置消息中的按键值。d7位表示按键状态,按下为1, 放开为0;d3--d0为相应的按键值。 */ key_in = (key-1)&0x0F; // 原按键值为1-16,所以要减1变为0-15 key_in |= 0x80; s_key_sta = 1; return(EVENT_CHG_TAB[(key_in&0x0F)].event); } else // 按键连击 { // 不处理连击 } } else // 如果是没有按键,则判断是否按键放开 { if(s_key_sta != 0) // 按键放开 { key_in &= 0x0F; s_key_sta = 0; return(EVENT_CHG_TAB[(key_in&0x0F)].event); } } // end of if(key)...else... usleep(15 * 1000); } // end of while(1)... return(0); }/* * Gets touchpanel position and button data. * x, y : position values * button : Non-zero value means pen is down. */// 该函数的返回值可以是IAL_MOUSE_LEFTBUTTON(表示左键按下)、// IAL_MOUSE_RIGHTBUTTON(表示右键按下)等值"或"的结果。// 取得鼠标/触摸屏的参数int comm_ts_getdata (int *x, int *y, int *button) { /* 根据按键按下或放开进行相应的处理 */ if((key_in&0x80) != 0) // 按键按下 { switch(EVENT_CHG_TAB[(key_in&0x0F)].value) { case MOUSE_DOWNMOUVE: // 鼠标下移 *y = (*y) + 5; if((*y) > (GUI_LCM_YMAX-1)) { *y = GUI_LCM_YMAX - 1; } break; case MOUSE_UPMOUVE: // 鼠标上移 *y = (*y) - 5; if((*y) < 0) { *y = 0; } break; case MOUSE_RIGHTMOUVE: // 鼠标右移 *x = (*x) + 5; if((*x) > (GUI_LCM_XMAX-1)) { *x = GUI_LCM_XMAX-1; } break; case MOUSE_LEFTMOUVE: // 鼠标左移 *x = (*x) - 5; if((*x) < 0) { *x = 0; } break; case IAL_MOUSE_LEFTBUTTON: // 鼠标左键 case IAL_MOUSE_RIGHTBUTTON: // 鼠标右键 *button = EVENT_CHG_TAB[(key_in&0x0F)].value; break; default: return(-1); } // end of switch(EVENT_CHG_TAB[(key&0x0F)].value) } else // 按键放开 { *button = 0; } // end of if((key&0x80) != 0)...else... return(0);}/* * Gets keyboard key data. * key : return MiniGUI scancode of the key. * key_status : key down or up, non-zero value means down. */// 取得按键的参数int comm_kb_getdata (short *key, short *key_status) { /* 根据按键按下或放开进行相应的处理 */ if((key_in&0x80) != 0) // 按键按下 { *key = EVENT_CHG_TAB[(key_in&0x0F)].value; *key_status = 1; } else // 按键放开 { *key_status = 0; } // end of if((key&0x80) != 0)...else... return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -