环境:Proteus8.9 MDK5
选用的MCU是STM32F103C6。共阴极的八段数码管。
仿真电路图如下:
MCU的Crystal Frequency设置成72M。
需要注意的是要把排阻的Mode Type设置为ANALOG。不然显示数据时2 3两根连线一直处于高电平。
代码部分:
定义一个数码管显示的数组:
uint8_t SEG_CODE[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
初始化GPIOB端口的低八位引脚。
void GPIOB_init()
{
GPIO_InitTypeDef LED_GPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PC端口时钟
LED_GPIO.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
LED_GPIO.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
LED_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&LED_GPIO);
GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
主函数:
void Delay_ms(int time)//延时函数
{
time*=1000;
while(time--);
}
int main(void)
{
int i=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
GPIOB_Init();
GPIOB->CRL=0X33333333; //控制低8位的输出
while(1)
{
for( i= 0;i<10;i++)
{
GPIO_Write(GPIOB,SEG_CODE[i]);
Delay_ms(1000);
}
}
return 0;
}
完整代码:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include <stdio.h>
uint8_t SEG_CODE[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void GPIOB_init()
{
GPIO_InitTypeDef LED_GPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PC端口时钟
LED_GPIO.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
LED_GPIO.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
LED_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&LED_GPIO);
GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
void Delay_ms(int time)//延时函数
{
time*=1000;
while(time--);
}
int main(void)
{
int i=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
GPIOB_Init();
GPIOB->CRL=0X33333333; //控制低8位的输出
while(1)
{
for( i= 0;i<10;i++)
{
GPIO_Write(GPIOB,SEG_CODE[i]);
Delay_ms(1000);
}
}
return 0;
}
最终的效果图