[其他ST产品] STM32-GPIO数码管动态显示

[复制链接]
 楼主| 米多0036 发表于 2023-8-26 18:08 | 显示全部楼层 |阅读模式
一、数码管原理
知道这一部分的朋友可以直接点击目录部分跳过这段跳过,这里介绍一下数码管的知识

1、LED数码管的结构
不管在嵌入式STM32中还是在单片机51中,我们经常采用LED数码管来显示我们系统的状态、运算结果等各种信息,LED数码管是机器和人对话的一种重要的输出设备。

8984964e9cf03841d4.png
单个LED数码管的外形和内部结构如上图所示。LED数码管由8个发光二极管组成,通过不同的发光字段组合可以显示数字(0~9)、字符(A~F、H、L、P、R、U、Y、符号"——"及小数点"."等)。

按照内部8个发光二极管的连接方式的不同,LED数码管可以分为共阳极与共阴极俩种,上图有结构图。


评论

———————————————— 版权声明:本文为CSDN博主「学c入门到入土」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/pangyujinqwe/article/details/125012848  发表于 2023-8-26 18:08
 楼主| 米多0036 发表于 2023-8-26 18:08 | 显示全部楼层
2、LED数码管工作原理
这里以共阳极LED数码管为例来阐述具体在单片机上的工作原理。

要使数码管显示数字或者字符,直接将相应的数字或者字符送入数码管的段控制端是不行的,必须使段控制端输出相应的字符编码。
 楼主| 米多0036 发表于 2023-8-26 18:09 | 显示全部楼层
如上图所示,八个发光二极管的阳极连接在一起,作为公共端(我们喜欢说位选端)阴极作为”段“控制端(我们说段选端)。

1)当公共端(位选端)接低电平时,所以二极管截止,不发光。
 楼主| 米多0036 发表于 2023-8-26 18:09 | 显示全部楼层
2)当公共端(位选端)接高电平时,当某段控制端为高电平,该段的发光二级管导通并点亮。通过点亮不同的段,显示不同的字符。如显示数字1时,b、c俩段接低电平其他段接高电平。
 楼主| 米多0036 发表于 2023-8-26 18:09 | 显示全部楼层
共阴极LED数码管与共阳极类似,这个里就不在进行介绍了。
 楼主| 米多0036 发表于 2023-8-26 18:09 | 显示全部楼层
这里给出共阳与共阴极数码的显示字形编码:

7966264e9cf70aac49.png
 楼主| 米多0036 发表于 2023-8-26 18:10 | 显示全部楼层
3、数码管动态显示
1)动态显示的概念
动态显示是一种按位轮流点亮各位数码管的显示方式,即在某一时段,只让其中一位数码管的位选端有效,并送出相对应的字形显示编码。此时其他位数码管因位选端无效而处于熄灭状态。下一时端按顺序选通另一位数码管,并送出相对应的字形编码显示,按照此规律进行下去,即可使各位数码管分别间断的显示出相应的字符。虽然在同一时刻只有一位数码管点亮,但利用人眼的视觉暂留效应和发光二极管熄灭时的余晖效应,看到的确是多为数码管同时点亮显示,这个过程被称为动态扫描显示。
 楼主| 米多0036 发表于 2023-8-26 18:10 | 显示全部楼层
2)动态显示的接口
数码管的所有段选端共用一个8位的I/O端口,而每个数码管的位选端要占用一根I/O线,因此,n位动态显示数码管只占用一个8位的I/O端口和n根I/O线。显示n位数码时,连接段选的8位I/O端口依次送出n位数码的段码数据。同时,依次控制相应位公共端,当公共端电平位”0“(共阴极)或者”1“(共阳极)时,该位数码管点亮。

到这预备知识介绍完了现在开始写代码了
 楼主| 米多0036 发表于 2023-8-26 18:10 | 显示全部楼层
二、代码的实现
我们使用固件库编程,首先我们需要一个工程模板
LED头文件
  1. #ifndef _LED_H_         //判断标号_LED_H_是否被定义,如果没有则#ifndef到#endif代码有效
  2. #define _LED_H_

  3. #include <stm32f10x.h>

  4. #define LED_GPIO_PORT        GPIOC                  
  5. //数码管的GPIO端口

  6. #define LED_GPIO_CLK         RCC_APB2Periph_GPIOC   
  7. //数码管相对应的时钟端口开启

  8. #define LED_GPIO_PIN         GPIO_Pin_All            
  9. //数码管的GPIO引脚号,All表示当前GPIOx的全部引脚

  10. #define uchar unsigned char                          //给无符号字符型宏定义一个别名
  11. #define uint unsigned int                            //给无符号整型宏定义一个别名

  12. void LED_GPIO_Config(void);                             //数码管GPIO端口初始化函数

  13. void delay_ms(uint ms);
  14. //延时函数

  15. #endif
 楼主| 米多0036 发表于 2023-8-26 18:10 | 显示全部楼层
LED.C文件
  1. #include "led.h"

  2. void LED_GPIO_Config(void)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.         /*定义一个GPIO_InitTypeDef类型的结构体*/

  6.           RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
  7.         /*开启数码管相关的GPIO外设时钟*/

  8.           GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  9.         /*设置引脚模式为通用推挽输出*/

  10.           GPIO_InitStructure.GPIO_Pin=LED_GPIO_PIN;
  11.         /*选择要控制的引脚*/

  12.           GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  13.         /*设置引脚速率为50MHz*/

  14.           GPIO_Init(LED_GPIO_PORT,&GPIO_InitStructure);
  15.         /*调用库函数初始化GPIO*/
  16. }

  17. void delay_ms(uint ms)  //延时函数
  18. {
  19.         unsigned int i,j;
  20.         for(i=ms;i>0;i--)
  21.                 for(j=110;j>0;j--);
  22. }
 楼主| 米多0036 发表于 2023-8-26 18:11 | 显示全部楼层
main.C文件
  1. #include "led.h"
  2. uchar LED_AC_table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  3. //共阳极数码编码
  4. int main()
  5. {
  6.         LED_GPIO_Config();   //调用数码管GPIO外设初始化
  7.         uint j=0x0100;       //这里是个算法变量的函数,这里就不展开讨论
  8.         while(1)
  9.         {
  10.                 for(int i=0;i<6;i++)   //循环选段
  11.                 {
  12.                         delay_ms(50);        //延时
  13.                         GPIO_Write(LED_GPIO_PORT,LED_AC_table1[i]+j);  //固件库函数选位输出相对应的字符
  14.                         if(j==0x2000)                                  //算法
  15.                         {
  16.                                 j=0x0100;
  17.                         }
  18.                         else
  19.                         {
  20.                                 j<<=1;
  21.                         }
  22.                 }
  23.         }       
  24. }
 楼主| 米多0036 发表于 2023-8-26 18:11 | 显示全部楼层
在仿真之前我们看一下我们又一个新的固件库函数
2317164e9cfd3d2e26.png
 楼主| 米多0036 发表于 2023-8-26 18:11 | 显示全部楼层
三、仿真结果展示
接下来让我们看看Proteus 仿真的结果吧

8431364e9cfe039ff4.png
 楼主| 米多0036 发表于 2023-8-26 18:12 | 显示全部楼层
关注我下面我会继续更新GPIO外设输入输出的实际小程序,来帮助大家更好的理解GPIO外设的功能,后面还会更新STM32的所有特色外设。

houcs 发表于 2023-8-26 23:10 | 显示全部楼层
必须使段控制端输出相应的字符编码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

136

主题

1429

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

136

主题

1429

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部