笔记「微机原理」
第 2 章
8086 / 8088
功能特性
-
8086: 第一代 16 位微处理器
-
首次引入流水线思想, 指令级流水线
-
存储器分段管理
-
输入输出独立编址 (IN/OUT 指令)
-
内存分段, 寻址空间 1M
-
接口不分段, 寻址空间 64KB
-
无法进行浮点数运算
8088 8 位
体系结构
总线接口单元 BIU, 执行单元 EU, 通过总线传输数据.
指令队列: BIU 从内存中取指令放入指令队列, 控制电路从队列中取指令译码并进行相应的任务, EU 从总线上取数据进行计算.
一定程度的并行.
寄存器
AX, BX, CX, DX, SI, DI, SP, BP, DS, CS, ES, SS
只有 BX, DI, SI 可以寄存器间接寻址 ([BX]
)
基址变址的基址只能是 BX, 即不可以 [SI + DI]
位移指令, 如果不是 1, 默认放在 CX 里
串操作指令计数是 CX, 源地址在 SI, 目的地址在 DI
flags:
-
AF: 后四位向前四位进位 / 借位 (无符号数)
-
CF: 无符号数进位 / 借位
-
PF: 结果奇偶, 0 = 奇, 1 = 偶
-
ZF: 结果 0
-
SF: 符号位, 最高位为 1, SF = 1.
-
OF: 有符号数溢出
-
DF: 方向标志位, 标志串操作指令的方向, 0 = 地址增方向, 1 = 地址减方向.
-
IF: 中断标志位, 1 = 中断打开
-
TF: 调试用, 1 = 执行一句指令后暂停
奇偶地址存储体
8086 设计成奇偶地址 (以字节编址) 分开存储.
偶地址时, $\rm A0$ 一定为 $\rm 0$, 所以偶地址存储体的选择信号表示为 $\rm A0 = 0$, 芯片上就是 $\rm A0$ 接在偶地址存储体的片选信号 $\rm \overline{CS}$ 上.
基地址选择信号用另一个信号 $\rm \overline{BHE} = 0$ 表示, 接在奇地址存储体的片选信号 $\rm \overline{CS}$ 上.
为什么不用 $\rm \overline A$: 16 位机器, 支持同时操作 16 个位, 即 2 字节, 需要同时选上两个片选. (从奇地址读 16 位的话, 需要读两次, 所以需要数据对齐到 16 位)
内存结构
芯片引脚
不需要理解芯片内部结构
-
$\rm VCC, GND, CLK, RESET$
-
$\rm AD0$ - $\rm AD19$: 地址和数据线, 分时复用
-
$\rm INTR$: 中断请求, 高电平有效
-
$\rm NMI$: 不可屏蔽中断请求
-
$\rm \overline{BHE}$: 奇地址选择信号, 见奇偶地址存储体
-
$\rm MN / \overline{MX}$: 最小模式 / 最大模式, 最小模式只有 8086 一个处理器, 最大模式可以接其他协处理器 (如 8087 浮点数运算器)
-
$\rm READY$: 等待 IO, $\rm READY$ 接收, 外设读写完成发送 $\rm READY$, CPU 进行下一步. (要和时钟同步)
最小模式下:
- $\rm HOLD, HLDA$: DMA 请求, 应答
- $\rm \overline{INTA}$: 中断应答, 见中断
- $\rm \overline{RD}, \overline{WR}$ 读, 写信号
- $\rm M / \overline{IO}$, 内存 / IO 选择信号
- $\rm ALE$: 锁存信号, 见锁存
- $\rm DT / \overline{R}$: 数据发送 ($\rm T$) 或者接收 ($\rm \overline{R}$)
- $\rm \overline{DEN}$: 表示 $AD$ 引脚现在是数据
最大模式下:
TODO
总线形成
驱动
接的多了, 直流, 交流信号变化, 可能导致 0, 1 数据的变化. 驱动器接某个引脚, 负责 “加强信号”. 见 负载
锁存
地址或数据 (或其他复用的引脚) 会变化, 比如地址通过 $\rm AD$ 送出到总线, 在外设看来, 要保证不变. 外部加锁存器即可. 什么时候锁由 8086 通过 $\rm ALE$ 引脚发出锁存信号.
- 74LS373:
- $\rm D0$ - $\rm D7$: 输入
- $\rm Q0$ - $\rm Q7$: 输出
- $\rm LE$: 锁存
- $\rm \overline{OE}$: 三态门使能
不复用不需要锁存. 输入不需要锁.
接口/内存读写
利用 $\rm M/ \overline{IO}$ 和 $\rm \overline{RD}, \overline{WR}$ 进行逻辑电路设计, 得到 $\rm \overline{MEMR}, \overline{MEMW}, \overline{IOR}, \overline{IOW}$
第 3 章
寻址方式
- 立即寻址:
mov ax, 55H
- 直接寻址:
mov ax, [55H]
- 寄存器寻址:
mov ax, bx
- 寄存器间接寻址:
mov ax, [bx]
- 寄存器相对寻址:
mov ax, [si + 55H]
- 基址变址寻址:
mov ax, [bx + si]
- 基址变址相对寻址:
mov ax, [bx + si + 55H]
段
段名 segment <对齐方式> <组合方式> <类>
段名 ends
代码结构
|
|
或者:
|
|
定义数据
|
|
操作符
offset
: 返回符号的偏移地址
|
|
ptr
: 返回符号所在位置的内容, 前面需要 size 修饰
|
|
函数 (过程)
|
|
IO 指令
地址仅能使用 dx, 数据仅能使用 al / ax
|
|
|
|
第 4 章
常用总线
系统总线
- ISA 总线: 并行, 8 位 (XT 总线), 16 位 (AT 总线)
- PCI 总线: 并行, 32 位, 64 位, 数据和地址复用
- PCIe 总线
- 串行差分 (线与线之间影响小)
- 全双工 (可以同时双向传输)
- 编码率高 (PAM-4, 4 电平表示两个连续比特位)
- 端到端传输 (交换结构, 类似交换机的机制, 不需要总线仲裁)
- 多通道 (每个通道串行独立)
- 软件向下兼容 PCI
通信总线
- RS-232C: 串行, 三线经济方式, 调试单片机
- IDE (PATA): 并行, 连接辅存 (机械硬盘)
- SATA: 串行, 连接辅存 (机械硬盘)
- USB: 串行
- USB 2.0: 四线, 差分, 单双工
- USB 3.1, 3.2: 多 4 根差分线用来接收和发送, 全双工
- USB 3.2: 需要 Type-C (Type-C 通道中心对称并且冗余一面, 所以可以正反插), 利用 Type-C 的另一个空闲通道
- USB4
总线驱动与控制
竞争
略
解决方法: 用负载通过一个三态门接到总线上. 三态门可控输出高阻态 (相当于断开, 非 0 也非 1)
负载
- 直流负载 (电流): 负载的输入电流和要小于驱动输出电流, 一根线要么是低电平要么是高电平, 所以高低电平输入独立求和.
- 交流负载 (电容): 负载分布电容和要小于驱动
驱动器:
- 74LS244: 单向驱动器
- $\rm A0$ - $\rm A7$: 输入
- $\rm Y0$ - $\rm Y7$: 输出
- $\rm \overline{OE1}, \overline{OE2}$: 三态门使能
- 74LS245: 双向驱动器
- $\rm A0$ - $\rm A7$, $\rm B0$ - $\rm B7$: 输入 / 输出
- $\rm DIR$: 方向控制信号 ($\rm DIR = 1$, $\rm A \rightarrow B$)
- $\rm \overline{OE}$: 三态门使能
双向数据总线驱动设计
貌似是考试重点
- 内存板
- 看电路板的地址, 当总线地址在该范围内, 才可以接通. 找哪些地址线需要参与 “片选”, 并且利用译码器或者逻辑门设计
- 总线上有使用电路板信号, 才可以访问电路板, 所以使用电路板信号需要参与 “片选”. 如电路板是内存, 那么总线上的 $\rm \overline{MEMR}, \overline{MEMW}$ 需要参与 “片选”
- 同时还要看数据传输方向, 接 74LS245 的 $\rm DIR$ 引脚
- 接口板
- 看地址
- 接口读写 $\rm \overline{IOR}, \overline{IOW}$
- 数据传输方向
- 需要多考虑一个 $\rm AEN = 0$ (DMAC 提供) 参与 “片选” (与 DMA 有关防止总线竞争有关)
总线设计的其他问题
- 线间串扰
- 反射
第 5 章
- SRAM
- $\rm D$: 数据
- $\rm A$: 地址
- $\rm \overline{WE}$: 写信号
- $\rm \overline{OE}$: 读信号 (数据输出允许)
- $\rm \overline{CS}$: 片选信号
- EPROM
- $\rm D$: 数据
- $\rm A$: 地址
- $\rm \overline{OE}$: 读信号 (数据输出允许)
- $\rm \overline{CE}$: 片选信号
- $\rm \overline{PGM}$: 编程脉冲输入信号, 读时为 1 (一般读的时候直接接地让他为 0)
- E2PROM
- $\rm D$: 数据
- $\rm A$: 地址
- $\rm \overline{OE}$: 读信号 (数据输出允许)
- $\rm \overline{WE}$: 写信号
- $\rm Ready/\overline{Busy}$: 写时, 地址数据稳定后会写入 E2PROM 的缓冲区, 从缓冲区写入 ROM 需要等待较长时间, 此时 $\rm \overline Busy$ 低电平, 表示正在忙. 将一个接口地址译码 ($\rm AEN, \overline{IOR}$ 也参与) 到一个三态门使能端, 三态门有向连接 $\rm \overline{Busy}$ 和某一个数据线.
mov dx, addr; in al, dx
即可读取总线上的数据, 判断是否可写完 (忙等待)
- Flash, 闪速 E2PROM
内存地址译码电路设计
一般是总线连接内存板, 总线有 $\rm A$, $\rm D$, $\rm \overline{BHE}$, $\rm \overline{MEMW}$, $\rm \overline{MEMR}$
- 数据, 内存读写直接连
- 内存板的地址引脚连对应总线上的
- 剩下总线上的高位地址线, 译码连接片选, 即可实现将内存地址映射到 8086 的某段地址上
-
字扩展: 地址更多, 增加译码即可
-
位扩展: 比特更多, 按字节编址, 正好对应奇偶存储体, 需要注意:
- $\rm A1$ 开始是 字地址, 译码选中两片
- $\rm A0$, $\rm \overline{BHE}$ 奇偶存储体选择, 参与译码片选
- 以上两者取逻辑与连接到片选
-
逻辑门电路
-
3-8 译码器
-
ROM: 片选和三态门使能有效, 根据需要写入内容.
-
数字比较器 (74LS688)
-
PLD (可编程逻辑器件)
片选信号线上加上拉电阻接 VCC, 防止三态门关闭高阻时信号随机导致选中.
第 6 章
中断
8086 三个中断相关引脚:
- $\rm NMI$: 不可屏蔽中断请求, 上升沿有效 (用于掉电检测等)
- $\rm INTR$: 外部中断请求
- $\rm \overline{INTA}$: 中断应答
$\rm INTR$ 和 $\rm \overline{INTA}$ 接中断控制器 8259, 同时接低 8 位数据线, 用于发送中断向量
8086 与 8259 的通信过程:
- 8259 通过 $\rm INTR$ 发送请求, 表示需要发送中断
- 8086 如果满足应答中断条件 (如指令执行完成并且外部中断允许, 即 IF 标志位为 1), 则通过 $\rm \overline{INTA}$ 送一个负脉冲, 表示可以接收中断请求
- 8259 向地址线低 8 位写中断向量
- 8086 通过 $\rm \overline{INTA}$ 送一个负脉冲, 并在其上升沿采样地址线低 8 位, 得到中断向量
中断向量表
256 * 4B, 高 2B 表示 cs 的内容, 低 2B 表示 ip 的内容 (小端序), cs:ip 是中断程序地址
中断过程
- 保护断点: 硬件完成
push flags
- 关中断 (IF = 0, TF = 0)
push cs
push ip
.- 中断处理: 编写中断处理程序
push regs
保存寄存器上下文- <
sti
开中断, 允许嵌套的话> - 中断处理
- <
cli
关中断, 允许嵌套的话> - <EOI, 中断结束命令, 允许嵌套的话, 向 8259 发送命令告诉它完成了一个中断处理程序>
pop regs
iret
8259
引脚
- $\rm IR0$ - $\rm IR7$: 8 个中断请求输入
- $\rm INT$: 接总线 $\rm INTR$
- $\rm \overline{INTA}$: 接总线 $\rm \overline{INTA}$
- $\rm D$: 接总线 $D$, 输出中断向量
- $\rm \overline{RD}$: 读
- $\rm \overline{WR}$: 写
- $\rm A0$: 地址, 用于接口地址, 编程 8259 内部寄存器
- $\rm \overline{CS}$: 片选
- $\rm CAS0, CAS1, CAS2, \overline{SP}/\overline{EN}$: 与级联有关
如果是 8086, 8259 的 $\rm A0$ 需要连总线的 $\rm A1$, 因为总线的 $\rm A0$ 是偶地址存储体选择信号, 当它是 0 是数据线用的是 $\rm D7$ - $\rm D0$, 与 8259 地址线相连. 而总线奇地址用 $\rm D8$ - $\rm D15$ 传输数据, 所以 $\rm A0 = 1$, $\rm \overline{BHE} = 0$ 时, 数据无法输入. 所以一定有 $\rm A0 = 0$, 那么 8259 的 $A0$ 就要用总线上的其他地址线如 $\rm A1$ 接
内部寄存器
都是 8 位.
- IRR: 中断请求寄存器: 第 i 位为 1, 说明此时 $\rm IRi$ 引脚所接设备发出了一个中断请求
- ISR: 中断服务寄存器: 第 i 位为 1, 说明 CPU 没有执行完 $\rm IRi$ 的中断请求
- IMR: 中断屏蔽寄存器: 第 i 位为 1, 表示不响应 $\rm IRi$ 的请求, 没接的引脚可以设置屏蔽
- ICW1 - ICW4: 初始化命令字, 见初始化编程
- OCW1 - OCW3: 操作命令字, 见操作方式编程
嵌套 & 优先级
允许嵌套时, 可以设置优先级, 采用一般 EOI, 不需要指定将 ISR 哪一位清零, 由 8259 的优先级模式自动控制
- 固定优先级:
- $\rm IR0$ 最高, $\rm IR7$ 最低.
- IRR & (~IMR) 与 ISR 比较, 如果有高优先级的, 则在 $\rm \overline{INTA}$ 的第一个负脉冲到来时, clear IRR, set ISR.
- 当中断程序结束时, 接收 EOI, clear lowbit(ISR) (不用指定 clear 哪一个)
- 自动循环优先级:
- 刚处理过的 $\rm IRi$ 优先级最低, $\rm IR_{i+1}$ 优先级最高
- 指定循环优先级:
- 编程指定一个最低的 $\rm IRi$, $\rm IR_{i+1}$ 优先级最高
级联
允许嵌套的情况下
- 一般嵌套方式: 优先级高的打断优先级低的, 同级不可以打断
- 特殊全嵌套方式: 判断接的是不是从片, 如果是, 这个引脚同级的也可以打断, 如果不是, 则不可以
级联就是将 $\rm IRi$ 连接到另一个 8259, 这样就有更多的接口了. 从片有优先级, 但都是发到主片的同一个引脚, 所以主片的同级需要打断
电路:
- $\rm \overline{SP}/\overline{EN}$ 接高电平表示主片, 接低电平表示从片.
- 从片的 $\rm INT$ 接主片的 $\rm IR$
- 从片的 $\rm \overline{INTA}$ 接总线
- 从片的 $D$ 接总线
- 从片的 $\rm CAS0$ - $\rm CAS2$ 连主片 (3 位, 能够表示 8 个数)
初始化命令字 ICW3:
- 主片初始化命令字 ICW3, set $i$ 表示 $\rm IRi$ 接的是从片;
- 从片初始化命令字 ICW3 的低 3 位写入二进制数字 i 表示接到了主片的 $\rm IRi$
级联中断请求和响应步骤:
- 从片通过 $\rm INT$ 发送请求, 到主片的 $\rm IRi$ 上 (可能有多个同时)
- 主片进行判优先级后, 选定优先级最高的一个 $\rm IRi$, 通过 $\rm INT$ 向 CPU 发送中断请求.
- CPU 准备好后, 通过 $\rm \overline{INTA}$ 发送两个负脉冲
- 主片接受到第一个负脉冲后, 设置 $\rm CAS0$ - $\rm CAS2$ 为 i, 表示应答 $\rm IRi$ 上的从片的请求
- 从片在接受到第一个负脉冲后, 检测 $\rm CAS0$ - $\rm CAS2$, 与 ICW3 低 3 位比较, 即可判断是否是响应自己的
- 如果是, 则向总线数据线 $\rm D$ 上写中断向量
工作模式
- 缓冲方式?
- 缓冲方式: 数据线要加驱动
- 非缓冲方式: 数据线不需要加驱动
- 是否级联?
- 否: 一般嵌套
- 是: 主片特殊全嵌套, 从片一般嵌套
- 允许嵌套?
- 否: 自动 EOI 模式, 不需要写 EIO 命令
- 是, 嵌套需要优先级?
- 否: 特殊屏蔽方式 (特殊 EOI 模式)
- 是: 一般屏蔽方式 (一般 EOI 模式)
- 优先级模式?
- 固定优先级
- 自动循环优先级
- 指定循环优先级
- 优先级模式?
初始化编程
- 工作模式初始化: 写 ICW1, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = 1$, 规定请求上升沿有效 / 高电平有效, 是否级联 (是否需要写 ICW3), 是否需要写 ICW4;
- $\rm D3 = 1$ 高电平, $\rm D3 = 0$ 上升沿
- $\rm D1 = 1$ 单片, $\rm D1 = 0$ 级联
- $\rm D0 = 1$ 要写 ICW4, $\rm D0 = 1$, 不写 ICW4, ICW4 = 0
- 顺序写 ICW2, 3, 4 (如果规定有), $\rm \overline{WR} = 0$, $\rm A0 = 1$
- 中断向量码初始化: 写 ICW2, $\rm D7$ - $\rm D3$ 表示中断向量码的高 5 位, 低 3 位为 $\rm IRi$, 即一片 8259 的 8 个中断请求中断向量连续
- 级联控制初始化: 写 ICW3. 主片 set bit 表示 $\rm IRi$ 接的是从片, 从片低 3 位表示接了主片的哪一个 $\rm IRi$
- 中断结束方式初始化: 写 ICW4
- $\rm D4 = 1$ 特殊全嵌套 (级联主片), $\rm D4 = 0$ 一般全嵌套 (级联从片)
- $\rm D3 = D2 = 0$, 非缓冲
- $\rm D1 = 1$ 自动 EOI (不允许中断被打断嵌套), $\rm D1 = 0$ 非自动 EOI (允许中断被打断嵌套, 需要手动写 EOI 命令)
- $\rm D0 = 1$
操作方式编程
- 中断屏蔽字
- 写 OCW1, $\rm \overline{WR} = 0$, $\rm A0 = 1$, 写入 OCW1 / IMR 中断屏蔽寄存器.
- 读 OCW1 / IMR, $\rm \overline{RD} = 0$, $\rm A0 = 1$, 读出 OCW1 / IMR.
- 中断结束和优先级循环: 写 OCW2, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = D3 = 0$
- 高三位: $\rm 001$ 一般 EOI 命令
- 高三位: $\rm 011$ 特殊 EOI 命令 (用于没有优先级的嵌套), 低三位指定清除 ISR 的哪一位
- 屏蔽方式, 写 OCW3, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = 0, D3 = 1$
- $\rm D6D5 = 00$: 非特殊屏蔽方式
- 读出控制字, 写 OCW3, $\rm \overline{WR} = 0$, $\rm A0 = 0$, $\rm D4 = 0, D3 = 1$, $\rm D1 = 1$
- $\rm D0 = 0$: 读 IRR
- $\rm D0 = 1$: 读 ISR
- 接着读, $\rm \overline{RD} = 0$ 地址 $\rm A0 = 0$, 即可读出刚刚指定的 IRR / ISR
写初始化命令字
略
写中断向量表
直接写, 略
用 DOS 的功能调用:
|
|
第 7 章
8255
可编程并行接口, 是一个接口, 可以连接外设和 CPU / 总线
引脚
- $\rm PA0$ - $\rm PA7$: 外设接口数据, A 口
- $\rm PB0$ - $\rm PB7$: 外设 B 口
- $\rm PC0$ - $\rm PC0$: 外设 C 口
- $\rm D$: 接总线数据
- $\rm \overline{RD}, \overline{WR}$: 读, 写
- $\rm A0, A1$: 接口地址线
- $\rm RESET$: 复位信号, 连 CPU 复位信号即可
- $\rm \overline{CS}$: 片选
工作模式
貌似只考方式 0, 无条件输入输出, 输用入三态门 (74LS244), 输出用锁存器 (74LS273).
地址线意义, $\rm A1A0 =$
- $\rm 00$: 读 / 写 A 口
- $\rm 01$: 读 / 写 B 口
- $\rm 10$: 读 / 写 C 口
- $\rm 11$: 配置 A, B, C 口的工作方式, 或者设置 PC 的值
- $\rm D7 = 1$, 配置工作方式
- $\rm D6D5$ 配置 A 口工作方式, $\rm 0$ 方式 0, $\rm 1$ 方式 1, $\rm 2$ 或者 $\rm 3$ 方式 2
- $\rm D4$ 配置 A 口输入 / 输出, $\rm 0$ 输出, $\rm 1$ 输入
- $\rm D3$ 配置 C 口高 4 位输入 / 输出
- $\rm D2$ 配置 B 口工作方式, 0 / 1
- $\rm D1$ 配置 B 口输入 / 输出
- $\rm D0$ 配置 C 口低 4 位输入 / 输出
- $\rm D7 = 0$, 设置 $\rm PC_{D3D2D1} = D0$
- $\rm D7 = 1$, 配置工作方式
A 口可以工作方式 0, 1, 2; B 口可以工作方式 0, 1; C 口只能工作方式 0. C 口高低 4 位可以分开配置, 主要是配合 A, B 口的方式 1 / 2. (不细说, 反正不考)
8253
可编程定时器, 内部有三个计数器, 每个计数器有三个 16 位的寄存器, 一个是初值, 一个是计数, 一个是用来读的.
引脚
-
$\rm CLK_i$: 接时钟
-
$\rm GATE_i$: 启动信号
-
$\rm OUT_i$: 输出
-
$\rm D7$ - $\rm D0$: 数据线, 连总线数据线
-
$\rm A1, A0$: 地址线
-
$\rm \overline{RD}, \overline{WR}$: 读, 写
-
$\rm \overline{CS}$: 片选
寄存器
每个计数器 3 个 16 位寄存器, 初值只写, 锁存寄存器只读, 计数不可访问, 所以每个计数器只占用一个接口地址
还有一个控制字寄存器, 用来配置工作方式, 只写
$\rm A1A0 =$
- $\rm 00$: 计数器 0
- $\rm 01$: 计数器 1
- $\rm 10$: 计数器 2
- $\rm 11$: 控制字
工作方式
- 方式 0, 1
- 开始计数, 输出低电平; 时间到, 输出高电平
- 写入计数初值时就开始计数, GATE 低电平暂停计数, 高电平允许计数
- GATE 上升沿时开始 / 重新计数 (需要时钟同步)
- 方式 2, 3
- 产生周期变化的波形, 周期为计数初值, 都是高电平先
- GATE 高电平允许计数, 低电平禁止计数, 上升沿重新计数
- 时间到时, 产生一个负脉冲 (计数周期中的最后一个时钟周期低电平)
- 产生宽度相同的方波 (计数初值偶数), 计数初值奇数时, 高电平比低电平多一个时钟周期
- 方式 4, 5
- 隔 计数初值 个时钟周期后, 产生一个负脉冲
- 写入计数初值时就开时, GATE 低电平暂停计数, 高电平允许计数
- GATE 上升沿时开始 / 重新计数
时钟周期: 下降沿开始到下一个下降沿
配置和操作
- $\rm D7D6$: 计数器选择
- $\rm D5D4$:
- $\rm 00$: 将计数器值锁存到锁存寄存器中, 以供读取
- $\rm 01$: 选择计数器的低 8 位读 / 写 (读写的是不同的寄存器, 但是由于一个只读一个只写, 所以不需要额外用一位指定是读还是写)
- $\rm 10$: 选择计数器的高 8 位读 / 写
- $\rm 11$: 两次读写, 第一次低 8 位, 第二次高 8 位
- $\rm D3D2D1$: 工作方式
- $\rm D0$: 0 二进制计数, 1 BCD 计数