第三课:IO 输入输出 - 让单片机与世界对话
📌 学习目标
- 理解什么是 IO 口
- 学会配置 IO 为输入或输出
- 掌握数字输出指令
- 掌握数字输入指令
- 动手做一个开关控制 LED 的项目
🎯 什么是 IO?
IO 是 Input/Output 的缩写,意思是输入/输出。
- 输入:单片机从外界读取信息(按钮、传感器等)
- 输出:单片机向外界发送信息(LED、蜂鸣器等)
🔧 配置 IO 口
使用 R25 寄存器来配置每个 IO 口:
| R25 的值 | 说明 |
|---|---|
0000 | 全部设为 输出 |
00FF | 全部设为 输入 |
00F0 | 低4位输出,高4位输入 |
000F | 低4位输入,高4位输出 |
💡 数字输出 (0x01)
控制 LED、蜂鸣器等输出设备。
指令格式
| 指令 | OP00 | OP01 | OP10 | OP11 |
|---|---|---|---|---|
01 | 00 | 输出引脚(00~07)或 FF(按位操作) | 00 | 输出值 |
说明:
- 单个引脚输出: OP01 = 00
07(指定LED0LED7),OP11 = 00(亮)或 01(灭) - 按位输出: OP01 = FF,OP11 = 00~FF(每一位对应一个LED的状态)
例子:控制 8 个 LED
- 📚 带注释
- 📋 纯净代码
000 10 0019 0000 ; R25 = 0x0000 → 全部设为输出
001 01 00FF 0001 ; 第1个LED亮(按位操作)
002 02 03E8 0000 ; 延时
003 01 00FF 0002 ; 第2个LED亮(按位操作)
004 02 03E8 0000 ; 延时
005 01 00FF 0004 ; 第3个LED亮(按位操作)
006 02 03E8 0000 ; 延时
007 01 00FF 0008 ; 第4个LED亮(按位操作)
008 02 03E8 0000 ; 延时
009 0E 0001 0000 ; 循环回到001
000 10 0019 0000
001 01 00FF 0001
002 02 03E8 0000
003 01 00FF 0002
004 02 03E8 0000
005 01 00FF 0004
006 02 03E8 0000
007 01 00FF 0008
008 02 03E8 0000
009 0E 0001 0000
🔍 数字输入跳转 (0x0B)
读取按钮、开关等输入设备,根据状态跳转。
指令格式
| 指令 | OP00 | OP01 | OP10 | OP11 |
|---|---|---|---|---|
0B | 条件 | 跳转地址 | 00 | 00 |
🔬 课堂演示项目:按钮控制 LED
项目目标
按下按钮时 LED 亮,松开时 LED 灭。
硬件连接
- 按钮:连接到 IO0(输入)
- LED:连接到 IO4(输出)
参考程序
- 📚 带注释
- 📋 纯净代码
; 按钮控制 LED 项目
000 10 0019 0001 ; R25 = 0x0001 → IO0输入,其他输出
001 0B 0001 0004 ; 如果IO0为1(按钮松开),跳转到004
002 01 0010 0000 ; LED 亮
003 0E 0001 0000 ; 跳回
004 01 0000 0000 ; LED 灭
005 0E 0001 0000 ; 跳回
000 10 0019 0001
001 0B 0001 0004
002 01 0010 0000
003 0E 0001 0000
004 01 0000 0000
005 0E 0001 0000
教学建议
- 可以加入延时,实现按下按钮后LED闪烁
- 可以用多个按钮控制多个LED
- 可以尝试按一下切换状态,而不是按住亮
💡 IO 输出数据解读
输出数据的每一位对应一个 IO 口:
| 数据位 | 对应 IO |
|---|---|
| 位0 | IO0 |
| 位1 | IO1 |
| 位2 | IO2 |
| ... | ... |
| 位7 | IO7 |
例子:
0001→ IO0 输出高电平0003→ IO0 和 IO1 输出高电平00FF→ 全部 IO 输出高电平
🎉 小结
今天我们学到了:
- ✅ IO = 输入/输出
- ✅ 用 R25 配置 IO 方向
- ✅ 指令 0x01 输出数据
- ✅ 指令 0x0B 根据输入跳转
- ✅ 完成了按钮控制 LED 的项目
下一课我们将学习 PWM,让 LED 呼吸起来!