stm32控制共阳数码管以及共阴数码管

共阳数码管

#include "stm32f10x.h"
u8table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};//共阳数码管0 1 2 3 4 5 6 7 8的编码
void delayms(u16 time)//延时函数 延时1ms
{
         u16i=0;
         while(time--)
         {
                   i=12000;
                   while(i--);
 
         }
}
void Init()
{
         GPIO_InitTypeDefGPIO_InitStructure;  //定义一个管脚初始化的结构体
         //开启PA口时钟
         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);
                            }
                           
         }
}


 

 

 

 

共阴数码管

#include"stm32f10x.h"
u8table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//共阴数码管对应的编码
voiddelayms(u16 time)
{
         u16 i=0;
         while(time--)
         {
                   i=12000;
                   while(i--);
 
         }
}
voidInitStm32()
{
         GPIO_InitTypeDefGPIO_InitStructure;  //定义一个管脚初始化的结构体
         //开启PA口时钟
         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个数码管控制不了,一直显示的是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);
         }
}
关于ODR和IDR的用法:
ODR类似于51的P0口:GPIO_A_ODR=0xff;和GPIO_Write(GPIOA,0xff);有一样的效果
IDR的用法: u8 	value; value=GPIOA->IDR;

模式如果为输入,GPIO_Speed可以不赋值

 
  



你可能感兴趣的:(stm32)