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

📄 comm_drive.c

📁 Linux没有图形界面还是不好看
💻 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 + -