文章目录
一.概要
数码管显示器是一类价格便宜、使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。
二.4位数码管主要参数
1.采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示
2.宽工作电压3.3V到5V
3.PCB板尺寸:0.36英寸:22mm*40mm
4.数码管型号:4位共阳
5.重量:7g
模块接口说明:
1.VCC 电源引脚(3 ~ 5 V)
2.SCLK 移位寄存器时钟
3.RCLK 锁存器时钟
4.DIO 数据输入
5.GND 电源地
三.数码管显示器的工作原理
数码管显示器的工作原理主要通过控制发光二极管(LED)的亮灭来显示数字或其他信息。 这些LED通常被组织成特定的段,通过控制这些段的点亮或熄灭,可以组合出不同的数字和字符。以下是详细的工作原理说明:
1.基本构造与工作方式: 数码管通常由七个或八个LED组成,这些LED被安排成特定的段,如a, b, c, d, e, f, g(对于七段数码管)以及可能还包括一个小数点或dp段。每个LED都有一个引脚,用于控制其亮灭状态。根据公共端的连接方式,数码管可以分为共阴极和共阳极两种类型。
2.共阴极与共阳极数码管: 共阴极数码管的公共端连接到地(GND),而共阳极数码管的公共端连接到正电源(VCC)。这两种类型的数码管在电路连接和控制方式上有所不同,但基本原理相同,即通过控制每个LED的亮灭来显示数字。
3.显示数字的方式: 通过选择性地点亮对应的LED段,可以组合出0到9的数字以及其他一些字符。例如,要显示数字8,需要点亮对应的a, b, c, d, e, f, g段。对于多位数的显示,可以通过级联连接多个数码管或使用动态扫描技术来实现。
数码管动态显示是根据人眼视觉残留的原理,在显示的时候,位选依次选择数码管,然后段选控制数码管显示。这种依次选择依次显示的速度非常快,快到人眼反应不过来,从而使4位数码管上的数字同时显示(只是人眼看上去同时显示)。
四.74HC595芯片介绍
74HC595是8位串行输入并行输出的移位寄存器。其使用场景通常为在调用大量LED灯时会占用大量IO口,导致引脚不足,这时我们使用这类寄存器可以起到减少引脚使用的目的,同时还可以有效控制LED的亮灭。市面上常见移位寄存器有74HC595。
74HC595的11脚,(SRCLK) 移位寄存器时钟引脚,上升沿有效。
74HC595的12脚: (RCLK) 存储寄存器时钟引脚,也是上升沿有效。数据从位移寄存器转移到存储寄存器,也是需要时钟脉冲驱动的,这就是12脚的作用。
1.74HC595芯片内部框图
74HC595的数据来源只有一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。
移位寄存器:
串行输入,已进入的位数据依次下移(所以叫移位寄存器)。
存储寄存器:
存储寄存器是直接和8个输出引脚相通的,将移位寄存器的数据转移到存储寄存器后,QA QB QC QD QE QF QG QH 就可以输出我们开始输入的一个字节的数据。
2.74HC595通讯时序
SRCLK上升沿,移位寄存器中的数据整体后移,并接受新的数据(从SER输入) 高位先行。
RCLK上升沿时,数据从移位寄存器转存带存储寄存器。
五.4位数码管原理图
如电路图所示,图中是4位数码管的电路图,具有两片595驱动芯片,两片595级联在一起,第二片595(U2)是对数码管的8段码进行段码操作,第一片595(U1)是对4位数码管进行位选操作,即选择哪一个数码管进行显示操作。
六.4位数码管显示实验
硬件准备:
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。
用5根杜邦线把模块与开发板相连
板子3.3----模块VCC
板子A4-----模块SCLK
板子A5-----模块RCLK
板子A6-----模块DIO
板子G------模块GND
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加4位数码管驱动相关代码
主要代码
#define uchar unsigned char
unsigned char fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char disbuf[4]={0,0,0,0};
void LED4_Display (void); // LED显示
void LED_OUT(uchar X); // LED单字节串行移位函数
unsigned char LED_0F[17] = //低电平显示
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0x7F,0x7F
};
unsigned char Counter=0;
unsigned long TimeCounter=0;
#define SCLK_PIN GPIO_PIN_4
#define RCLK_PIN GPIO_PIN_5
#define DIO_PIN GPIO_PIN_6
uchar LED[8]; //用于LED的8位显示缓存
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//4位数码管主函数
void LED4_Display (void)
{
unsigned char *led_table; // 查表指针
uchar i;
//显示第1位
led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);//管脚输出低
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);//管脚输出高
//显示第2位
led_table = LED_0F + LED[1];
i = *led_table;
LED_OUT(i);
LED_OUT(0x02);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);
//显示第3位
led_table = LED_0F + LED[2];
i = *led_table&0X7F;//带小数点
LED_OUT(i);
LED_OUT(0x04);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);
//显示第4位
led_table = LED_0F + LED[3];
i = *led_table;
LED_OUT(i);
LED_OUT(0x08);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);
}
//管脚输出控制
void LED_OUT(uchar X)
{
uchar i;
for(i=8;i>=1;i--)
{
if (X&0x80)
{
HAL_GPIO_WritePin(GPIOA, DIO_PIN, GPIO_PIN_SET);
}else
{
HAL_GPIO_WritePin(GPIOA, DIO_PIN, GPIO_PIN_RESET);
}
X<<=1;
HAL_GPIO_WritePin(GPIOA, SCLK_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, SCLK_PIN, GPIO_PIN_SET);
}
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();//初始化1毫秒 Tick
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//外部8M晶振,系统72M主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
LED[0]=1;//数字偏移量
LED[1]=2;
LED[2]=3;
LED[3]=4;
LED[4]=5;
LED[5]=6;
LED[6]=7;
LED[7]=8;
/* USER CODE END 2 */
while(1)
{
LED4_Display();//数码管显示
}
/* USER CODE END 3 */
}
显示效果,显示43.21数字
七.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1O_ACUPT5bFYuOquFnAWLtw
提取码:penk
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
八.小结
在家用电器,DIY电子产品中,LED数码管显示比较常见,LED数码管显示器具有亮度高、寿命长、节能环保、可视角度大等优点。
标签:HAL,LED,PIN,STM32,数码管,源码,寄存器,GPIO From: https://blog.csdn.net/zy2232652/article/details/140628785