- 开发板原理图
上图可以看到数码管是共阳连接,说明给一个低电平的时候数码管的相应段会被点亮。
相关的准备工作和LED总体类似(因为数码管和LED用的线路是相同的都是GPIOC的前八个引脚)
区别只在定义宏的时候将LED_PORT_RCC\LED_PORT\LED_PIN改为SMG_PORT_RCC\SMG_PORT\SMG_PIN即可,其余均完全类似,挂接总线和初始化的管脚操作均类似。
当然为了方便管理和提高程序的可移植性我们还是创建了一个名为SMG的文件夹。(在魔术棒中配置相应的编译路径)。
之后将初始化函数调用到主函数中即可。
以上都是和LED实验的相似点。
之后不同的是,我们用数码管显示一般通过
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
函数。该函数可以对指定的GPIOx进行值写入,也就是批量。通常我们会使用好几段数码管来显示我们的目标。再使用ResetBits和SetBits函数会很繁琐。
此时我们可以将我们要显示的目标转换成数码管中对应的二进制,换算成16进制的数,保存在一个数组当中,之后我们再对数组进行调用即可。
因为数码管分共阳和共阴连接。但是我们不必写两组数组。
我们可只写共阴的数组,若是共阳解法我们就取反,共阴就直接调用即可。
/******************************************************************/
/*******************************主函数部分***********************/
/******************************************************************/
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "smg.h"
unsigned int Number[]=
{
0x3f,//0 --- 0011 1111
0x06,//1 --- 0000 0110
0x5b,//2 --- 0101 1011
0x4f,//3 --- 0100 1111
0x66,//4 --- 0110 0110
0x6d,//5 --- 0110 1101
0x7d,//6 --- 0111 1101
0x07,//7 --- 0000 0111
0x7f,//8 --- 0111 1111
0x6f,//9 --- 0110 1111
0x77,//a --- 0111 0111
0x7c,//b --- 0111 1100
0x39,//c --- 0011 1001
0x5e,//d --- 0101 1110
0x79,//e --- 0111 1001
0x71 //f --- 0111 0001
};
int main()
{
u16 i=0;
SysTick_Init(72);
LED_Init();
SMG_init();
while(1)
{
if(i > 15)
i=0;
GPIO_Write(SMG_PORT,~Number[i]);
delay_ms(1000);
i++;
}
}
/*****************************************/
/*******************smg头文件*************/
/****************************************/
#ifndef _SMG_H
#define _SMG_H
#include "stm32f10x.h"
#define SMG_PORT_RCC RCC_APB2Periph_GPIOC
#define SMG_PORT GPIOC
#define SMG_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
void SMG_init(void);
#endif
/********************************************/
/******************数码管.c文件***************/
/********************************************/
#include "smg.h"
void SMG_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_Init(SMG_PORT,&GPIO_InitStructure);
}
上面的LED函数在上一篇文章中,此处不再重复。
我用了Systick头文件只是引用了里面的delay_ms(times)函数,也可以自己编写,从而可少加一个头文件。
以上就是数码管显示0-f的过程