跳轉到內容

TI-Basic Z80 程式設計/命令列表/GetKey

來自華夏公益教科書,自由的教科書

簡介和語法

[編輯 | 編輯原始碼]

Getkey 是 TI-Basic 中使用者互動的重要功能。getkey 可以發現在 PGRM...Right...7... 中,它將顯示以下內容

:getkey

是的,它將在執行該程式碼塊時獲取按鍵的編號。但是,該 getkey 很短,因此很難獲得準確的按鍵編號。因為如果你在執行它時沒有按任何鍵,它將返回 0。

請記住,沒有執行某種操作的情況下,

:getkey->X

getkey 將把其結果儲存在 Ans 變數中。

使用 While 和 Goto 迴圈獲取按鍵

[編輯 | 編輯原始碼]

如何獲取準確的記錄?

好吧,有一個簡單的 while 迴圈可以做到。它非常容易,我將在下面解釋...

:While 1
:getkey
:If ans
:
''Things to do''
:
:End

它之所以有效,是因為首先,你設定了一個迴圈。如果沒有按下任何鍵,它將跳過 if 條件,然後按順序執行它下面的任何其他內容。看,如果 getkey 返回了 0,那麼計算器將跳過 if 條件,直接回到迴圈開頭,再次檢查 getkey。因此,這將一直持續到按下鍵!

通知按下按鈕

[編輯 | 編輯原始碼]

此示例將在按下按鈕時顯示“BUTTON PRESSED”。

:0→K
:While K=0
:getKey→K
:End
:Disp "BUTTON PRESSED"

現在,我將逐行解釋...

:Lbl K

該 Lbl K 用於在需要獲取按下的按鍵編號時始終迴圈回。它將使迴圈成為可能。

:getkey→K

這是最重要的部分。你需要 getkey 來獲取按鍵編號!'→K' 將把 getkey 的返回值儲存到變數 'K' 中。

:While K>0

此 while 迴圈也很重要,因為你希望某些操作僅在按下鍵時發生。因此,按鍵值在 K 中,它將檢查 K 是否實際上大於 0。如果是,它將執行程式碼塊 'Disp "BUTTON PRESSED"'.

:Disp "BUTTON PRESSED"

你還需要它來實際檢視按鈕是否被按下。每當 While 迴圈被執行時,Disp 命令將被執行,顯示一個通知...

:End

可能錯誤

[編輯 | 編輯原始碼]

這是該程式碼塊最重要的部分。如果沒有 End,結果將是...

:Lbl K
:getkey->K
:While K>0
:Disp "BUTTON PRESSED"
:
:Goto K

現在你注意到有什麼缺陷了嗎?是的!

你認為這段程式碼會重複執行嗎?不!

你知道為什麼它不會重複執行嗎?它不會重複執行,因為那裡沒有 'End'!即使它有 'Goto K' 語句,它仍然在 While 迴圈中,因此,如果沒有按鍵,'Goto K' 不會被執行,導致程式退出。在需要退出 while 迴圈時,包含 'End' 是必不可少的。

顯示按下鍵的對應鍵號

[編輯 | 編輯原始碼]

例如,這將顯示按下的按鍵編號... 你可以在計算器中使用它作為一個小工具。只需按下你想要的按鈕,它將顯示其對應的按鍵編號。如下所示;

:Lbl 1
:getKey
:If Ans > 0
:Disp Ans
:Goto 1

對應特定按鍵

[編輯 | 編輯原始碼]

現在,如果你想對特定按鍵做出響應,例如 2nd 或 Enter,你將 '>0' 更改為 '=N',其中 N 是按鍵編號。圖表如下所示



你注意到有什麼奇怪的嗎?是的!On 沒有“註冊”。此按鍵沒有返回整數,而是返回了一箇中斷,這意味著它會中斷程式。有 ASM 工具可以遮蔽此 On 鍵。它們在TI-Calc.Org 上廣泛可用。無論如何,看看其他按鍵。你注意到它們是如何組織的嗎?


按鍵組織和編號

[編輯 | 編輯原始碼]

是的,每行都以 11...21...31...41...51...61...71...81...91...101... 開頭,這是因為它易於記憶。

這裡,讓我們使用一些例子...

:Lbl 1
:getkey
:If Ans = 11
:Disp "Y= was PRESSED"
:If Ans = 21
:Disp "2ND WAS PRESSED"
:Goto 1

程式碼應該不言自明。它檢查按鍵 11 或 21 是否被按下,並顯示相應的訊息。

使用上/下/左/右箭頭移動畫素

[編輯 | 編輯原始碼]

你是否覺得 Disp 東西很無聊?好吧,讓我們繼續前進,移動東西吧!

現在,我們只移動一個畫素,但隨著你的不斷練習,你會變得越來越複雜!

示例

:ClrDraw
:47→X:31→Y
:Lbl 1
:getKey→K
:If K=25
:ClrDraw
:Y-1→Y
:Pxl-On(Y,X)
:End
:If K=34
:ClrDraw
:Y+1→Y
:Pxl-On(Y,X)
:End
:If K=24
:X-1→X
:Pxl-On (Y,X)
:End
:If K=26
:X+1→X
:Pxl-On (Y,X)
:End
:Goto 1

現在,前面的程式碼只是在螢幕上移動了一個畫素。

ERR-MEMORY

[編輯 | 編輯原始碼]

如果你瘋狂地按按鈕,並收到一條錯誤訊息:ERR-MEMORY,那麼你就不走運了。與 Asm 相比,(可怕的)記憶體錯誤是 BASIC 最糟糕的功能,因為任何 BASIC 程式如果執行時間足夠長,最終都會變慢並停止,並出現記憶體錯誤。記憶體錯誤的主要原因:程式碼效率低下和程式執行時間過長。請注意,使用高效的程式碼,執行時間會長得多... 以下是一個低效程式碼的示例

:0->A
:While A<10
:A+1->A
:If A=5:Goto X
:End
:Lbl X

為什麼?Goto 標籤退出了 While 迴圈,但它仍然停留在記憶體中,因為它從未到達 'End' 命令(簡單地在上面的程式碼中 Lbl X 後面放置 'End' 不會起作用!因此,主要為了最佳化你的程式碼,請擺脫 Goto 和 Lbl,它們對你和你的程式都不利!用更有效的 Repeat、While 和 For 迴圈替換它們。嘿,抱歉,但我建立了一個等式集,它做著同樣的事情,但速度更快,而且程式碼更短 1->B 1->C Lbl0 Output(B,C,"A getkey->A B-(A=25)+(B=34->B C-(A=24)=(A=26->C Goto0 將值儲存在 B 和 C 中 Label 0 在座標中輸出 A,並將按鍵儲存在 A 中 等式不言自明,如果你知道按鍵碼,最後是 goto label0 希望這有幫助!

華夏公益教科書