指令集说明 注 由于资源大小问题 其中以下几款 MCU 只有 62 条指令 其余均为 63 条指令 HT48CA0/HT48RA0A 无 RETI 指令 HT48R05A-1 无 TABRDL 指令 指令寻址方式有下面 5 种 立即寻址 此一寻址法是将立即的常数值紧跟在运算码 (opcode) 后 例如 MOV A, 33H ADD A, 33H 直接寻址 直接寻址的情況只允许在存储器之间作数据传送 例如 MOV [33H], A CLR [33H] 间接寻址 在间接寻址方式中 必定要使用到间接寻址暂存器 (R0 R1) 例如 MOV R0, A MOV A, R0 特殊暂存器寻址 此一寻址方式完全是针对某一暂存器作运算 例如 CLR WDT CLR WDT1 指针寻址 指针寻址只适用在配合做查表指令 例如 MOV A, 02H MOV TBLP, A
指令集摘要 HOLTEK 指令集说明 指令助记符说明周期算术运算 ADD A, [m] 累加器与数据存储器相加结果放入累加器 1 Z,C,AC,OV ADDM A, [m] 累加器与数据存储器相加结果放入数据存储器 1 1 Z,C,AC,OV ADD A, x 累加器与立即数相加结果放入累加器 1 Z,C,AC,OV ADC A, [m] 累加器与数据存储器进位标志相加结果放入累加器 1 Z,C,AC,OV ADCM A, [m] 累加器与数据存储器进位标志相加结果放入数据存储器 1 1 Z,C,AC,OV SUB A, x 累加器与立即数相减结果放入累加器 1 Z,C,AC,OV SUB A, [m] 累加器与数据存储器相减结果放入累加器 1 Z,C,AC,OV SUBM A, [m] 累加器与数据存储器相减结果放入数据存储器 1 1 Z,C,AC,OV SBC A, [m] 累加器与数据存储器进位标志相减结果放入累加器 1 Z,C,AC,OV SBCM A, [m] 累加器与数据存储器进位标志相减结果放入数据存储器 1 1 Z,C,AC,OV 将加法运算后放入累加器的值调整为十进制数并将结果放 DAA [m] 1 1 C 入数据存储器逻辑运算 AND A, [m] 累加器与数据存储器做与运算结果放入累加器 1 Z OR A, [m] 累加器与数据存储器做或运算结果放入累加器 1 Z XOR A, [m] 累加器与数据存储器做异或运算结果放入累加器 1 Z ANDM A, [m] 累加器与数据存储器做与运算结果放入数据存储器 1 1 Z ORM A, [m] 累加器与数据存储器做或运算结果放入数据存储器 1 1 Z XORM A, [m] 累加器与数据存储器做异或运算结果放入数据存储器 1 1 Z AND A, x 累加器与立即数做与运算结果放入累加器 1 Z OR A, x 累加器与立即数做或运算结果放入累加器 1 Z XOR A, x 累加器与立即数做异或运算结果放入累加器 1 Z CPL [m] 对数据存储器取反结果放入数据存储器 1 1 Z CPLA [m] 对数据存储器取反结果放入累加器 1 Z 递增和递减 INCA [m] 数据存储器的内容加 1 结果放入累加器 1 Z INC [m] 数据存储器的内容加 1 结果放入数据存储器 1 1 Z DECA [m] 数据存储器的内容减 1 结果放入累加器 1 Z DEC [m] 数据存储器的内容减 1 结果放入数据存储器 1 1 Z 移位 RRA [m] 数据存储器右移一位结果放入累加器 1 无 RR [m] 数据存储器右移一位结果放入数据存储器 1 1 无 RRCA [m] 带进位将数据存储器右移一位结果放入累加器 1 C RRC [m] 带进位将数据存储器右移一位结果放入数据存储器 1 1 C RLA [m] 数据存储器左移一位结果放入累加器 1 无 RL [m] 数据存储器左移一位结果放入数据存储器 1 1 无 RLCA [m] 带进位将数据存储器左移一位结果放入累加器 1 C RLC [m] 带进位将数据存储器左移一位结果放入数据存储器 1 1 C 数据传送 MOV A, [m] 将数据存储器送至累加器 1 无 MOV [m], A 将累加器送至数据存储器 1 1 无 MOV A, x 将立即数送至累加器 1 无位运算 CLR [m]. i 将数据存储器的第 i 位清 0 1 1 无 SET [m]. i 将数据存储器的第 i 位置 1 1 1 无 2
助记符 说明 指令周期 转移 JMP addr 无条件跳转 2 无 SZ [m] 如果数据存储器为 0 则跳过下一条指令 1 2 无 数据存储器送至累加器如果内容为 0 则跳过下一条指 SZA [m] 1 2 无令 SZ [m]. i 如果数据存储器的第 i 位为 0 则跳过下一条指令 1 2 无 SNZ [m]. i 如果数据存储器的第 i 位不为 0 则跳过下一条指令 1 2 无 SIZ [m] 数据存储器加 1 如果结果为 0 则跳过下一条指令 1 3 无 SDZ [m] 数据存储器减 1 如果结果为 0 则跳过下一条指令 1 3 无 数据存储器加 1 将结果放入累加器如果结果为 0 则跳 SIZA [m] 过下一条指令 1 2 无 数据存储器减 1 将结果放入累加器如果结果为 0 则跳 SDZA [m] 1 2 无过下一条指令 CALL addr 子程序调用 2 无 RET 从子程序返回 2 无 RET A, x 从子程序返回并将立即数放入累加器 2 无 RETI 从中断返回 2 无 查表 TABRDC [m] 读取当前页的 ROM 内容并送至数据存储器和 TBLH 2 1 无 TABRDL [m] 读取最后页的 ROM 内容并送至数据存储器和 TBLH 2 1 无 其它指令 NOP 空指令 1 无 CLR [m] 清除数据存储器 1 1 无 SET [m] 置位数据存储器 1 1 无 CLR WDT 清除看门狗定时器 1 TO,PD CLR WDT1 预清除看门狗定时器 1 TO 4,PD 4 CLR WDT2 预清除看门狗定时器 1 TO 4,PD 4 SWAP [m] 交换数据存储器的高低字节结果放入数据存储器 1 1 无 SWAPA [m] 交换数据存储器的高低字节结果放入累加器 1 无 HALT 进入暂停模式 1 TO,PD 注 x 立即数 m 数据存储器地址 A 累加器 ACC i 第 0~7 位 addr 程序存储器地址 不 1 如果数据是加载到 PCL 寄存器则指令执行周期会被延长一个指令周期四个系统时钟 2 如果满足跳跃条件则指令执行周期会被延长一个指令周期四个系统时钟否则指令执行周期不会被延长 3 1 2 和 4 如果执行 CLW WDT1 或 CLR WDT2 指令后看门狗定时器被清除则会影响 TO 和 PD 标志位否则不会影响 TO 和 PD 标志位 3
ADC A, [m] 累加器与数据存储器进位标志相加结果放入累加器说明本指令把累加器数据存储器值以及进位标志相加结果存放到累加器运算过程 ACC ACC+[m]+C HOLTEK 指令集说明 ADCM A, [m] 累加器与数据存储器进位标志相加结果放入数据存储器说明本指令把累加器数据存储器值以及进位标志相加结果存放到存储器运算过程 [m] ACC+[m]+C ADD A, [m] 累加器与数据存储器相加结果放入累加器说明本指令把累加器数据存储器值相加结果存放到累加器运算过程 ACC ACC+[m] ADD A, x 累加器与立即数相加结果放入累加器说明本指令把累加器值和立即数相加结果存放到累加器运算过程 ACC ACC+X ADDM A, [m] 累加器与数据存储器相加结果放入数据存储器说明本指令把累加器数据存储器值相加结果放到数据存储器运算过程 [m] ACC+[m] AND A, [m] 累加器与数据存储器做与运算结果放入累加器说明本指令把累加器值数据存储器值做逻辑与结果存放到累加器运算过程 ACC ACC AND [m] 4
AND A, x 累加器与立即数做与运算结果放入累加器说明本指令把累加器值立即数做逻辑与结果存放到累加器运算过程 ACC ACC AND X HOLTEK 指令集说明 ANDM A, [m] 累加器与数据存储器做与运算结果放入数据存储器说明本指令把累加器值数据存储器值做逻辑与结果放到数据存储器运算过程 ACC ACC AND [m] CALL addr 子程序调用 说明 本指令直接调用地址所在处的子程序 此时程序计数器加一 将此程序计数器值存到堆 栈寄存器中 再将子程序所在处的地址存放到程序计数器中 运算过程 Stack PC+1 PC addr CLR [m] 清除数据存储器说明本指令将数据存储器内的数值清零运算过程 [m] 00H CLR [m]. i 将数据存储器的第 i 位清 0 说明本指令将数据存储器内第 i 位值清零运算过程 [m].i 0 CLR WDT 清除看门狗定时器 说明 本指令清除 WDT 计数器 从 0 开始重新计数 暂停标志位 PD 和看门狗溢出标志 位 TO 也被清零 运算过程 WDT 00H PD&TO 0 0 0 5
CLR WDT1 预清除看门狗定时器 说明 必须搭配 CLR WDT2 一起使用 才可清除 WDT 计时器 从 0 开始重新计数 当程序 只执行过该指令 没有执行 CLR WDT2 时 系统只会不会将暂停标志位 PD 和计数 溢出位 TO 清零 PD 与 TO 保留原状态不变 运算过程 WDT 00H* PD&TO 0* 0* 0* CLR WDT2 预清除看门狗定时器 说明 必须搭配 CLR WDT1 一起使用 才可清除 WDT 计时器 从 0 开始重新计数 当程序 只执行过该指令 没有执行 CLR WDT1 时 系统只会不会将暂停标志位 PD 和计数 溢出位 TO 清零 PD 与 TO 保留原状态不变 运算过程 WDT 00H* PD&TO 0* 0* 0* CPL [m] 对数据存储器取反结果放入数据存储器说明本指令是将数据存储器内保存的数值取反运算过程 [m] [ m ] CPLA [m] 对数据存储器取反结果放入累加器说明本指令是将数据存储器内保存的值取反后结果存放在累加器中运算过程 ACC [ m ] 6
DAA [m] 将加法运算后放入累加器的值调整为十进制数 并将结果放入数据存储器 说明 本指令将累加器高低四位分别调整为 BCD 码 如果低四位的值大于 9 或 AC=1 那 么 BCD 调整就执行对原值加 6 并且内部进位标志 AC1= AC 即 AC 求反 否则原 值保持不变 如果高四位的值大于 9 或 C=1 那么 BCD 调整就执行对原值加 6 再加 AC1 并把 C 置位 否则 BCD 调整就执行对原值加 AC1 C 的值保持不变 结果 存放到数据存储器中 只有进位标志位 C 受影响 操作 如果 ACC.3~ACC.0 > 9 或 AC=1 那么 [m].3~[m].0 ACC.3~ACC.0 +6 AC1= AC 否则 [m].3~[m].0 ACC.3~ACC.0 AC1=0 并且 如果 ACC.7~ACC.4+AC1 > 9 或 C=1 那么 [m].7~[m].4 ACC.7~ACC.4 +6+ AC1 C=1 否则 [m].7~[m].4 ACC.7~ACC.4 + AC1 C=C DEC [m] 数据存储器的内容减 1 结果放入数据存储器说明本指令将数据存储器内的数值减一再放回数据存储器运算过程 [m] [m]-1 DECA [m] 数据存储器的内容减 1 结果放入累加器说明本指令将存储器内的数值减一, 再放到累加器运算过程 ACC [m]-1 HALT 进入暂停模式 说明 本指令终止程序执行并关掉系统时钟 RAM 和寄存器内的数值保持原状态 WDT 计数 器清 0 暂停标志位 PD 被设为 1 WDT 计数溢出位 TO 被清为 0 运算过程 PC PC+1 PD 1 TO 0 0 1 7
INC [m] 数据存储器的内容加 1 结果放入数据存储器说明本指令将数据存储器内的数值加一, 结果放回数据存储器运算过程 [m] [m]+1 HOLTEK 指令集说明 INCA [m] 数据存储器的内容加 1 结果放入数据存储器说明本指令是将存储器内的数值加一, 结果放到累加器运算过程 ACC [m]+1 JMP addr 无条件跳转说明本指令是将要跳到的目的地直接放到程序计数器内运算过程 PC addr MOV A, [m] 将数据存储器送至累加器说明本指令是将数据存储器内的数值送到累加器内运算过程 ACC [m] MOV A, x 将立即数送至累加器说明本指令是将立即数送到累加器内运算过程 ACC X MOV [m], A 将累加器送至数据存储器 说明 本指令是将累加器值送到数据存储器内 运算过程 [m] ACC 8
NOP 空指令 说明 本指令不作任何运算 而只将程序计数器加一 运算过程 PC PC+1 HOLTEK 指令集说明 OR A, [m] 累加器与数据存储器做或运算结果放入累加器说明本指令是把累加器数据存储器值做逻辑或结果放到累加器运算过程 ACC ACC OR [m] OR A, x 累加器与立即数做或运算结果放入累加器说明本指令是把累加器值立即数做逻辑或结果放到累加器运算过程 ACC ACC OR X ORM A, [m] 累加器与数据存储器做或运算结果放入数据存储器说明本指令是把累加器值存储器值做逻辑或结果放到数据存储器运算过程 ACC ACC OR [m] RET 从子程序返回 说明 本指令是将堆栈寄存器中的程序计数器值送回程序计数器 运算过程 PC Stack RET A, x 从子程序返回 并将立即数放入累加器 说明 本指令是将堆栈寄存器中的程序计数器值送回程序计数器 并将立即数送回累加器 运算过程 PC Stack ACC X 9
RETI 从中断返回 说明 本指令是将堆栈寄存器中的程序计数器值送回程序计数器 与 RET 不同的是它使用在 中断程序结束返回时 它还会将中断控制寄存器 INTC 的 0 位 EMI 中断允许位置 1 允许中断服务 运算过程 PC Stack EMI 1 RL [m] 数据存储器左移一位结果放入数据存储器说明本指令是将数据存储器内的数值左移一位第 7 位移到第 0 位结果送回数据存储器运算过程 [m].0 [m].7, [m]. i+1 [m].i :i=0~6 RLA [m] 数据存储器左移一位 结果放入累加器 说明 本指令是将存储器内的数值左移一位 第 7 位移到第 0 位 结果送到累加器 而数据存 储器内的数值不变 运算过程 ACC.0 [m].7, ACC. i+1 [m].i :i=0~6 RLC [m] 带进位将数据存储器左移一位结果放入数据存储器说明本指令是将存储器内的数值与进位位左移一位第 7 位取代进位标志进位标志移到第 0 位结果送回数据存储器运算过程 [m]. i+1 [m].i :i=0~6 [m].0 C C [m].7 RLCA [m] 带进位将数据存储器左移一位结果放入累加器说明本指令是将存储器内的数值与进位位左移一位第七位取代进位标志进位标志移到第 0 位结果送回累加器运算过程 ACC. i+1 [m].i :i=0~6 ACC.0 C C [m].7 10
RR [m] 数据存储器右移一位结果放入数据存储器说明本指令是将存储器内的数值循环右移第 0 位移到第 7 位结果送回数据存储器运算过程 [m].7 [m].0, [m].i [m]. i+1 : i=0~6 RRA [m] 数据存储器右移一位 结果放入累加器 说明 本指令是将数据存储器内的数值循环右移 第 0 位移到第 7 位 结果送回累加器 而数 据存储器内的数值不变 运算过程 ACC.7 [m].0, ACC.i [m]. i+1 :i=0~6 RRC [m] 带进位将数据存储器右移一位 结果放入数据存储器 说明 本指令是将存储器内的数值加进位位循环右移 第 0 位取代进位标志 进位标志移到第 7 位 结果送回存储器 运算过程 [m].i [m]. i+1 :i=0~6 [m]. 7 C C [m].0 RRCA [m] 带进位将数据存储器右移一位 结果放入累加器 说明 本指令是将数据存储器内的数值加进位位循环右移 第 0 位取代进位标志 进位标志移 到第 7 位 结果送回累加器 数据存储器内的数值不变 运算过程 ACC.i [m]. i+1 i=0~6 ACC.7 C C [m].0 SBC A,[m] 累加器与数据存储器进位标志相减结果放入累加器说明本指令是把累加器值减去数据存储器值以及进位标志的取反结果放到累加器运算过程 ACC ACC+[ m ]+ C 11
SBCM A,[m] 累加器与数据存储器进位标志相减结果放入数据存储器说明本指令是把累加器值减去数据存储器值以及进位标志取反结果放到数据存储器运算过程 [m] ACC+[ m ]+C SDZ [m] 数据存储器减 1 如果结果为 0 则跳过下一条指令说明本指令是把数据存储器内的数值减 1 判断是否为 0 若为 0 则跳过下一条指令即如果结果为零放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果 [m]-1=0 跳过下一条指令执行再下一条 SDZA [m] 数据存储器减 1 将结果放入累加器如果结果为 0 则跳过下一条指令说明本指令是把数据存储器内的数值减 1 判断是否为 0, 为 0 则跳过下一行指令并将减完后数据存储器内的数值送到累加器, 而数据存储器内的值不变即若结果为 0 放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果 [m]-1=0 跳过下一条指令执行再下一条 ACC [m]-1 SET [m] 置位数据存储器说明本指令是把存储器内的数值每个位置为 1 运算过程 [m] FFH SET [m]. i 将数据存储器的第 i 位置 1 说明本指令是把存储器内的数值的第 i 位置为 1 运算过程 [m].i 1 12
SIZ [m] 数据存储器加 1 如果结果为 0 则跳过下一条指令说明本指令是把数据存储器内的数值加 1 判断是否为 0 若为 0 跳过下一条指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果 [m]+1=0 跳过下一行指令 [m] [m]+1 SIZA 数据存储器加 1 将结果放入累加器如果结果为 0 则跳过下一条指令说明本指令是把数据存储器内的数值加 1 判断是否为 0, 若为 0 跳过下一条指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期并将加完后存储器内的数值送到累加器而数据存储器的值保持不变否则执行下一条指令一个指令周期运算过程如果 [m]+1=0 跳过下一行指令 ACC [m]+1 SNZ [m]. i 如果数据存储器的第 i 位不为 0 则跳过下一条指令说明本指令是判断数据存储器内的数值的第 i 位, 若不为 0 则程序计数器再加 1, 跳过下一行指令放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果 [m].i 0 跳过下一行指令 SUB A, [m] 累加器与数据存储器相减结果放入累加器说明本指令是把累加器值数据存储器值相减结果放到累加器运算过程 ACC ACC+[ m ]+1 SUB A, x 累加器与立即数相减结果放入累加器说明本指令是把累加器值立即数相减结果放到累加器运算过程 ACC ACC+ X +1 13
SUBM A, [m] 累加器与数据存储器相减结果放入数据存储器说明本指令是把累加器值存储器值相减结果放到存储器运算过程 [m] ACC+[ m ]+1 HOLTEK 指令集说明 SWAP [m] 交换数据存储器的高低字节结果放入数据存储器说明本指令是将数据存储器的低四位和高四位互换, 再将结果送回数据存储器运算过程 [m].7~[m].4<-v1 [m].3~[m].0 SWAPA [m] 交换数据存储器的高低字节 结果放入累加器 说明 本指令是将数据存储器的低四位和高四位互换 再将结果送回累加器 运算过程 ACC.3~ACC.0 [m].7~[m].4 ACC.7~ACC.4 [m].3~[m].0 SZ [m] 如果数据存储器为 0 则跳过下一条指令说明本指令是判断数据存储器内的数值是否为 0 为 0 则跳过下一行指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果 [m] = 0, 跳过下一行指令 SZA [m] 数据存储器送至累加器 如果内容为 0 则跳过下一条指令 说明 本指令是判断存储器内的数值是否为 0 若为 0 则跳过下一行指令 即放弃在目前指令 执行期间所取得的下一条指令 并插入一个空周期用以得正确的指令 二个指令周期 并把存储器内值送到累加器 而存储器的值保持不变 否则执行下一条指令 一个指令 周期 运算过程 如果 [m] = 0 跳过下一行指令 并 ACC [m] 14
SZ [m]. i 如果数据存储器的第 i 位为 0 则跳过下一条指令说明本指令是判断存储器内第 i 位值是否为 0 若为 0 则跳过下一行指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果 [m].i = 0 跳过下一行指令 TABRDC [m] 读取 ROM 当前页的内容 并送至数据存储器和 TBLH 说明 本指令是将表格指针指向程序寄存器当前页 将低位送到存储器 高位直接送到 TBLH 寄存器内 运算过程 [m] 程序存储器低四位 TBLH 程序存储器高四位 TABRDL [m] 读取 ROM 最后一页的内容 并送至数据存储器和 TBLH 说明 本指令是将 TABLE 指针指向程序寄存器最后页 将低位送到存储器 高位直接送到 TBLH 寄存器内 运算过程 [m] 程序存储器低四位 TBLH 程序存储器高四位 XOR A, [m] 累加器与立即数做异或运算结果放入累加器说明本指令是把累加器值数据存储器值做逻辑异或结果放到累加器运算过程 ACC ACC XOR [m] XORM A, [m] 累加器与数据存储器做异或运算结果放入数据存储器说明本指令是把累加器值数据存储器值做逻辑异或结果放到数据存储器运算过程 [m] ACC XOR [m] XOR A, x 累加器与数据存储器做异或运算结果放入累加器说明本指令是把累加器值与立即数做逻辑异或结果放到累加器运算过程 ACC ACC XOR X 15