跳到主要内容

基础控制与跳转

本分册收录基础执行控制类指令 0x00~0x0F,以及专用的引脚输出 / 屏幕输入指令 0x41~0x44:顺序执行、延时与定时、条件跳转、子程序调用、数字输出、等待屏幕输入与数码管扫描。

程序行写作 行号 指令 OP-0 OP-1;操作数解释方式、单位码表与端口体系表统一定义在简述中。

0x00 空操作(SKIP)​

什么也不做——程序计数器直接前进到下一行。

提示

0x00 可以当作"占位行"使用:预留一个空行,方便日后修改程序。

000  00  0000  0000
001 0F 0000 0000
信息
操作数数值/范围备注
P00~P110000 / 0000无关,忽略

0x01 数字输出写​

向一个数字输出引脚写电平。这条指令有两种模式:

Port 模式(P00 = 01,推荐)——向任意可输出端口的某一个引脚写一个电平,引脚按 port<<4 | pin 寻址(见端口体系表)。

旧模式(P00 ≠ 01)——为兼容早期 v1 程序而保留:P10P11 中的写入值(取其低 8 位)直接写入 8 位数字输出寄存器 R26(Port1 LED 网络)。P01 选择目标:FF 一次写全部 8 位,00~07 只写对应的那一位。

警告

0x01 未注册助记符。新程序请改用 0x41 JT / 0x42 DK——它们完成同样的工作且含义更清晰。

000  01  0101  0010
001 02 03E8 0000
002 01 00FF 000F
003 0F 0000 0000

第 000 行(Port 模式)把 Port1 Pin0 置为 HIGH;第 002 行(旧模式)把 0x0F(二进制 b00001111)写到 Port1 的 8 个引脚。因为这条指令没有助记符,两个 Tab 都以指令形式显示。

Port 模式(P00 = 01)
操作数数值/范围备注
P0001Port 模式
P01任意非 0电平 = 1(HIGH)
00电平 = 0(LOW)
P1000~06端口号
P110~F端口内引脚号
旧模式(P00 ≠ 01)
操作数数值/范围备注
P0000旧模式
P01FF把整个 8 位值写入 R26(Port1)
00~07只把值的 bit 0~7 中对应一位写入 R26
P10P110000~FFFF16 位整体:写入值(低 8 位有效)

0x02 延时(YS)​

让程序计数器停留指定的时间,然后执行下一行。

提示

延时值可以是立即数,也可以是寄存器中存放的值。

000  02  03E8  0000
001 02 0005 0003
002 02 0001 FF00
003 0F 0000 0000
004 02 000A 0001 立即数延时:P00P01=000A(10)×单位01(10ms)=延时100ms
005 02 0005 FF03 寄存器延时:P10=FF,P01=05→R05 的值×单位03(1秒);R05=30 则延时30秒

第 000 行:延时 1000 × 1 ms = 1 s(立即数)。第 001 行:延时 5 × 1 s = 5 s(立即数,单位码 3)。第 002 行:延时 R01 × 1 ms(寄存器寻址)。

立即数寻址
操作数数值/范围备注
P00P010000~FFFF16 位整体:延时值
P1000立即数
P1100~04、10单位码
寄存器寻址
操作数数值/范围备注
P00—寄存器寻址时不读取(忽略)
P0100~FF存放延时值的寄存器号
P10FF寄存器寻址标志
P1100~04、10单位码

0x03 定时(DS)​

启动一个倒计时定时器。定时长短由立即数或寄存器值加单位码决定,与 0x02 YS 完全相同。

设置定时器不会让程序停下来——定时器倒计时的同时,后面的行继续执行。计到零时,超时标志寄存器 R23 被置位;程序需要自行清零 R23(例如用 0x10 FZ)。

000  10  0023  0000
001 03 0005 0003
002 01 0101 0010
003 0A 0823 0006
004 02 0064 0000
005 0E 0000 0003
006 01 0100 0010
007 0F 0000 0000
008 03 003C 0004 立即数定时:P00P01=003C(60)×单位04(10秒)=600秒后 R23 被置1,程序不等待继续运行
009 03 0008 FF00 寄存器定时:P10=FF,P01=08→R08 的值×单位00(1ms);之后可查询 R23 判断时间到

先清零超时标志 R23,启动 5 × 1 s 定时器,等待期间点亮 Port1 Pin0,每 100 ms 轮询一次 R23,定时到时把引脚关掉。

信息
操作数数值/范围备注
P00P010000~FFFF16 位整体:定时值(仅立即数寻址有效)
P1000立即数寻址(用 P00P01)
FF寄存器寻址(改用 P01 = 存放定时值的寄存器号,P00 忽略)
P1100~04、10单位码

0x04 大于转(DYZ)​

如果寄存器 x 的值大于寄存器 y 的值,跳到目标行;否则继续执行下一行。

六条条件跳转 0x04~0x09 共用同一操作数格式:

0x04~0x09 共用格式
操作数数值/范围备注
P0000~FF寄存器 x(比较左侧)
P0100~FF寄存器 y(比较右侧)
P10P110000~01FF16 位整体:目标行
000  10  000A  0001
001 10 0005 0002
002 04 0102 0005
003 01 0100 0010
004 0E 0000 0006
005 01 0101 0010
006 0F 0000 0000
007 04 0102 000A R01>R02 时跳转到 00A 行,否则顺序执行

R01 = 10,R02 = 5。因为 R01 > R02,跳转发生,Port1 Pin0 被点亮。

0x05 小于转(XYZ)​

如果 R[x] 小于 R[y],跳到目标行;否则继续。操作数格式与 0x04 相同。

000  10  0003  0001
001 10 0001 0002
002 05 0102 0005
003 02 0064 0000
004 0E 0000 0006
005 01 0101 0010
006 0F 0000 0000
007 05 0102 000A R01<R02 时跳转到 00A 行,否则顺序执行

R01 = 3(剩余次数),R02 = 1(告警阈值)。当 R01 < R02 时告警 LED 点亮。

0x06 等转(DZ)​

如果 R[x] 等于 R[y],跳到目标行;否则继续。操作数格式与 0x04 相同。

000  14  0001  0000
001 10 0001 0002
002 06 0102 0005
003 02 000A 0000
004 0E 0000 0000
005 01 0101 0010
006 0F 0000 0000
007 06 0102 000A R01==R02 时跳转到 00A 行,否则顺序执行

每 10 ms 把 7 个板载按钮(Port0)读入 R01;当 R01 等于按钮 0 的掩码 0001 时点亮 LED。

0x07 大于等于转(DDZ)​

如果 R[x] 大于等于 R[y],跳到目标行;否则继续。操作数格式与 0x04 相同。

000  10  0064  0001
001 10 003C 0002
002 07 0102 0005
003 01 0100 0010
004 0E 0000 0006
005 01 0101 0010
006 0F 0000 0000
007 07 0102 000A R01≥R02 时跳转到 00A 行,否则顺序执行

R01 = 100(分数),R02 = 60(及格线)。分数 ≥ 60 点亮 LED(及格)。

0x08 小于等于转(XDZ)​

如果 R[x] 小于等于 R[y],跳到目标行;否则继续。操作数格式与 0x04 相同。

000  10  0014  0001
001 10 0018 0002
002 08 0102 0005
003 01 0100 0010
004 0E 0000 0006
005 01 0101 0010
006 0F 0000 0000
007 08 0102 000A R01≤R02 时跳转到 00A 行,否则顺序执行

R01 = 20(实测温度),R02 = 24(关加热阈值)。温度 ≤ 24 时接通加热继电器(Port1 Pin0)。

0x09 不等于转(BDZ)​

如果 R[x] 不等于 R[y],跳到目标行;否则继续。操作数格式与 0x04 相同。

000  14  0001  0000
001 10 0001 0002
002 09 0102 0005
003 01 0100 0010
004 0E 0000 0006
005 01 0101 0010
006 0F 0000 0000
007 09 0102 000A R01≠R02 时跳转到 00A 行,否则顺序执行

把按钮读入 R01;只要按下的组合与按钮 0 的掩码不同,LED 就点亮。

0x0A 条件转(TJZ)​

按条件码把专用比较寄存器 R00 与选定寄存器 R[n] 进行比较;条件成立则跳到目标行,否则继续。

信息
操作数数值/范围备注
P0001条件:=
02条件:≠
03条件:>
04条件:<
05条件:≥
06条件:≤
07条件:为 0(只看 R[n])
08条件:非 0(只看 R[n])
P0100~FF寄存器 n(比较右侧)
P10P110000~01FF16 位整体:目标行
警告

R00 是比较专用寄存器(见内部寄存器):要先把左边的值放进 R00。条件码为 07/08 时不执行与 R00 的比较——只看 R[n] 本身是否为零。

000  10  0032  0000
001 10 0032 0001
002 0A 0101 0005
003 01 0100 0010
004 0E 0000 0006
005 01 0101 0010
006 0F 0000 0000
007 0A 0103 000A 条件码01(等于):R0==R03 时跳到 00A 行(R0 先用 FZ 赋值)
008 0A 0203 000A 条件码02(不等于):R0≠R03 时跳到 00A 行
009 0A 0705 000A 条件码07(为0):R05==0 时跳到 00A 行(只看 R05,不用 R0)
00A 0A 0805 000A 条件码08(非0):R05≠0 时跳到 00A 行

R00 = 50,R01 = 50。条件码 01(等于):R00 = R01 成立,跳转发生,LED 点亮。

0x0B 端口跳转(TZ)​

读取一个端口或单个引脚;读到 1 就跳到目标行,否则继续。

整端口模式(P00 = 00)
操作数数值/范围备注
P0000整端口模式
P0100~06端口号;端口内任意引脚读到 1 即跳转
P10P110000~01FF16 位整体:目标行
单引脚模式(P00 = 01)
操作数数值/范围备注
P0001单引脚模式
P0100~6F引脚地址 port<<4 | pin
P10P110000~01FF16 位整体:目标行
警告

Port0(按钮)和 Port3(ADS1115 高于 2.5 V 记 1)是只读的,随时可读。Port1 是双向的——先用 0x14 QS 读它会先切换到输入方向(见端口体系表)。

000  0B  0000  0003
001 02 000A 0000
002 0E 0000 0000
003 01 0101 0010
004 0F 0000 0000
005 0B 0001 000A 整端口模式:P00=00 P01=01→Port1(8路IO)任一位读到1就跳到 00A 行
006 0B 0114 0010 单引脚模式:P00=01 P01=14→1号口4脚读到1就跳到 010 行

每 10 ms 轮询整个 Port0;只要有按钮按下,就点亮 Port1 Pin0。

0x0C 调子程序(DY)​

中断当前流程跳到子程序。返回地址压入深度为 16 层的堆栈,因此 Call + Return 可以嵌套。

警告

目标行号放在 OP-1(P10P11)里,不在 OP-0。目标子程序必须以 0x0D FH 结尾才能回到调用行的下一行。

000  01  0101  0010
001 0C 0000 0004
002 01 0100 0010
003 0F 0000 0000
004 02 0064 0001
005 0D 0000 0000
006 0C 0000 0100 调用以 100 行开头的子程序;子程序结尾必须是 FH

点亮 LED,调用第 004 行的子程序(延时 100 × 10 ms = 1 s),返回后把 LED 熄灭。

信息
操作数数值/范围备注
P00P010000无关
P10P110000~01FF16 位整体:子程序首行

0x0D 返回(FH)​

离开当前子程序,回到调用它的 0x0C DY 的下一行继续执行。

警告

必须与 0x0C 配对使用。每条调用路径都需要自己的 FH,否则堆栈会失步。

信息
操作数数值/范围备注
P00~P110000 / 0000无关,忽略

示例见 0x0C。

0x0E 转移(ZY)​

无条件跳到目标行。

000  01  0101  0010
001 02 00C8 0001
002 01 0100 0010
003 02 00C8 0001
004 0E 0000 0000
005 0E 0000 0020 无条件跳转到 020 行

一个 2 s 的闪烁循环:第 004 行的跳转永远回到第 000 行。

信息
操作数数值/范围备注
P00P010000无关
P10P110000~01FF16 位整体:目标行

0x0F 结束(JS)​

终止程序,系统转入 STOP 状态。

警告

没有 0F 行的话,程序会一直跑过最后一行直到程序存储器末尾。每个程序末尾都要放一条 0F。

000  01  0101  0010
001 02 0064 0000
002 0F 0000 0000
信息
操作数数值/范围备注
P00~P110000 / 0000无关,忽略

0x41 接通(JT)​

把指定引脚置为 1(HIGH)。引脚按 port<<4 | pin 寻址(见端口体系表)。

000  41  0000  0013
001 02 03E8 0000
002 42 0000 0013
003 02 03E8 0000
004 0E 0000 0000
005 41 0014 0000 1号口4脚(LED4)输出高电平→LED4 亮
006 41 0021 0000 2号口1脚(PWM1)输出高电平

用 JT/DK 对让 Port1 Pin3 以 1 Hz 闪烁。

信息
操作数数值/范围备注
P00P010000无关
P10P110000~006F16 位整体:引脚地址 port<<4 | pin;指定引脚输出 1

0x42 断开(DK)​

把指定引脚置为 0(LOW)。引脚寻址与 0x41 JT 相同。

000  41  0000  0011
001 02 01F4 0000
002 42 0000 0011
003 02 01F4 0000
004 41 0000 0012
005 02 01F4 0000
006 42 0000 0012
007 02 01F4 0000
008 0E 0000 0000
009 42 0014 0000 1号口4脚(LED4)输出低电平→LED4 灭
00A 42 0021 0000 2号口1脚(PWM1)输出低电平

Port1 Pin1 / Pin2 上的交替闪光灯。

信息
操作数数值/范围备注
P00P010000无关
P10P110000~006F16 位整体:引脚地址 port<<4 | pin;指定引脚输出 0

0x43 等待屏幕输入(SR)​

等待用户在主屏幕上输入一个数字。执行机制是挂起—回传过程:

  1. 执行到这一行时,程序计数器冻结在本行,主屏幕弹出输入框。
  2. 用户输入数字并确认。
  3. 回传值写入目标寄存器,程序从下一行继续。
信息
操作数数值/范围备注
P00P010000~00FF16 位整体:目标寄存器(写法 00 + 寄存器号)
P10P110000~000316 位整体:进制码

进制码:00 = HEX,01 = DEC,02 = OCT,03 = BIN;非法值一律按 DEC 处理。

000  10  0000  0001
001 43 0001 0001
002 01 0101 0010
003 0F 0000 0000
004 43 0005 0001 屏幕弹出输入框(十进制),用户输入的数写入 R05 后程序继续
005 43 0006 0000 同上但按十六进制输入,结果写入 R06

第 001 行挂起程序,直到在屏幕上输入一个十进制数;数字存入 R01,随后 LED 点亮。

0x44 数码管扫描(SSE)​

驱动板载 4 位数码管的其中一位。一条指令在单行内完成固定的三步序列:

  1. 灭位:Port2 = 0x0F——四个位选全部无效,所有数字熄灭(消除鬼影)。
  2. 送段码:段码寄存器的低 8 位写到 Port1 段线上。
  3. 选位:Port2 = P11(低 4 位)——选通目标位。

硬件约定:Port1 的 8 个引脚对应段 bit7 = a … bit0 = dp;Port2 的低 4 位经 1 kΩ 电阻接共阳位选 PNP 基极(低电平有效)。位选值:千位 = 0x0E,百位 = 0x0D,十位 = 0x0B,个位 = 0x07。

提示

共阳硬件的段码必须取反(段线为 LOW 时点亮)——用 0x30 BMQD 并取 P10 = 1 来生成。每条 SSE 后面配一条 0x02 YS 1 ms:一位数码管花费 SSE + YS = 2 行,一帧 4 位约 8 ms(≈125 Hz 刷新率)。

信息
操作数数值/范围备注
P00P010000~00FF16 位整体:段码寄存器号(其低 8 位输出到 Port1)
P10P110000~000F16 位整体:位选值(低 4 位 → Port2)
000  10  003C  0001
001 30 0002 0010
002 11 0003 0002
003 15 0003 0008
004 10 00FF 0004
005 44 0004 000E
006 02 0001 0000
007 44 0004 000D
008 02 0001 0000
009 44 0003 000B
00A 02 0001 0000
00B 44 0002 0007
00C 02 0001 0000
00D 0E 0000 0005
00A 44 0002 000E R02 的段码送到千位(位选 0E,低电平选通)
00B 44 0002 000D R02 的段码送到百位(位选 0D)
00C 44 0002 000B R02 的段码送到十位(位选 0B)
00D 44 0002 0007 R02 的段码送到个位(位选 07);每位后配 02 0001 0000(1ms)轮扫4位

把数字 60(R01)显示在最右边的两位上:

  • 第 000 行把 60 放入 R01;第 001 行用 BMQD 转换(十进制拆位,P10 = 1 按共阳取反)——R02 = 十位段码(高 8 位)+ 个位段码(低 8 位)。
  • 第 002 行把 R02 复制到 R03,第 003 行把 R03 右移 8 位(0x15 XHYW),让 R03 单独携带十位段码。
  • 第 004 行把 R04 填充为 0xFF——所有段线为 HIGH 表示全灭,即一位空白数字。
  • 第 005~00C 行以每位 2 ms 的节奏扫描四位(千位/百位空白,十位、个位显示);第 00D 行永远循环扫描。