一、数码管显示
1.1 数码管是什么
数码管是一种显示数字的电子元件,由多个LED段组成。常见的数码管有7段 (显示数字)和8段(多一个小数点)。每一段对应一个LED,通过控制不同段的亮灭,就能组合出不同的数字。
text
a
───
│ │
f│ │b
│ │
───
│ │
e│ │c
│ │
─── · dp
d
每个数字对应一段组合,比如数字 0 需要点亮 a、b、c、d、e、f 六段,数字 1 只需要点亮 b、c 两段。
1.2 段码表
为了显示数字,需要给每一段分配一个二进制位。共阴极数码管(低电平点亮)的段码表如下:
| 数字 | 段码(十六进制) |
|---|---|
| 0 | 0x3F |
| 1 | 0x06 |
| 2 | 0x5B |
| 3 | 0x4F |
| 4 | 0x66 |
| 5 | 0x6D |
| 6 | 0x7D |
| 7 | 0x07 |
| 8 | 0x7F |
| 9 | 0x6F |
1.3 多位数码管的显示原理
一块开发板上通常有4位或8位数码管,但它们的段选线是共用的,只有位选线是独立的。这意味着:
-
位选:选择当前要点亮哪一位数码管
-
段选:决定这一位显示什么数字
-
动态扫描:由于不能同时显示多位,需要快速轮流点亮每一位,利用人眼视觉暂留效应,看起来就像同时显示了
显示逻辑:
-
选中第m位数码管(位选)
-
送入该位要显示的数字段码(段选)
-
延时一小段时间
-
切换到下一位,重复以上步骤
当扫描速度足够快(每秒50次以上),人眼就感觉不到闪烁。
1.4 显示多位数字的思路
要把一个整数(比如 1234)拆成每一位显示出来:
-
用
num % 10取出当前最低位 -
用
num / 10去掉最低位 -
循环4次,依次显示个、十、百、千位
-
每显示一位前先清空P0,避免残影
二、按键输入
2.1 按键的电路原理
按键本质上是一个开关,按下时接通,松开时断开。在单片机中,按键通常接在I/O口上,通过检测引脚电平来判断是否按下。
常见接法:按键一端接地,另一端接I/O口,I/O口通过上拉电阻保持高电平。按键按下时,引脚被拉低(0),松开时恢复高电平(1)。
2.2 按键检测思路
-
初始化:将按键对应的引脚设为输入模式(输出高电平)
-
检测:读取引脚电平,为0表示按下,为1表示松开
-
识别:多个按键对应不同引脚,哪个引脚为0就是哪个按键被按下
代码逻辑:
c
if ((P1 & (1<<4)) == 0) ret = 1; // 第4位按下
else if ((P1 & (1<<5)) == 0) ret = 2; // 第5位按下
// ...
三、中断
3.1 什么是中断
中断是单片机处理突发事件的一种机制。当某个事件发生时(比如按键按下、定时器溢出),CPU暂停当前正在执行的程序,转去执行对应的处理函数(中断服务函数),处理完之后再回到原来的位置继续执行。
3.2 中断的处理流程
-
中断请求:外设或内部事件发出中断信号
-
中断响应:CPU检测到中断请求,暂停当前程序
-
保护现场:保存当前程序的返回地址和状态
-
执行中断服务函数:跳转到对应的处理函数
-
恢复现场:中断处理完毕,恢复之前保存的状态
-
返回主程序:回到中断发生的位置继续执行
3.3 外部中断的配置
以外部中断0(INT0)为例,需要配置三个寄存器:
| 寄存器 | 作用 |
|---|---|
IE |
中断允许寄存器,开启总中断和INT0中断 |
TCON |
定时器控制寄存器,设置INT0触发方式(下降沿/低电平) |
P3 |
将P3.2引脚设为输入模式 |
配置步骤:
-
P3 \|= (1<<2):P3.2设为高电平(输入模式) -
IE \|= (1<<0) \| (1<<7):开启INT0中断和总中断 -
TCON \|= (1<<0):设置INT0为下降沿触发
3.4 中断服务函数
中断服务函数是中断发生时自动执行的函数,语法比较特殊:
c
void eint0_handler(void) interrupt 0
{
// 处理代码
}
interrupt 0 表示这是外部中断0的服务函数,编译器会自动把它放到中断向量表对应的位置。
四、今日总结
今天学了数码管显示、按键输入和外部中断,核心要点如下:
数码管:
-
段码表把数字转换成段选信号
-
多位显示靠动态扫描------轮流点亮每一位,利用视觉暂留
-
显示多位数字用
%10和/10循环拆位
按键:
-
按键就是开关,按下为低电平,松开为高电平
-
通过检测引脚电平判断哪个按键按下
-
实际项目需要按键消抖
中断:
-
中断是CPU响应突发事件的机制
-
处理流程:请求→响应→保护现场→处理→恢复现场→返回
-
外部中断需要配置
IE、TCON、P3寄存器 -
中断服务函数用
interrupt 0声明