int main(void) { u8 key; u8 i=0; s8 x0; //发送到电脑端的坐标值 s8 y0; u8 keysta; //[0]:0,左键松开;1,左键按下; //[1]:0,右键松开;1,右键按下 //[2]:0,中键松开;1,中键按下 u8 tpsta=0; //0,触摸屏第一次按下;1,触摸屏滑动 short xlast; //最后一次按下的坐标值 short ylast; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口1初始化 LCD_Init(); //初始化液晶 LED_Init(); //LED初始化 KEY_Init(); //按键初始化 TP_Init(); //初始化触摸屏 usmart_dev.init(72); //usmart初始化 POINT_COLOR=RED; LCD_ShowString(60,50,200,16,16,"WarShip STM32"); LCD_ShowString(60,70,200,16,16,"USB Mouse TEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2012/9/24"); LCD_ShowString(60,130,200,16,16,"KEY_UP:SCROLL +"); LCD_ShowString(60,150,200,16,16,"KEY_DOWN:SCROLL -"); LCD_ShowString(60,170,200,16,16,"KEY_RIGHT:RIGHT BTN"); LCD_ShowString(60,190,200,16,16,"KEY_LEFT:LEFT BTN"); delay_ms(1800); usb_port_set(0); //USB先断开 delay_ms(300); usb_port_set(1); //USB再次连接 //USB配置 USB_Interrupts_Config(); Set_USBClock(); USB_Init(); Load_Draw_Dialog(); while(1) { key=KEY_Scan(1);//支持连按 if(key) { if(key==KEY_UP)Joystick_Send(0,0,0,1); //发送滚轮数据到电脑 else if(key==KEY_DOWN)Joystick_Send(0,0,0,(u8)-1); //发送滚轮数据到电脑 else { if(key==KEY_LEFT)keysta|=0X01; //发送鼠标左键 if(key==KEY_RIGHT)keysta|=0X02; //发送鼠标右键 Joystick_Send(keysta,0,0,0); //发送给电脑 } }else if(keysta)//之前有按下 { keysta=0; Joystick_Send(0,0,0,0); //发送松开命令给电脑 } tp_dev.scan(0); if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下 { //最少移动5个单位,才算滑动 if(((usb_abs(tp_dev.x,xlast)>4)||(usb_abs(tp_dev.y,ylast)>4))&&tpsta==0)//滑动 { xlast=tp_dev.x; //记录刚按下的坐标 ylast=tp_dev.y; tpsta=1; } if(tp_dev.x<lcddev.width&&tp_dev.y<lcddev.height) { if(tp_dev.x>216&&tp_dev.y<16)Load_Draw_Dialog();//清除 else TP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED); //画图 if(bDeviceState==CONFIGURED) { if(tpsta)//滑动 { x0=(xlast-tp_dev.x)*3; //上次坐标值与新坐标值之差,扩大3倍 y0=(ylast-tp_dev.y)*3; xlast=tp_dev.x; //记录刚按下的坐标 ylast=tp_dev.y; Joystick_Send(keysta,-x0,-y0,0); //发送数据到电脑 delay_ms(5); } } } }else { tpsta=0;delay_ms(1);}//清除 if(bDeviceState==CONFIGURED)LED1=0;//USB配置成功,LED1亮,否则,灭 else LED1=1; i++; if(i==200) {i=0; LED0=!LED0;} } }
在此部分代码用于实现我们在硬件设计部分提到的功能,USB的配置通过三个函数完成:USB_Interrupts_Config()、Set_USBClock()和USB_Init(),第一个函数用于设置USB唤醒中断和USB低优先级数据处理中断,Set_USBClock函数用于 配置USB时钟,也就是从72M的主频得到48M的USB时钟(1.5分频)。最后USB_Init()函数用于初始化USB,最主要的就是调用了Joystick_init函数,开启了USB部分的电源等。这里需要特别说明的是,USB配置并没有对PA11和PA12这两个IO口进行设置,是因为,一旦开启了USB电源(USB_CNTR的PDWN位清零)PA11和PA12将不再作为其他功能使用,仅供USB使用,所以在开启了USB电源之后不论你怎么配置这两个IO口,都是无效的。要在此获取这两个IO口的配置权,则需要关闭USB电源,也就是置位USB_CNTR的PDWN位,我们通过usb_port_set函数来禁止/允许USB连接,在复位的时候,先禁止,再允许,这样每次我们按复位电脑都可以识别到USB鼠标,而不需要我们每次都拔USB线。 USB数据发送,我们采用Joystick_Send来实现,我们将得到的鼠标数据,在Joystick_Send函数里面打包,并通过USB端点1发送到电脑。 软件设计部分,就给大家介绍到这里。 54.4 下载验证 在代码编译成功之后,我们下载代码到ALIENTEK战舰STM32开发板上,在USB没有配置成功的时候,其界面同第三十一章的实验是一模一样的,如图54.4.1所示:
图54.4.1 USB无连接时的界面
此时DS1不亮,DS0闪烁,其实就是一个触摸屏画图的功能,而一旦我们将USB连接上(将USB线接到USB接头上,而不是USB_232接头上,如果你有两根USB线,则可以两个同时都接上,他们不会相互影响),则可以看到DS1亮了,而且在电脑上会提示发现新硬件如图54.4.2所示:
图 54.4.2 电脑提示找到新硬件 在硬件安装完成之后,我们在设备管理器里面可以发现多出了一个人体学输入设备,如图54.4.3所示:
图 54.4.3 USB人体学输入设备 此时我们按动触摸屏,就可以发现电脑屏幕上的光标随着你在触摸屏上的移动而移动了,同时可以通过按键KEY0和KEY2模拟鼠标左键和右键,通过按键WK_UP和KEY1模拟鼠标滚轮。 |