【沧海拾昧】Proteus8仿真stm32:七段数码管显示

本文介绍如何通过动态扫描技术实现多位七段数码管的显示。内容涵盖共阴管和共阳管的区别、译码表的应用、GPIO_Write函数的使用方法及延时函数的重要性。此外还提供了一个具体的输出实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#C0103


沧海茫茫千钟粟,且拾吾昧一微尘

——《沧海拾昧集》@CuPhoenix


【阅前敬告】

沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系

如有问题必是本集记录有谬,切勿深究


一、多位七段数码管

 1、共阴管是CC,共阳管是CA,对应的译码表如下。

数码管译码表

2、输入信号A~G、DP的有效信号看是共阴还是共阳,共阴管对应的片选信号1~4是低电平有效,从左到右依次为第1位至第4位。

片选位数1234
片选码0x0e000x0d000x0b000x0700


3、输出的示例。数字码0x6f,片选码0x0e00,输出码即二者相加0x0e6f。

GPIO_Write(GPIOC, 0x0e6f );
在第1位输出“9”

4、输出用的函数GPIO_Write的原型如下,适用于对统一端口的多个引脚的写入。

void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t ProtVal)

5、多位七段管输出的方法是动态扫描,即逐位输出。在每位输出前面加一个短暂的延时函数,然后清零引脚,动态扫描输出就不会闪烁了。示例如下(在第一位片选码使用0x0e80,加了个小数点)。

 先定义好译码表待查。

const uint16_t SegmentCodes[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const uint16_t SegmentBit[]={0x0e80,0x0d00,0x0b00,0x0700};

输出内容。

uint16_t temp = 1234;
                        // 输出内容:1234
uint16_t unit[4];
unit[0] = temp / 1000;
unit[1] = temp % 1000 / 100;
unit[2] = temp % 100 / 10;
unit[3] = temp % 10;
                        // 位数拆分
int i = 0;
for(i=0;i<4;i++){
    delay();
    GPIO_Write(GPIOC, 0x0f00 );
    GPIO_Write(GPIOC, SegmentCodes[unit[i]]+SegmentBit[i] );
}
                        // 循环输出各位

短暂的延时。

void delay(){
	int i=0,j=0;
	for(i=0;i<5;i++){
		for(j=0;j<100;j++){}
	}
}

仿真结果。 

动态扫描输出四位

敬谢诸君。


京华西山之巅。

### Proteus 中八段数码管的段码表教程 在 Proteus 软件中,八段数码管是一种常见的显示设备,用于实现数字或字符的可视化展示。以下是关于如何获取并理解 Proteus 中八段数码管的段码表示方法的相关说明。 #### 数码管的工作原理 八段数码管由七个基本的 LED 发光单元组成,加上一个小数点 (dp),总共八个发光单元[^3]。这些单元通过特定的组合可以形成不同的数字和部分字符。对于共阴型数码管而言,当某一段被施加高电平时会点亮该段;而对于共阳型,则需施加低电平才能点亮相应段[^1]。 #### 段码定义 段码是指用来控制各段亮灭状态的一组二进制数据。每一段对应一位,在 Proteus仿真环境中通常按照如下顺序排列: | **段名** | a | b | c | d | e | f | g | dp | |----------|------|-------|--------|---------|----------|-----------|------------|--------------| | **位置** | LSB | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | MSB (Bit 7) | 其中 `a` 是最低有效位(LSB),而小数点 (`dp`) 则位于最高有效位(MSB)的位置。 #### 常见字形代码表 下面列出了几个典型阿拉伯数字及其对应的段码值(假设为共阴极配置下使用的六进制数值形式): | 显示内容 | 六进制段码值(Hex Code) | |----------|---------------------------------------------| | '0' | 0xC0 | | '1' | 0xF9 | | '2' | 0xA4 | | '3' | 0xB0 | | '4' | 0x99 | | '5' | 0x92 | | '6' | 0x82 | | '7' | 0xF8 | | '8' | 0x80 | | '9' | 0x90 | | '.'(仅DP)| 0x81 (只点亮小数点而不影响其他任何段的状态)| 注意以上表格适用于共阴极类型的数码管设置情况下的直接驱动模式。如果目标系统采用的是共阳极结构的话,则需要将上述所有比特位取反来获得相应的段码值。 #### 实际应用中的注意事项 在实际开发过程中,建议先编写简单的测试程序验证各个单独数码管的功能正常与否再继续深入开发工作流程[^4]。这样可以帮助开发者快速定位可能存在的硬件连接错误等问题从而提高整体效率减少不必要的麻烦。 ```c #include<reg51.h> sbit SEG_A=P2^0; sbit SEG_B=P2^1; sbit SEG_C=P2^2; sbit SEG_D=P2^3; sbit SEG_E=P2^4; sbit SEG_F=P2^5; sbit SEG_G=P2^6; sbit DP=P2^7; void main(){ while(1){ // Display number '0' SEG_A=1;SEG_B=1;SEG_C=1;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=0;DP=0;//C0H delay(); // Display number '1' SEG_A=0;SEG_B=1;SEG_C=1;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=0;DP=0;//F9H delay(); ... } } ``` 此示例展示了如何利用 C 语言针对 AT89S51 微控制器平台分别显示出‘0’以及‘1’这两个简单图形的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值