作者:51buddy 人機交互(Human-Computer Interaction, 簡寫HCI):是指人與計算機之間使用某種對話語言,以一定的交互方式,為完成確定任務的人與計算機之間的信息交換過程。 從上面的定義,可能太抽象化了,用生活中的例子來說,假如你要吃水煮魚,選擇不同功能電磁爐,人的勞累程度不一樣。怎么樣才可以做出色香俱全的菜肴,不同電磁爐提供的交互方法不同,有些電磁爐可以通過設定長時間低功率把魚和其他配料味道燉在一起, 有些只能調整功率,也是可以做出美味的,有些一鍵設置模式,按普遍規律固定方法煮魚。 以上其實就是三種不同人機交互方式來完成相同功能,各有不同市場需求。 今天把我學習理解到的 msOS GUI 設計跟大家分享。 msOS 靈活運用結構體,仿C# 的風格,輕便的設計出在硬件 JN12864J LCD上可交互的顯示GUI, 設計思想是按添加組件方法,靈活的處理多界面,不同數據類型顯示及參數調整。采用面向對象及鏈表方式設計方式如 Form、Label及TextBox等控件,讓圖形界面設計非常簡單而讓設計者只關心業務邏輯設計。 具體見如下框圖。 ![]() 表方式: 詳細見如下函數 typedef struct LabelSelf { byte X; // display information at X'row location,it's only 4 row. byte Y; //display information at Y'column location byte Shift; // int Offset; DataType Type; DataAlign Align; void * DataPoint; const string * StringBlockPoint; struct LabelSelf * NextLabelPoint;//鏈表 }Label; 界面設計:mmi.c 文件,通過注冊控件方式,比如一個界面就是一個Form,一個form 由Label 及TextBox 及 BackText 構成。其中BackText 為固定內容,動態數據由Label 及TextBox 來控制。 目前程序做了5個Form Logo、check,work,setup,service。拿一個最簡單的Form 來分析。 System.Gui.Form.Initialize(&App.Menu.CheckForm);// 即一個LCD 界面,目前只是顯示三個三角形,可以編寫 實現自己公司的LOGO. CheckChart.Character = '*'; for(i = 0; i < 16; i++) { CheckChart.Column = 0; } App.Menu.CheckForm.ChartPoint = &CheckChart; 業務邏輯部分已經包含到控件的結構體定義中去,我們只要編寫函數改變控件中相應變量,相對應的分層文件為data.c void InitializeData(void) { App.Data.Frequence = 980000; App.Data.Power = 6000; App.Data.PowerPercent = 12; App.Data.Voltage = 99; App.Data.Current = 101; App.Data.Temperature = -25; App.Data.State = 1; App.Data.MaxPower = 6000; App.Data.MaxTemperature = 50; App.Data.MaxFrequence = 980000; App.Data.MaxFrequenceOffset = 100000; App.Data.MinStream = 50; App.Data.SerialNumber = 0; App.Data.ProductionDate = (13 << 16) + (7 << 8) + 24; App.Data.IdentifyNumber0 = 0x12345678; App.Data.IdentifyNumber1 = 0x34567890; App.Data.IdentifyNumber2 = 0x56789012; App.Data.IdentifyNumber3 = 0x78901234; } 備注:GUi.c 中的一些函數設置很巧妙,必須要結合硬件驅動,這里驅動更加巧妙。 幾個關鍵點如下: GUi.c 如下函數設計來源硬件驅動及硬件功能。 static char GuiBuffer[4][16];//用于交換顯示的數據結構,顯示4行16個字符。 static char DisplayBuffer[4][16]; //64×16 位字符顯示 RAM(DDRAM 最多 16 字符×4 行,LCD 顯示范圍 16×2 行) 硬件驅動基礎函數: static void LcdSendData(byte data)// 寫數據 static void LcdSendInstruct(byte instruct)// 寫指令 封裝函數 static void LcdDisplayString(byte y, string string) 最后是通過DisplayString來調用封裝函數。 System.Device.Lcd.DisplayString = LcdDisplayString; DisplayString 函數是通過GUI.C 中的Updata 函數來更新顯示數據。 static void Update(void) { byte i, j; bool update; for (i = 0; i < 4; i++) { update = false; for (j = 0; j < 16; j++) { if(DisplayBuffer[j] != GuiBuffer[j]) { DisplayBuffer[j] = GuiBuffer[j]; update = true; } } if(update == true) { System.Device.Lcd.DisplayString(i, DisplayBuffer); } else { DelayMs(1); } } } 硬件驅動設計跟硬件相關的幾點理解: const char Array[4] = { 0x80, 0x90, 0x88, 0x98 }; //來源于手冊如下描述,DDRAM 行地址。 ![]() variable = 0x00F80000 | ((instruct & 0xF0) << 8) |((instruct & 0x0F) << 4); variable = 0x00FA0000 | ((data & 0xF0) << 8) |((data & 0x0F) << 4); // 來源于SPI 時序,上述就是組合出一次通信需要傳輸24BIT。 ![]() |