c51数码管显示
时间: 2025-06-17 08:11:33 浏览: 16
### C51单片机驱动数码管显示的代码示例
以下是基于C51单片机实现数码管动态显示的一个完整代码示例。该程序通过循环切换不同位置上的数码管,并利用延时函数制造视觉暂留效果,从而达到多位数同时显示的目的。
```c
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit DIG1 = P2^0; // 定义第一个数码管的位置控制端口
sbit DIG2 = P2^1; // 定义第二个数码管的位置控制端口
sbit DIG3 = P2^2; // 定义第三个数码管的位置控制端口
sbit DIG4 = P2^3; // 定义第四个数码管的位置控制端口
u8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管段码表 (共阳极)
void delay(u16 i) {
while(i--);
}
// 动态显示函数
void DynamicDisplay(u8 num[]) {
static u8 pos = 0; // 当前显示位置
switch(pos) {
case 0:
DIG1 = 0; DIG2 = 1; DIG3 = 1; DIG4 = 1; // 只点亮第一位数码管
P0 = ~smgduan[num[pos]]; // 输出对应段码
break;
case 1:
DIG1 = 1; DIG2 = 0; DIG3 = 1; DIG4 = 1; // 只点亮第二位数码管
P0 = ~smgduan[num[pos]];
break;
case 2:
DIG1 = 1; DIG2 = 1; DIG3 = 0; DIG4 = 1; // 只点亮第三位数码管
P0 = ~smgduan[num[pos]];
break;
case 3:
DIG1 = 1; DIG2 = 1; DIG3 = 1; DIG4 = 0; // 只点亮第四位数码管
P0 = ~smgduan[num[pos]];
break;
}
delay(500); // 延时一段时间以保持亮度稳定
P0 = 0xff; // 关闭所有数码管
pos++; // 切换到下一个位置
if(pos > 3) pos = 0; // 循环回到第一位
}
void main() {
u8 display_num[4] = {1, 2, 3, 4}; // 要显示的四位数字
while(1) {
DynamicDisplay(display_num); // 不断调用动态显示函数
}
}
```
#### 解析:
- **`smgduan[]`** 是一个数组,用于存储每一位数字对应的段码[^3]。
- **`delay()`** 函数提供必要的延迟时间,使人类眼睛能够感知连续的画面而不会闪烁。
- **`DynamicDisplay()`** 实现了动态扫描的功能,每次只点亮一个数码管并快速轮询其他数码管,形成视觉暂留的效果[^2]。
---
###
阅读全文
相关推荐

















