目录
1 5011AS数码管简介
2 5011AS数码管原理
3 设计思路
4 示例源码
1 5011AS数码管简介
数码管是能显示数字和其他信息的一种发光电子器件,每一位数码管分为七段和八段(含小数点DP);而每一段又可以看作是一个发光二极管。5011AS数码管则是一位共阴八段数码管。
2 5011AS数码管原理
5011AS数码管一共有10个引脚(如上左图)1-10每个编号便是一个引脚,除了公共引脚3和8外,每个引脚都对应数码管的一个段(如上右图,除公共端刚好八个段)引脚7对应数码管段A、引脚6对应数码管段B,以此类推......
共阴和共阳:
- 共阴则是公共端3和8接地(GND),其余引脚给一个高电平(3.3v)则点亮低电平则熄灭;
- 共阳则是公共端3和8接高电平(3.3v),其余引脚给一个低电平(GND)则点亮高电平则熄灭;
5011AS数码管是一位共阴八段数码管,所以公共端接地,其他引脚接单片机即可。
3 设计思路
以数码管显示0-9为例:
第一,数码管如果要显示0-9,就要先知道显示(0-9)中每个数字时,哪些段需要点亮哪些段需要熄灭?实现:将八个段按A、B、C、D、E、F、G、DP排序,每个段对应一个位,当位为1时对应的段点亮为0时对应的段熄灭。所以当数码管不显示时,八个段应对应“00000000”,显示0时八个段对应“11111100”,以此类推......
第二,创建一个数组用于将0-9十位数每个段所对应的值存入,数组第1位索引0为对应0,第2位索引1对应1,......,第10位索引9对应9;
第三,创建函数,当需要数码管显示0时就传入0,需要数码管显示1时就传入1。
4 示例源码
smg10.h
#ifndef __SMG10_H #define __SMG10_H #include "stm32f10x.h" /*定义GPIO端口、时钟和引脚宏(可根据需求更改)*/ #define SMG10_GPIO_PORT GPIOA #define SMG10_GPIO_CLOCK RCC_APB2Periph_GPIOA #define SMG10_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 /*定义数码管各段对应的GPIO引脚宏(可根据需求更改)*/ #define SMG10_GPIO_PIN_A GPIO_Pin_5 //数码管段A接PA5 #define SMG10_GPIO_PIN_B GPIO_Pin_4 //数码管段B接PA4 #define SMG10_GPIO_PIN_C GPIO_Pin_2 //数码管段C接PA2 #define SMG10_GPIO_PIN_D GPIO_Pin_1 //数码管段D接PA1 #define SMG10_GPIO_PIN_E GPIO_Pin_0 //数码管段E接PA0 #define SMG10_GPIO_PIN_F GPIO_Pin_6 //数码管段F接PA6 #define SMG10_GPIO_PIN_G GPIO_Pin_7 //数码管段G接PA7 #define SMG10_GPIO_PIN_DP GPIO_Pin_3 //数码管段DP(小数点)接PA3 /*函数定义*/ void SMG10_Init(void); void SMG10_ShowNuber(uint8_t number); #endifsmg10.c
/************************************************************** * 文件名: smg10.c * * 作者: CSDN:拾知_H * * 版本: V1.0 * * 说明: smg10源文件 **************************************************************/ #include "stm32f10x.h" // Device header #include "smg10.h" /*定义数组储存0-9各段取值 0 1 2 3 4 5 6 7 8 9*/ char SMG0_9Num[10][8] = {"11111100", "00001100", "11011010", "11110010", "01100110", "10110110", "10111110", "11100000", "11111110", "11110110"}; /** 函数名字 :SMG10_Init() 函数功能 :数码管初始化 **/ void SMG10_Init(void) { RCC_APB2PeriphClockCmd(SMG10_GPIO_CLOCK, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = SMG10_GPIO_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SMG10_GPIO_PORT, &GPIO_InitStructure); /*默认低电平*/ GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_A, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_B, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_C, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_D, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_E, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_F, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_G, Bit_RESET); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_DP,Bit_RESET); } /** 函数名字 :SMG10_ShowNuber() 函数功能 :数码管显示0-9 **/ void SMG10_ShowNuber(uint8_t number) { GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_A, (BitAction)((uint8_t)SMG0_9Num[number][0] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_B, (BitAction)((uint8_t)SMG0_9Num[number][1] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_C, (BitAction)((uint8_t)SMG0_9Num[number][2] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_D, (BitAction)((uint8_t)SMG0_9Num[number][3] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_E, (BitAction)((uint8_t)SMG0_9Num[number][4] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_F, (BitAction)((uint8_t)SMG0_9Num[number][5] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_G, (BitAction)((uint8_t)SMG0_9Num[number][6] - '0')); GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_DP, (BitAction)((uint8_t)SMG0_9Num[number][7] - '0')); // GPIO_WriteBit(SMG10_GPIO_PORT, SMG10_GPIO_PIN_DP, Bit_SET); //点亮DP(小数点) }示例代码文件下载链接:https://download.csdn.net/download/2502_91794894/92530956
注:以上内容仅个人理解,不具备唯一性和绝对正确性,仅供参考。