stm32控制共陽(yáng)數(shù)碼管以及共陰數(shù)碼管
共陽(yáng)數(shù)碼管
#include "stm32f10x.h"
u8table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};//共陽(yáng)數(shù)碼管0 1 2 3 4 5 6 7 8的編碼
void delayms(u16 time)//延時(shí)函數(shù) 延時(shí)1ms
{
u16i=0;
while(time--)
{
i=12000;
while(i--);
}
}
void Init()
{
GPIO_InitTypeDefGPIO_InitStructure; //定義一個(gè)管腳初始化的結(jié)構(gòu)體
//開啟PA口時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//配置PAO的模式
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);
}
int main(void)
{
Init();
while(1)
{
inti;
for(i=0;i<9;i++)
{
GPIO_Write(GPIOA,table[i]);
delayms(200);
}
}
}
共陰數(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);
}
}
關(guān)于ODR和IDR的用法:
ODR類似于51的P0口:GPIO_A_ODR=0xff;和GPIO_Write(GPIOA,0xff);有一樣的效果
IDR的用法: u8 value; value=GPIOA->IDR;
模式如果為輸入,GPIO_Speed可以不賦值