STM32数码管系列——单个数码管的静态显示,动态自增以及四位数码管滚动(待完善)

以四位一体数码管和74HC244N三态门芯片组合为例进行编程。

一、数码管类别搭配

        数码管分共阴极和共阳极数码管,针对不同的数码管有不同的配置操作。

        共阴极数码管公共端接地,引脚高电平点亮,共阳极反之。注意数码管的使用必须要在正常电压范围内,否则极其容易烧毁数码管,一般配合74HC244芯片使其供电更加稳定。74HC244的OE端口给低即输入输出相同,给高的话呈高组态形式。

简单来说,就是对应共阴极(共阳极)数码管指定引脚给有效电平点亮操作。

        接线需要数码管引脚图顺序和IO口顺序一一对应才可以正确显示结果。

二、函数选用与码表

        对于数码管的点亮所使用的函数是GPIO_Write(),该函数可以控制整个IO口的电平,例如给定GPIO_Write(GPIOB,0xFFFF);其他正常的情况下,就是使所有PB口输出高电平,既然这样的话,那就可以利用这一特性配合16位进制数,根据16位进制数的对应01部分来控制IO口的输出电平了。

        在使用GPIO_Write时若只让其控制某些IO口也可以,举例如下(以共阳极数码管为例,共阴极只需将代码高低部分翻转即可)

        注意将指定的IO口都用GPIO_SetBits()置高,执行流程即将十进制数对应数组里的16位进制数用GPIO_Write输出到配置好的IO口即可点亮对应的数字。经过实测发现码表数组有一点问题,注释部分为正确的,但是使用的Num[]数组也没有问题,这里待更新解决。同时分享共阴极的16位数。

//char Num[16] ={0xc0, 0xf9,0xa4, 0xb0, 0x99, 0x92, 0x82, 
//                                    0xf8,0x80, 0x90, 0x88, 0x83, 0xc6,0xa1, 0x86, 0x8e};//共阳数码管  

//char code[16]={0x40, 0x79,0x24, 0x30, 0x19, 0x12, 0x02,0x78,0x00, 0x10, 0x08, 0x03, 0x46,0x21, 0x06, 0x0e};                        //共阳极数码管


实测正确的数组:

//Num[16]={0x4079,0x7924, 0x2430, 0x3019, 0x1912, 0x1202,0x0278,0x7800, 0x0010, 0x1008, 0x0803, 0x0346,0x4621, 0x2106, 0x060e};                                //共阳极数码管

三、代码部分

以下是初始化和读取部分的函数,开启PB8至PB15的IO口进行显示。

#include "stm32f10x.h"                  // Device header

//char code[16]={0x40, 0x79,0x24, 0x30, 0x19, 0x12, 0x02,0x78,0x00, 0x10, 0x08, 0x03, 0x46,0x21, 0x06, 0x0e};
int Num[16]={0x4079,0x7924, 0x2430, 0x3019, 0x1912, 0x1202,0x0278,0x7800, 0x0010, 0x1008, 0x0803, 0x0346,0x4621, 0x2106, 0x060e};


void Show_Init(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | 
							GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	
	GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | 
					GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}

void Led_code(int num)//数码管显示代码,给                       低有效
{
		GPIO_Write(GPIOB,Num[num]);//写入数据
}

主函数部分:(代码中为给6,数码管显示为6)

#include "stm32f10x.h"  // Device header
#include "show.h"
int main (void)
{
	Show_Init();		
	while(1)
	{
		Led_code(6);//数码管显示代码,给低有效
	}
}

四、自增以及滚动自增显示

将静态显示的主函数利用延时函数和if判断循环即可实现。代码如下:

int main (void)
{
	Show_Init();		
	int num=0,i=0;
	while(1)
	{	
		Led_code(num);
		num++;
		Delay_ms(500);
		if(num==16)num=0;

	}
}

滚动显示主要就是四位一体数码管的位选端,位选端高电平有效,通过设置四个IO口依次输出高电平来控制数码管的逐一亮灭。其他保持不变即可,注意的是其中的num需要定义在外面,如果定义在函数内部则会在主函数循环中又执行一次int num=0;的操作就会发生只能显示0至3的情况,代码如下:

void Show_Going(void)
{
	GPIO_Write(GPIOB,Num[num]);//写入数据
	GPIO_SetBits(GPIOA,  GPIO_Pin_1);
	GPIO_ResetBits(GPIOA,  GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
	num++;
	
	if(num==16)num=0;
	Delay_ms(500);
	GPIO_Write(GPIOB,Num[num]);//写入数据
	GPIO_SetBits(GPIOA,  GPIO_Pin_2);
	GPIO_ResetBits(GPIOA,  GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4);
	num++;
	
	if(num==16)num=0;
	Delay_ms(500);
	GPIO_Write(GPIOB,Num[num]);//写入数据
	GPIO_SetBits(GPIOA,  GPIO_Pin_3);
	GPIO_ResetBits(GPIOA,  GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_4);
	num++;
	
	if(num==16)num=0;
	Delay_ms(500);
	GPIO_Write(GPIOB,Num[num]);//写入数据
	GPIO_SetBits(GPIOA,  GPIO_Pin_4);
	GPIO_ResetBits(GPIOA,  GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_1);
	num++;
	
	if(num==16)num=0;
	Delay_ms(500);
	GPIO_Write(GPIOB,Num[num]);//写入数据

}

        

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真寻460

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值