人機(jī)交互(Human-Computer Interaction, 簡(jiǎn)寫(xiě)HCI):是指人與計(jì)算機(jī)之間使用某種對(duì)話語(yǔ)言,以一定的交互方式,為完成確定任務(wù)的人與計(jì)算機(jī)之間的信息交換過(guò)程。
從上面的定義,可能太抽象化了,用生活中的例子來(lái)說(shuō),假如你要吃水煮魚(yú),選擇不同功能電磁爐,人的勞累程度不一樣。怎么樣才可以做出色香俱全的菜肴,不同電磁爐提供的交互方法不同,有些電磁爐可以通過(guò)設(shè)定長(zhǎng)時(shí)間低功率把魚(yú)和其他配料味道燉在一起, 有些只能調(diào)整功率,也是可以做出美味的,有些一鍵設(shè)置模式,按普遍規(guī)律固定方法煮魚(yú)。
以上其實(shí)就是三種不同人機(jī)交互方式來(lái)完成相同功能,各有不同市場(chǎng)需求。
今天把我學(xué)習(xí)理解到的 msOS GUI 設(shè)計(jì)跟大家分享。
msOS 靈活運(yùn)用結(jié)構(gòu)體,仿C# 的風(fēng)格,輕便的設(shè)計(jì)出在硬件 JN12864J LCD上可交互的顯示GUI,
設(shè)計(jì)思想是按添加組件方法,靈活的處理多界面,不同數(shù)據(jù)類型顯示及參數(shù)調(diào)整。采用面向?qū)ο蠹版湵矸绞皆O(shè)計(jì)方式如
Form、Label及TextBox等控件,讓圖形界面設(shè)計(jì)非常簡(jiǎn)單而讓設(shè)計(jì)者只關(guān)心業(yè)務(wù)邏輯設(shè)計(jì)。
具體見(jiàn)如下框圖。
表方式:
詳細(xì)見(jiàn)如下函數(shù)
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;
界面設(shè)計(jì):mmi.c 文件,通過(guò)注冊(cè)控件方式,比如一個(gè)界面就是一個(gè)Form,一個(gè)form 由Label 及TextBox 及 BackText 構(gòu)成。其中BackText 為固定內(nèi)容,動(dòng)態(tài)數(shù)據(jù)由Label 及TextBox 來(lái)控制。
目前程序做了5個(gè)Form Logo、check,work,setup,service。拿一個(gè)最簡(jiǎn)單的Form 來(lái)分析。
System.Gui.Form.Initialize(&App.Menu.CheckForm);// 即一個(gè)LCD 界面,目前只是顯示三個(gè)三角形,可以編寫(xiě)
實(shí)現(xiàn)自己公司的LOGO.
CheckChart.Character = ’*‘;
for(i = 0; i 《 16; i++)
{
CheckChart.Column = 0;
}
App.Menu.CheckForm.ChartPoint = &CheckChart;
業(yè)務(wù)邏輯部分已經(jīng)包含到控件的結(jié)構(gòu)體定義中去,我們只要編寫(xiě)函數(shù)改變控件中相應(yīng)變量,相對(duì)應(yīng)的分層文件為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 中的一些函數(shù)設(shè)置很巧妙,必須要結(jié)合硬件驅(qū)動(dòng),這里驅(qū)動(dòng)更加巧妙。
幾個(gè)關(guān)鍵點(diǎn)如下:
GUi.c 如下函數(shù)設(shè)計(jì)來(lái)源硬件驅(qū)動(dòng)及硬件功能。
static char GuiBuffer[4][16];//用于交換顯示的數(shù)據(jù)結(jié)構(gòu),顯示4行16個(gè)字符。
static char DisplayBuffer[4][16];
//64×16 位字符顯示 RAM(DDRAM 最多 16 字符×4 行,LCD 顯示范圍 16×2 行)
硬件驅(qū)動(dòng)基礎(chǔ)函數(shù):
static void LcdSendData(byte data)// 寫(xiě)數(shù)據(jù)
static void LcdSendInstruct(byte instruct)// 寫(xiě)指令
封裝函數(shù)
static void LcdDisplayString(byte y, string string)
最后是通過(guò)DisplayString來(lái)調(diào)用封裝函數(shù)。
System.Device.Lcd.DisplayString = LcdDisplayString;
DisplayString 函數(shù)是通過(guò)GUI.C 中的Updata 函數(shù)來(lái)更新顯示數(shù)據(jù)。
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);
}
}
}
硬件驅(qū)動(dòng)設(shè)計(jì)跟硬件相關(guān)的幾點(diǎn)理解:
const char Array[4] =
{
0x80, 0x90, 0x88, 0x98
}; //來(lái)源于手冊(cè)如下描述,DDRAM 行地址。
variable = 0x00F80000 | ((instruct & 0xF0) 《《 8) |((instruct & 0x0F) 《《 4);
variable = 0x00FA0000 | ((data & 0xF0) 《《 8) |((data & 0x0F) 《《 4);
// 來(lái)源于SPI 時(shí)序,上述就是組合出一次通信需要傳輸24BIT。
評(píng)論
查看更多