原打算用MF開發一個類似Windows桌面的程式(因為發現MF居然支援漸進色,可以繪很炫的界面),由于目前的模拟器僅支援5個鍵,是以在做類Windows開始菜單的時候犯了難,4個方向鍵和一個OK鍵,沒有一個适合做開始菜單鍵的。記得Digi的模拟器至少支援9個鍵,既然他能做,理論上我也可以。一陣研究後還真有了成效,在五個鍵的基礎上我又添加了兩個鍵,一個是菜單鍵(對應PC鍵盤可以是Windows鍵或空格鍵),一個是傳回鍵(對應PC鍵盤上的ESC鍵),也就是說我原來做得模拟器上的那兩個鍵終于起作用了。
添加完這兩個鍵後,突然靈機一動,以前我苦苦不能做的IO模拟功能,應該也可以做了,做Windows界面的心沒有了,轉為一心研究IO模拟器了,功夫不負有心人,幾個小時後便大功能告成了。把以前Digi開發的IO測試程式稍加調整一下就可以試了(需要重新設定一下Pin)。運作界面如下:
測試代碼如下:
public class DigiTest
{
public static void Main()
{
//Digi
//Cpu.Pin[] pin = new Cpu.Pin[5] { (Cpu.Pin)0, (Cpu.Pin)1, (Cpu.Pin)2, (Cpu.Pin)5, (Cpu.Pin)6 };
OutputPort[] output = new OutputPort[8];
InputPort[] input = new InputPort[8];
//葉帆模拟器GPIO的pin定義
Cpu.Pin[] pin_I = new Cpu.Pin[8] { (Cpu.Pin)10, (Cpu.Pin)11, (Cpu.Pin)12, (Cpu.Pin)13, (Cpu.Pin)14,(Cpu.Pin)15, (Cpu.Pin)16, (Cpu.Pin)17 };
Cpu.Pin[] pin_Q = new Cpu.Pin[8] { (Cpu.Pin)20, (Cpu.Pin)21, (Cpu.Pin)22, (Cpu.Pin)23, (Cpu.Pin)24, (Cpu.Pin)25, (Cpu.Pin)26, (Cpu.Pin)27 };
for (int i = 0; i < 8; i++)
{
input[i] = new InputPort(pin_I[i], false, Port.ResistorMode.PullDown);
output[i] = new OutputPort(pin_Q[i], false);
}
int intNum = 0;
while (true)
output[intNum].Write(!output[intNum].Read());
Debug.Print(input[0].Read().ToString() + " " + input[1].Read().ToString() + " " + input[2].Read().ToString() + " " + input[3].Read().ToString() + " " + input[4].Read().ToString()+ " " + input[5].Read().ToString() + " " + input[6].Read().ToString() + " " + input[7].Read().ToString());
Thread.Sleep(1000);
if (++intNum > 7) intNum = 0;
}
}
運作後,效果果然不錯,改變輸入,則調試資訊中出現對應的變化(通過這個也深刻了解了new InputPort(pin_I[i], false, Port.ResistorMode.PullDown)中的上拉和下拉的含義),同時程式中改變輸出,則對應的輸出燈也在同步亮滅。
細心的讀者會發現,我的模拟器可以讓InputPort和OutputPort的執行個體同時運作,原因就是他們的Pin值不同,而Digi的I/O共用了0、1、2、5、6(天知道他們為什麼要這樣?)。
以後在測試相關的IO應用,不必接上硬體了,直接用模拟器就可以了。不知道模拟器是否支援序列槽模拟(映射PC機實體序列槽),以後有時間研究一下。不過我想TCP/IP一定會有問題,一是MF目前的TCP/IP都不完善,第二模拟器目前也不可能支援虛拟網卡(類似PPC模拟器或虛拟機)。
目前模拟器支援8路數字量入,8路數字量出,模拟量以後有機會在加入。
[注:目前微軟官方的模拟器僅支援LCD和5個按鍵功能,其它的都不支援]