跳转到内容

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 希望这有帮助!

华夏公益教科书