基础控制与跳转
本分册收录基础执行控制类指令 0x00~0x0F,以及专用的引脚输出 / 屏幕输入指令 0x41~0x44:顺序执行、延时与定时、条件跳转、子程序调用、数字输出、等待屏幕输入与数码管扫描。
程序行写作 行号 指令 OP-0 OP-1;操作数解释方式、单位码表与端口体系表统一定义在简述中。
0x00 空操作(SKIP)
什么也不做——程序计数器直接前进到下一行。
0x00 可以当作"占位行"使用:预留一个空行,方便日后修改程序。
- 助记符形式
- 指令形式
000 SKIP 0000 0000
001 JS 0000 0000
000 00 0000 0000
001 0F 0000 0000
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00~P11 | 0000 / 0000 | 无关,忽略 |
0x01 数字输出写
向一个数字输出引脚写电平。这条指令有两种模式:
Port 模式(P00 = 01,推荐)——向任意可输出端口的某一个引脚写一个电平,引脚按 port<<4 | pin 寻址(见端口体系表)。
旧模式(P00 ≠ 01)——为兼容早期 v1 程序而保留:P10P11 中的写入值(取其低 8 位)直接写入 8 位数字输出寄存器 R26(Port1 LED 网络)。P01 选择目标:FF 一次写全部 8 位,00~07 只写对应的那一位。
- 助记符形式
- 指令形式
000 01 0101 0010
001 02 03E8 0000
002 01 00FF 000F
003 0F 0000 0000
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 都以指令形式显示。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00 | 01 | Port 模式 |
| P01 | 任意非 0 | 电平 = 1(HIGH) |
00 | 电平 = 0(LOW) | |
| P10 | 00~06 | 端口号 |
| P11 | 0~F | 端口内引脚号 |
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00 | 00 | 旧模式 |
| P01 | FF | 把整个 8 位值写入 R26(Port1) |
00~07 | 只把值的 bit 0~7 中对应一位写入 R26 | |
| P10P11 | 0000~FFFF | 16 位整体:写入值(低 8 位有效) |
0x02 延时(YS)
让程序计数器停留指定的时间,然后执行下一行。
延时值可以是立即数,也可以是寄存器中存放的值。
- 助记符形式
- 指令形式
000 YS 03E8 0000
001 YS 0005 0003
002 YS 0001 FF00
003 JS 0000 0000
004 YS 000A 0001 立即数延时:P00P01=000A(10)×单位01(10ms)=延时100ms
005 YS 0005 FF03 寄存器延时:P10=FF,P01=05→R05 的值×单位03(1秒);R05=30 则延时30秒
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(寄存器寻址)。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000~FFFF | 16 位整体:延时值 |
| P10 | 00 | 立即数 |
| P11 | 00~04、10 | 单位码 |
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00 | — | 寄存器寻址时不读取(忽略) |
| P01 | 00~FF | 存放延时值的寄存器号 |
| P10 | FF | 寄存器寻址标志 |
| P11 | 00~04、10 | 单位码 |
0x03 定时(DS)
启动一个倒计时定时器。定时长短由立即数或寄存器值加单位码决定,与 0x02 YS 完全相同。
设置定时器不会让程序停下来——定时器倒计时的同时,后面的行继续执行。计到零时,超时标志寄存器 R23 被置位;程序需要自行清零 R23(例如用 0x10 FZ)。
- 助记符形式
- 指令形式
000 FZ 0023 0000
001 DS 0005 0003
002 01 0101 0010
003 TJZ 0823 0006
004 YS 0064 0000
005 ZY 0000 0003
006 01 0100 0010
007 JS 0000 0000
008 DS 003C 0004 立即数定时:P00P01=003C(60)×单位04(10秒)=600秒后 R23 被置1,程序不等待继续运行
009 DS 0008 FF00 寄存器定时:P10=FF,P01=08→R08 的值×单位00(1ms);之后可查询 R23 判断时间到
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,定时到时把引脚关掉。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000~FFFF | 16 位整体:定时值(仅立即数寻址有效) |
| P10 | 00 | 立即数寻址(用 P00P01) |
FF | 寄存器寻址(改用 P01 = 存放定时值的寄存器号,P00 忽略) | |
| P11 | 00~04、10 | 单位码 |
0x04 大于转(DYZ)
如果寄存器 x 的值大于寄存器 y 的值,跳到目标行;否则继续执行下一行。
六条条件跳转 0x04~0x09 共用同一操作数格式:
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00 | 00~FF | 寄存器 x(比较左侧) |
| P01 | 00~FF | 寄存器 y(比较右侧) |
| P10P11 | 0000~01FF | 16 位整体:目标行 |
- 助记符形式
- 指令形式
000 FZ 000A 0001
001 FZ 0005 0002
002 DYZ 0102 0005
003 01 0100 0010
004 ZY 0000 0006
005 01 0101 0010
006 JS 0000 0000
007 DYZ 0102 000A R01>R02 时跳转到 00A 行,否则顺序执行
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 FZ 0003 0001
001 FZ 0001 0002
002 XYZ 0102 0005
003 02 0064 0000
004 ZY 0000 0006
005 01 0101 0010
006 JS 0000 0000
007 XYZ 0102 000A R01<R02 时跳转到 00A 行,否则顺序执行
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 QS 0001 0000
001 FZ 0002 0001
002 DZ 0102 0005
003 YS 000A 0000
004 ZY 0000 0000
005 01 0101 0010
006 JS 0000 0000
007 DZ 0102 000A R01==R02 时跳转到 00A 行,否则顺序执行
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 FZ 0064 0001
001 FZ 003C 0002
002 DDZ 0102 0005
003 01 0100 0010
004 ZY 0000 0006
005 01 0101 0010
006 JS 0000 0000
007 DDZ 0102 000A R01≥R02 时跳转到 00A 行,否则顺序执行
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 FZ 0014 0001
001 FZ 0018 0002
002 XDZ 0102 0005
003 01 0100 0010
004 ZY 0000 0006
005 01 0101 0010
006 JS 0000 0000
007 XDZ 0102 000A R01≤R02 时跳转到 00A 行,否则顺序执行
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 QS 0001 0000
001 FZ 0001 0002
002 BDZ 0102 0005
003 01 0100 0010
004 ZY 0000 0006
005 01 0101 0010
006 JS 0000 0000
007 BDZ 0102 000A R01≠R02 时跳转到 00A 行,否则顺序执行
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] 进行比较;条件成立则跳到目标行,否则继续。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00 | 01 | 条件:= |
02 | 条件:≠ | |
03 | 条件:> | |
04 | 条件:< | |
05 | 条件:≥ | |
06 | 条件:≤ | |
07 | 条件:为 0(只看 R[n]) | |
08 | 条件:非 0(只看 R[n]) | |
| P01 | 00~FF | 寄存器 n(比较右侧) |
| P10P11 | 0000~01FF | 16 位整体:目标行 |
R00 是比较专用寄存器(见内部寄存器):要先把左边的值放进 R00。条件码为 07/08 时不执行与 R00 的比较——只看 R[n] 本身是否为零。
- 助记符形式
- 指令形式
000 FZ 0032 0000
001 FZ 0032 0001
002 TJZ 0101 0005
003 01 0100 0010
004 ZY 0000 0006
005 01 0101 0010
006 JS 0000 0000
007 TJZ 0103 000A 条件码01(等于):R0==R03 时跳到 00A 行(R0 先用 FZ 赋值)
008 TJZ 0203 000A 条件码02(不等于):R0≠R03 时跳到 00A 行
009 TJZ 0705 000A 条件码07(为0):R05==0 时跳到 00A 行(只看 R05,不用 R0)
00A TJZ 0805 000A 条件码08(非0):R05≠0 时跳到 00A 行
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 | 整端口模式 |
| P01 | 00~06 | 端口号;端口内任意引脚读到 1 即跳转 |
| P10P11 | 0000~01FF | 16 位整体:目标行 |
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00 | 01 | 单引脚模式 |
| P01 | 00~6F | 引脚地址 port<<4 | pin |
| P10P11 | 0000~01FF | 16 位整体:目标行 |
- 助记符形式
- 指令形式
000 TZ 0000 0003
001 YS 000A 0000
002 ZY 0000 0000
003 01 0101 0010
004 JS 0000 0000
005 TZ 0001 000A 整端口模式:P00=00 P01=01→Port1(8路IO)任一位读到1就跳到 00A 行
006 TZ 0114 0010 单引脚模式:P00=01 P01=14→1号口4脚读到1就跳到 010 行
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 DY 0000 0004
002 01 0100 0010
003 JS 0000 0000
004 YS 0064 0001
005 FH 0000 0000
006 DY 0000 0100 调用以 100 行开头的子程序;子程序结尾必须是 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 熄灭。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000 | 无关 |
| P10P11 | 0000~01FF | 16 位整体:子程序首行 |
0x0D 返回(FH)
离开当前子程序,回到调用它的 0x0C DY 的下一行继续执行。
必须与 0x0C 配对使用。每条调用路径都需要自己的 FH,否则堆栈会失步。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00~P11 | 0000 / 0000 | 无关,忽略 |
示例见 0x0C。
0x0E 转移(ZY)
无条件跳到目标行。
- 助记符形式
- 指令形式
000 01 0101 0010
001 YS 00C8 0001
002 01 0100 0010
003 YS 00C8 0001
004 ZY 0000 0000
005 ZY 0000 0020 无条件跳转到 020 行
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 行。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000 | 无关 |
| P10P11 | 0000~01FF | 16 位整体:目标行 |
0x0F 结束(JS)
终止程序,系统转入 STOP 状态。
没有 0F 行的话,程序会一直跑过最后一行直到程序存储器末尾。每个程序末尾都要放一条 0F。
- 助记符形式
- 指令形式
000 01 0101 0010
001 YS 0064 0000
002 JS 0000 0000
000 01 0101 0010
001 02 0064 0000
002 0F 0000 0000
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00~P11 | 0000 / 0000 | 无关,忽略 |
0x41 接通(JT)
把指定引脚置为 1(HIGH)。引脚按 port<<4 | pin 寻址(见端口体系表)。
- 助记符形式
- 指令形式
000 JT 0000 0013
001 YS 03E8 0000
002 DK 0000 0013
003 YS 03E8 0000
004 ZY 0000 0000
005 JT 0014 0000 1号口4脚(LED4)输出高电平→LED4 亮
006 JT 0021 0000 2号口1脚(PWM1)输出高电平
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 闪烁。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000 | 无关 |
| P10P11 | 0000~006F | 16 位整体:引脚地址 port<<4 | pin;指定引脚输出 1 |
0x42 断开(DK)
把指定引脚置为 0(LOW)。引脚寻址与 0x41 JT 相同。
- 助记符形式
- 指令形式
000 JT 0000 0011
001 YS 01F4 0000
002 DK 0000 0011
003 YS 01F4 0000
004 JT 0000 0012
005 YS 01F4 0000
006 DK 0000 0012
007 YS 01F4 0000
008 ZY 0000 0000
009 DK 0014 0000 1号口4脚(LED4)输出低电平→LED4 灭
00A DK 0021 0000 2号口1脚(PWM1)输出低电平
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 上的交替闪光灯。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000 | 无关 |
| P10P11 | 0000~006F | 16 位整体:引脚地址 port<<4 | pin;指定引脚输出 0 |
0x43 等待屏幕输入(SR)
等待用户在主屏幕上输入一个数字。执行机制是挂起—回传过程:
- 执行到这一行时,程序计数器冻结在本行,主屏幕弹出输入框。
- 用户输入数字并确认。
- 回传值写入目标寄存器,程序从下一行继续。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000~00FF | 16 位整体:目标寄存器(写法 00 + 寄存器号) |
| P10P11 | 0000~0003 | 16 位整体:进制码 |
进制码:00 = HEX,01 = DEC,02 = OCT,03 = BIN;非法值一律按 DEC 处理。
- 助记符形式
- 指令形式
000 FZ 0000 0001
001 SR 0001 0001
002 01 0101 0010
003 JS 0000 0000
004 SR 0005 0001 屏幕弹出输入框(十进制),用户输入的数写入 R05 后程序继续
005 SR 0006 0000 同上但按十六进制输入,结果写入 R06
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 位数码管的其中一位。一条指令在单行内完成固定的三步序列:
- 灭位:Port2 =
0x0F——四个位选全部无效,所有数字熄灭(消除鬼影)。 - 送段码:段码寄存器的低 8 位写到 Port1 段线上。
- 选位:Port2 = P11(低 4 位)——选通目标位。
硬件约定:Port1 的 8 个引脚对应段 bit7 = a … bit0 = dp;Port2 的低 4 位经 1 kΩ 电阻接共阳位选 PNP 基极(低电平有效)。位选值:千位 = 0x0E,百位 = 0x0D,十位 = 0x0B,个位 = 0x07。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| P00P01 | 0000~00FF | 16 位整体:段码寄存器号(其低 8 位输出到 Port1) |
| P10P11 | 0000~000F | 16 位整体:位选值(低 4 位 → Port2) |
- 助记符形式
- 指令形式
000 FZ 003C 0001
001 BMQD 0002 0010
002 RFZ 0003 0002
003 XHYW 0003 0008
004 FZ 00FF 0004
005 SSE 0004 000E
006 YS 0001 0000
007 SSE 0004 000D
008 YS 0001 0000
009 SSE 0003 000B
00A YS 0001 0000
00B SSE 0002 0007
00C YS 0001 0000
00D ZY 0000 0005
00A SSE 0002 000E R02 的段码送到千位(位选 0E,低电平选通)
00B SSE 0002 000D R02 的段码送到百位(位选 0D)
00C SSE 0002 000B R02 的段码送到十位(位选 0B)
00D SSE 0002 0007 R02 的段码送到个位(位选 07);每位后配 02 0001 0000(1ms)轮扫4位
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 位(0x15XHYW),让 R03 单独携带十位段码。 - 第
004行把 R04 填充为0xFF——所有段线为 HIGH 表示全灭,即一位空白数字。 - 第
005~00C行以每位 2 ms 的节奏扫描四位(千位/百位空白,十位、个位显示);第00D行永远循环扫描。