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

#C0103


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

——《沧海拾昧集》@CuPhoenix


【阅前敬告】

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

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


一、多位七段数码管

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

【沧海拾昧】Proteus8仿真stm32:七段数码管显示_第1张图片 数码管译码表

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

片选位数 1 2 3 4
片选码 0x0e00 0x0d00 0x0b00 0x0700


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

GPIO_Write(GPIOC, 0x0e6f );
【沧海拾昧】Proteus8仿真stm32:七段数码管显示_第2张图片 在第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++){}
	}
}

仿真结果。 

【沧海拾昧】Proteus8仿真stm32:七段数码管显示_第3张图片 动态扫描输出四位

敬谢诸君。


京华西山之巅。

你可能感兴趣的:(#,STM32,单片机,嵌入式硬件,proteus,stm32)