STM32 控制4位共陽(yáng)數(shù)碼管輸出計(jì)數(shù)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
用到GPIO口 PA0~PA11共12個(gè)引腳
先上原理圖
因?yàn)槭枪碴?yáng)所以12,9,8,6為電源輸入,其他引腳均為接地,所以對(duì)于芯片來(lái)說(shuō)12,9,8,6高位輸出,其他設(shè)定為低位即可。
//設(shè)定下GPIO口
voidGPIO_Num_Init(void)
{
GPIO_InitTypeDefGPIO_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);
}
這里有個(gè)要注意的,根據(jù)原理圖可以看出數(shù)碼管一次只能輸出一位數(shù)組,所以如果是多位的必須使用掃描的方式輸出,縮短切換的間隔,就可以達(dá)到不閃爍的效果。
//輸出封裝
voidDisPlayNum(intn)
{
if(n<9999)
{inti;
ints;
s=n;
i=0;
for(i=0;i<4;i++)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_All);
switch(i)
{
case0:
GPIO_SetBits(GPIOA,GPIO_Pin_5);
break;
case1:
GPIO_SetBits(GPIOA,GPIO_Pin_7);
break;
case2:
GPIO_SetBits(GPIOA,GPIO_Pin_8);
break;
case3:
GPIO_SetBits(GPIOA,GPIO_Pin_11);
break;
}
switch(s%10)
{
case0:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_4);
break;
case1:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_9|GPIO_Pin_10);
break;
case2:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_9);
break;
case3:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_9);
break;
case4:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10);
break;
case5:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_6);
break;
case6:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_6);
break;
case7:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_9);
break;
case8:
GPIO_SetBits(GPIOA,GPIO_Pin_2);
break;
case9:
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0);
break;
}
s=s/10;
delay_ms(1);
if(s==0)
break;
}
}
}
最后main的測(cè)試代碼
intcount;
intTimeCheck;
intmain(void)
{
GPIO_Num_Init();
count=0;
TimeCheck=0;
while(1)
{
DisPlayNum(count);
TimeCheck++;
delay_ms(5);
if (TimeCheck > 100){ //每500毫秒+1