1、stm32控制4位共陽數(shù)碼管輸出計(jì)數(shù)
用stm32控制4位數(shù)碼管,需要用到GPIO口 PA0~PA11共12個(gè)引腳。首先我們來看看數(shù)碼管的原理圖。
因?yàn)槭枪碴査?2,9,8,6為電源輸入,其他引腳均為接地,所以對(duì)于芯片來說12,9,8,6高位輸出,其他設(shè)定為低位即可。
//設(shè)定下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);
}
這里有個(gè)要注意的,根據(jù)原理圖可以看出數(shù)碼管一次只能輸出一位數(shù)組,所以如果是多位的必須使用掃描的方式輸出,縮短切換的間隔,就可以達(dá)到不閃爍的效果。
//輸出封裝
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++;}}}
2、stm32控制共陰數(shù)碼管
共陰數(shù)碼管
#include“stm32f10x.h”
u8table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//共陰數(shù)碼管對(duì)應(yīng)的編碼
voiddelayms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--);
}
}
voidInitStm32()
{
GPIO_InitTypeDefGPIO_InitStructure; //定義一個(gè)管腳初始化的結(jié)構(gòu)體
//開啟PA口時(shí)鐘
GPIO_InitTypeDef DuanAndWeiMa;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
//配置PAO的模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
DuanAndWeiMa.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; //為什么要用一杠 0是段碼,1是位碼
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
DuanAndWeiMa.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
DuanAndWeiMa.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_Init(GPIOB,&DuanAndWeiMa);
}
intmain(void)
{
InitStm32();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_Write(GPIOA,0xfe); //問題是:第8個(gè)數(shù)碼管控制不了,一直顯示的是8
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_Write(GPIOA,table[0]);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delayms(2);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_Write(GPIOA,0xfd);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_Write(GPIOA,table[1]);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delayms(2);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_Write(GPIOA,0xfb);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_Write(GPIOA,table[2]);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delayms(2);
GPIO_SetBits(GPIOB,GPIO_Pin_1);
GPIO_Write(GPIOA,0xf7);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_Write(GPIOA,table[2]);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delayms(2);
}
}