通过STM32F1 芯片的IO 口控制板载的一个共阳数码管显示。
! C p4 L4 P* O( @3 {
数码管介绍 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1 位、2 位、3 位、4 位、5 位、6 位、7 位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。 了解LED 数码管的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。LED 数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。下面将介绍常用LED 数码管内部引脚图,如下图所示。
- a! X# _4 ?: W2 }7 E( d. ~# A) T/ ]1 n r/ @* }
如果开发板上使用的是一个共阳数码管,即8 个LED 的阳极全部并联一起引出,阴极分别引出如A、B...DP。如果要让共阳极数码管显示数字0,即对应的段ABCDEF 要点亮即给它低电平,其他的段熄灭即给它高电平 硬件设计 通常数码管模块电路如下图所示。 4 f9 c5 w' Y1 P! r5 A* l/ a
' O3 ]+ m1 p3 Z. B 相同网络标号表示它们是连接在一起的,因此数码管的8 个段选口(A-DP)是连接在STM32 的PC0-7 管脚上,这个和LED 模块电路是共用PC0-7 引脚的,因此控制数码管时也会控制LED,控制LED 也会控制数码管。由于开发板上使用的数码管是共阳,所以要点亮对应的数码管段,需要让PC 引脚输出一个低电平。 本章我们所要实现的功能是让数码管间隔1 秒显示0-F。 软件设计 数码管初始化函数
+ g% g* c) h* H/ X! ?+ p4 s1 d) ^3 `4 V" L% `
在工程中新建smg.c 文件,里面代码如下: - #include "smg.h"
- U6 Y8 d" S1 `' @; b: v - /*************************************************************
6 }; c$ n& [2 R) W* s - * 函数名: SMG_Init0 J( }6 R0 D' N+ D
- * 函数功能: 数码管初始化
, [, T" b5 ?2 ^ - * 输入: 无/ J# A/ j( z; m6 H
- * 输出: 无/ f/ G8 w3 b& K) p
- **************************************************************/
& y+ ], t1 f I& l& | - void SMG_Init()+ a. r; A# E- v
- {
4 C8 y; C* i3 g. Z6 w4 X - GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用
4 U2 u) v$ r4 g2 h8 N4 [1 N - 来初始化GPIO
, |& Q$ Y$ z( z, o% B$ x. Q - /* 开启GPIO 时钟*/1 K% }: s2 W# ?/ R g' u
- RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);3 y6 q3 U; E) E; [0 F
- /* 配置GPIO 的模式和IO 口*/$ R0 D! Z" q8 Y! V
- GPIO_InitStructure.GPIO_Pin=SMG_PIN; //选择你要设置的IO 口& K+ v8 k& L8 G3 Y1 G
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;) _& e. D' Q: J- m. y
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
9 o; B. C, A G - GPIO_Init(SMG_PORT,&GPIO_InitStructure); /* 初始化GPIO */6 e$ X' V+ C) V! J- {
- }
复制代码
6 `, D/ L; i) _: a# l
SMG_Init()函数用来初始化蜂鸣器的端口及时钟,同样的在函数内我们看到有几个参数不是库函数内的,这种情况一般是我们自己定义的宏,通常放在对应的头文件内,我们打开smg.h,可以看到如下代码: - #ifndef _smg_H
3 Z: q" f: G4 m; ~1 N - #define _smg_H
" j" ]1 E& _' e7 @: S - #include "system.h"0 `3 |- K0 Y7 |
- /* 数码管时钟端口、引脚定义*/: f: G, F3 c) N6 Y* P: L9 @
- #define SMG_PORT GPIOC0 A9 Y/ V& L1 s- L6 R5 R
- #define SMG_PIN
$ I: i4 b$ V4 J$ m. X2 N: j% \ - (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_
7 y' x( F! w9 l% s" R - 5|GPIO_Pin_6|GPIO_Pin_7)3 x' E! Y: x( f m8 b) \, W
- #define SMG_PORT_RCC RCC_APB2Periph_GPIOC
8 ^* G; A* k1 A G0 W - void SMG_Init(void);//数码管初始化
- w5 f- |7 K5 K3 I6 j0 q - #endif
复制代码
1 b2 V# b- h$ P3 I+ E
里面就将数码管的GPIO 端口及管脚进行了宏定义,这样做是方便大家移植程序,只需要对这个宏修改就能实现数码管的初始化修改。
2 F. I. A+ R1 v& N- S- z
主函数 我们打开工程中main.c 文件,里面代码如下: - /************************************************************
9 M( K. H( y& u& N$ Y* V* C - * 函数名: main; I/ g! Z2 I. k& b
- * 函数功能: 主函数
5 `4 R4 T* U7 V' G - * 输入: 无9 _5 R" q1 E+ T- R; d
- * 输出: 无- D- C" B' R, r& A* {* S. F+ T
- ************************************************************/
9 o% ?* G5 U4 g( n7 i - int main()
7 z1 M& @& n8 q. I - {% l" W0 X% u" [- l2 x
- u8 i=0;" s8 g3 [6 a4 l- Q! C$ _
- SysTick_Init(72);
6 q4 a0 y8 V1 v, v& N9 D- U - LED_Init();
5 M0 v0 C0 T' V - SMG_Init();
' m/ ?: f' R; E1 |, f - while(1)
/ t6 B# _+ d+ _ - {
# B# P" M& e2 u) R5 C6 Z7 |+ ~' I - for(i=0;i<16;i++)
^) p5 c$ H. M; D1 Z# `( W - {
; ^% C3 F0 {- `! }' k - GPIO_Write(SMG_PORT,(u16)(~smgduan[i]));
" X& s' P5 n% |9 Z# S1 ^ - delay_ms(1000);' c! }1 A# e. N; y A( G8 D
- }; ^1 U0 b" [6 \# @
- }3 o8 U E" j- {7 v( \; o
- }
复制代码
1 u8 Y" W6 d* j5 K$ B
主函数实现的功能比较简单,首先将使用到的外设硬件进行初始化,然后进入while 循环,通过GPIO_Write 库函数将数码管段码数据发送到数码管段选口,我们将0-F 的段码数据存储在smgduan 数组内,这是共阴数码管的段码数据,而我们使用的数码管是共阳,只需要将此数据取反即可。smgduan 数组如下: - //0~F
: U5 m2 O5 V; n3 b7 x - u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
复制代码
$ y; X4 c$ x; k4 p0 ~( |5 S
) F/ D9 r& [% y M# @" ~
|