TI-Basic Z80 编程/命令列表/GetKey
Getkey 是 TI-Basic 中用户交互的重要功能。getkey 可以发现在 PGRM...Right...7... 中,它将显示以下内容
:getkey
是的,它将在执行该代码块时获取按键的编号。但是,该 getkey 很短,因此很难获得准确的按键编号。因为如果你在执行它时没有按任何键,它将返回 0。
请记住,没有执行某种操作的情况下,
:getkey->X
getkey 将把其结果存储在 Ans 变量中。
如何获取准确的记录?
好吧,有一个简单的 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,那么你就不走运了。与 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 希望这有帮助!