通过STM32F1 芯片的IO 口控制板载的一个共阳数码管显示。 t) X) j7 \( P5 C- o6 i3 S3 B
数码管介绍 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1 位、2 位、3 位、4 位、5 位、6 位、7 位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。 了解LED 数码管的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。LED 数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。下面将介绍常用LED 数码管内部引脚图,如下图所示。 - {! z. M1 [9 ]4 U9 i
+ l7 O- \1 t) K, Q4 A- Z5 E8 z. `
如果开发板上使用的是一个共阳数码管,即8 个LED 的阳极全部并联一起引出,阴极分别引出如A、B...DP。如果要让共阳极数码管显示数字0,即对应的段ABCDEF 要点亮即给它低电平,其他的段熄灭即给它高电平 硬件设计 通常数码管模块电路如下图所示。
0 t, h3 x5 G! E! ]! c" R3 n( E' i5 B( P% u7 n
相同网络标号表示它们是连接在一起的,因此数码管的8 个段选口(A-DP)是连接在STM32 的PC0-7 管脚上,这个和LED 模块电路是共用PC0-7 引脚的,因此控制数码管时也会控制LED,控制LED 也会控制数码管。由于开发板上使用的数码管是共阳,所以要点亮对应的数码管段,需要让PC 引脚输出一个低电平。 本章我们所要实现的功能是让数码管间隔1 秒显示0-F。 软件设计 数码管初始化函数 3 a+ \' K& V5 }7 P' |& n
' q* P, ?8 E' @/ q% O
在工程中新建smg.c 文件,里面代码如下: - #include "smg.h"
; {5 V2 B1 t0 }/ ?+ N2 o# { - /*************************************************************
8 C7 D Y& J6 _! G: S5 C# d - * 函数名: SMG_Init% Z( Y) u5 S; o" x0 x$ p
- * 函数功能: 数码管初始化
$ \3 ]9 G/ D }& c5 C - * 输入: 无2 i% G Y0 N5 |% Z* v6 F3 Q
- * 输出: 无
! N7 L. s- q1 x% N) E( x+ e - **************************************************************/" N* O7 \% I7 a! P; z" V! F5 T2 @
- void SMG_Init()0 w0 c G+ |5 R$ N, q5 `
- {
2 R, g2 T1 J( Z: Q6 q" R: A - GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用
! b4 I- v. f0 [ - 来初始化GPIO
2 M, m9 L1 u+ d. _' { - /* 开启GPIO 时钟*// G- V& X+ w0 T/ ^
- RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);
6 V. F$ _ H( @% U - /* 配置GPIO 的模式和IO 口*/
/ S: O+ }' o5 t8 V8 P: c4 ]4 J7 C, t; Q - GPIO_InitStructure.GPIO_Pin=SMG_PIN; //选择你要设置的IO 口0 n5 P9 ~+ S! @2 F4 P
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;5 _+ d1 w9 {# |1 i( ~
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;, h+ S" F! g+ h- V, r6 v) `1 N
- GPIO_Init(SMG_PORT,&GPIO_InitStructure); /* 初始化GPIO */+ O5 ^2 [# k1 O1 h2 s% U
- }
复制代码
7 I8 X9 k7 o9 j, A7 u. y0 s* ^
SMG_Init()函数用来初始化蜂鸣器的端口及时钟,同样的在函数内我们看到有几个参数不是库函数内的,这种情况一般是我们自己定义的宏,通常放在对应的头文件内,我们打开smg.h,可以看到如下代码: - #ifndef _smg_H
1 k# A9 n3 n: Y8 X+ H6 n/ ^( O - #define _smg_H
$ x2 @& x0 M0 Z0 p" x - #include "system.h"- o8 f" n5 `# b
- /* 数码管时钟端口、引脚定义*/4 f' l: v# M7 B" \" N
- #define SMG_PORT GPIOC
# Q) D. E, d, L5 O# f A- o - #define SMG_PIN
: V; B4 \; v# U - (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_
5 v( R/ t$ j3 N5 o/ y5 w - 5|GPIO_Pin_6|GPIO_Pin_7)% w) I- J t$ Q- D) I9 J9 S
- #define SMG_PORT_RCC RCC_APB2Periph_GPIOC
( ~7 E9 G( F- m6 P9 Z - void SMG_Init(void);//数码管初始化
8 F/ `% p L3 P. L9 V/ J8 C8 S - #endif
复制代码) T% t. r. \7 e; Y" u
里面就将数码管的GPIO 端口及管脚进行了宏定义,这样做是方便大家移植程序,只需要对这个宏修改就能实现数码管的初始化修改。
]% F9 t' @- A2 S* A; t
主函数 我们打开工程中main.c 文件,里面代码如下: - /************************************************************5 b3 R1 g% M& T1 L- b
- * 函数名: main
1 ?- m7 {- B. w+ l8 a - * 函数功能: 主函数) m5 r5 v" c `4 W. @8 [" j! J$ n2 F
- * 输入: 无1 S1 E' X T" x
- * 输出: 无( M- [: C( N0 k
- ************************************************************/# J/ t' Y! q: ?7 }4 W) k/ u
- int main()0 f+ y4 G* z( o- O+ x/ j0 k
- {7 J) Q5 J: H5 d7 w( k
- u8 i=0;
. Q( G! s0 f% P3 `* d, H - SysTick_Init(72);% E2 |9 w- k9 l- g
- LED_Init();3 u7 C( W* u! z) }0 S
- SMG_Init();
; B, G( ^9 ^! z6 m+ k8 O - while(1)% g$ \( ?* l+ X5 Y/ ?% R
- {2 V, C' K' Y1 H' s! o7 v
- for(i=0;i<16;i++)& d; _% |, B5 W5 L, F
- {
9 y( `) N6 o% ^ - GPIO_Write(SMG_PORT,(u16)(~smgduan[i]));
6 T) U, f+ s: {' i a; E1 t6 p - delay_ms(1000);) I& c3 T% Y5 m+ o% s
- }$ w, g( Q( {; ]' ]$ `% b
- }2 R/ j- c: Y+ g* ~, U
- }
复制代码3 d) |9 ?/ a# w. ^1 @2 M* I
主函数实现的功能比较简单,首先将使用到的外设硬件进行初始化,然后进入while 循环,通过GPIO_Write 库函数将数码管段码数据发送到数码管段选口,我们将0-F 的段码数据存储在smgduan 数组内,这是共阴数码管的段码数据,而我们使用的数码管是共阳,只需要将此数据取反即可。smgduan 数组如下: - //0~F
" j4 E1 {2 J$ y. ]. ] - u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
复制代码
, L2 S# |3 @$ K) y' L
: B8 w3 W0 B( X; {/ g/ K, `. s! D
|