💻 第二章 试着制造一台计算机吧
📄 一句话概括

输入用拨码开关,输出用 LED 数码管——最朴素的外设,让程序的进与出都看得见摸得着。

📝 本节和前面几节的关系

程序有了进入内存的通道,这一节把两头的外设接好:一头进(开关)、一头出(数码管)。

一、输入端:拨码开关

8 个小开关排成一排,拨上为 1、拨下为 0——正好一个字节。 它接在输入 I/O 的引脚上,占一个端口号。CPU 一句【读该端口】,8 个开关的当前状态就变成数据进了寄存器。

二、输出端:LED 数码管

数码管由 7 条发光段(a~g)组成,按不同组合点亮就显示不同数字——比如亮 a、c、d、f、g 五段就是【5】。 它接在输出 I/O 上,也占一个端口号。CPU 一句【写该端口】,写入的字节按七段码点亮对应段。

三、朴素外设的深意

别嫌寒酸:开关是输入的本质(给机器一个字节),数码管是输出的本质(机器还你一个字节)。 键盘和显示器再花哨,进了计算机也都变回这两样:一串输入字节、一串输出字节(1.4 节【一切皆数字】在此落地)。

四、动手 Demo:从拨 5 到亮 5 的完整旅程

模拟一次完整旅程:拨出 5、读进 CPU、写到端口、点亮数码管。

# 拨码 5 -> 数码管 5
SEG = {5: "1011011"}   # 七段码 abcdefg
switch = 0b00000101     # 拨码开关: 5
a = switch              # IN: 读入寄存器 A
out = a                 # OUT: 写到端口 2
print("开关:", format(switch, "08b"))
print("数码管点亮的段:", SEG[out])

实跑输出:

--------------------------------------------------------------------
接外部设备——拨码开关进、数码管出
--------------------------------------------------------------------

第二章用的外部设备简单朴素:输入用拨码开关,输出用 LED 数码管。
下面模拟一次完整旅程:拨出数字 5,看它怎么出现在数码管上:

[第 1 步] 拨码开关拨出二进制 00000101(十进制 5)
[第 2 步] 开关接到 I/O 端口 0x01(输入端口)
[第 3 步] CPU 执行 IN 指令,把端口 0x01 的值读进寄存器 A
[第 4 步] CPU 执行 OUT 指令,把 A 写到端口 0x02(数码管)
[第 5 步] 数码管按 5 的七段码(1011011)点亮对应笔画

  七段码位     a b c d e f g                   含义
  ---------------------------------------------------------------
  1011011      a亮 b暗 c亮 d亮 e暗 f亮 g亮     正是数字 5 的笔画

一次拨号进、一次亮灯出——这就是本章微型计算机的全部输入输出。

五步旅程:拨开关 -> 读端口 -> 寄存器 A -> 写端口 -> 点亮段。每一步都对应一根接好的线。 【⚠️ 2026 现状】如今开发板(树莓派 Pico 等)点 LED 用的还是同一套输入输出思想,16 课树莓派课上点过的那盏灯就是它的后代。

30 秒实验

  1. 在纸上画出七段的 a~g,试着用 0/1 标出【8】该怎么亮(答案:全亮 1111111)。
  2. 把 16 课树莓派【点亮一颗 LED】的实验回想一遍——思想与本章完全同源。

常见误区

  1. 以为数码管认识数字——它只认七段码,是【点亮哪些段】的约定让它看起来像数字。
  2. 以为外设越复杂原理越不同——原理相同,复杂度都在接口芯片里。
自测三问(点开对答案) 1. 本章的输入输出设备各是什么? —— 输入=拨码开关(一次一个字节),输出=LED 数码管(七段点亮)。 2. 七段码是什么? —— 7 位 0/1 对应数码管 a~g 七段亮暗的约定。 3. 为什么说朴素外设有深意? —— 开关与数码管就是输入输出的本质——一个字节进、一个字节出。

相关笔记