希望本部落格能引發大家學習的熱情。
跟上一次一樣,今天還是拿EasyLogger來修改。
第一步當然還是使用HID descriptor tool把下面的表格自動轉換成程式碼,這部份大家應該已經很熟,所以就不再重覆了。要是不小心忘記了,回去看一下上次的自製USB HID搖桿就好了。網路可以查到的東西就不太需要背誦下來,讓大腦用在獨特的地方比較好。這句話的意思是說:大家一定要記得把這個部落格放進書籤。
轉出來就是下面這樣的程式碼
PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE
// (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
上面這張表格的意思是我們向系統註冊了5 個byte大小的資料表來表示我們的滑鼠的資料,分別是按鍵狀態和X及Y的絕對座標。所以每當我們像下面這個程式片段傳5 個byte給PC時系統就會去對滑鼠游標做相對應的動作。
if (key & 1 << BIT_S)
reportBuffer[0] = 0;
else
reportBuffer[0] = 1;
if (keyBoth) {
if (key & 1 << BIT_A ) {
reportBuffer[1] = 0x32;
reportBuffer[2] = 0x52;
reportBuffer[3] = 0x3f;
reportBuffer[4] = 0x10;
}else{
reportBuffer[1] = 0x98;
reportBuffer[2] = 0x50;
reportBuffer[3] = 0x3f;
reportBuffer[4] = 0x10;
}
今天的程式是平常在工作時使用USB示波器(如下圖),在移動觀察波形的時間軸時非常不方便,所以就做了今天這個小電路來取代滑鼠。這樣USB示波器用起來的感覺就跟真的示波器差不多了。