STM32 控制4位共阳数码管输出计数

用到GPIO口 PA0~PA11共12个引脚

先上原理图

因为是共阳所以12,9,8,6为电源输入,其他引脚均为接地,所以对于芯片来说12,9,8,6高位输出,其他设定为低位即可。

//设定下GPIO口
void GPIO_Num_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

这里有个要注意的,根据原理图可以看出数码管一次只能输出一位数组,所以如果是多位的必须使用扫描的方式输出,缩短切换的间隔,就可以达到不闪烁的效果。

//输出封装
void DisPlayNum(int n)
{
	if (n < 9999)
	{ int i;
		int s;	
		s = n;
		i=0;
		for (i=0;i<4;i++)
		{
			GPIO_ResetBits(GPIOA,GPIO_Pin_All);
			switch (i)
			{
                                case 0:
					GPIO_SetBits(GPIOA,GPIO_Pin_5);
					break;
				case 1:
					GPIO_SetBits(GPIOA,GPIO_Pin_7);
					break;
				case 2:
					GPIO_SetBits(GPIOA,GPIO_Pin_8);
					break;
				case 3:
					GPIO_SetBits(GPIOA,GPIO_Pin_11);
					break;
                        }
		
			switch (s % 10)
			{
				case 0:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_4); 
					break;
				case 1:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_9|GPIO_Pin_10);
					break;
				case 2:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_9);
					break;
				case 3:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_9);
					break;
				case 4:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10);
					break;
				case 5:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_6);
					break;
				case 6:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_6);
					break;
				case 7:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_9);
					break;
				case 8:
					GPIO_SetBits(GPIOA,GPIO_Pin_2);
					break;
				case 9:
					GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0);
					break;
			}	
			s = s / 10;
			delay_ms(1);
			if (s==0)
				break;
		}	 
	}
}

最后main的测试代码

int count;
int TimeCheck;

int main(void)
{
	GPIO_Num_Init();
	count =0;
	TimeCheck = 0;
	while(1)
	{
		DisPlayNum(count);
		TimeCheck++;
		delay_ms(5);
		if (TimeCheck > 100){ //每500毫秒+1
			TimeCheck=0;
			count++;
		}
	}
}


  • 10
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值