数码管基础知识参考:

51单片机外设篇:数码管_路溪非溪的博客-CSDN博客_csdn数码管

实现功能

1、上电后,数码管每隔50ms计数;

2、触摸按键1调节数码管亮度。

原理图

根据原理图很容易就能看出来,左边的是段选信号,右边的是位选信号。

对应的驱动电路如下:

用的是芯片TM1602,输入端接到了PC0/PC1/PC2

编程的重点在于理解TM1602芯片。

我们在编程时,需要将TM1602的属性和操作进行封装,然后再使用。

MX配置

配置PC0/PC1/PC2三个端口为输出模式即可。

别忘了标签名。

程序编写

本文的程序编写并不涉及到新的HAL库内容,而是对芯片TM1602的封装。

有助于对底层HAL库封装的理解。

TM1602数据手册

具体自行查看数据手册,此处仅放置关键内容。

TM1620是一种LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动等电路。

手册里大部分内容还可以理解,但是关于“显示寄存器地址”表,表示很难理解:

这啥意思?

这里我不明白的是为什么要每个地址都要写两次。。。。还非得写00HL和00HU,直接整个8位一起写00H不行吗?

横向表示显示寄存器的地址,也就是位选所对应的地址。数码管位选端和哪个GRID绑定了,对应数码管就和哪个显存对应了,后面就会从对应显存里拿数据来显示。

封装

新建两个文件display.h和display.c,用于封装数码管操作。

display.h

#ifndef _DISPLAY_H_
#define _DISPLAY_H_#include <stdint.h>//显示模式
typedef enum
{DI4_SEG10 = 0x00,DI5_SEG9 = 0x01,DI6_SEG8 = 0x02
} display_mode;//数据读写模式
typedef enum
{DATA_MODE = 0x40,AUTO_ADDR_INC = 0x40,FIXED_ADDR = 0x44,NORMAL_MODE = 0x40,TEST_MODE = 0x48
} wr_mode;//显示控制
typedef enum
{LIGHTNESS_1 = 0x88,LIGHTNESS_2 = 0x89,LIGHTNESS_3 = 0x8A,LIGHTNESS_4 = 0x8B,LIGHTNESS_5 = 0x8C,LIGHTNESS_6 = 0x8D,LIGHTNESS_7 = 0x8E,LIGHTNESS_8 = 0x8F,DIS_DISPLAY = 0x80,EN_DISPLAY = 0x88
} display_ctrl_mode;//地址设置
typedef enum
{GRID1 = 0xC0,GRID1_EX = 0xC1,GRID2 = 0xC2,GRID2_EX = 0xC3,GRID3 = 0xC4,GRID3_EX = 0xC5,GRID4 = 0xC6,GRID4_EX = 0xC7,GRID5 = 0xC8,GRID5_EX = 0xC9,GRID6 = 0xCA,GRID6_EX = 0xCB
} grid_sel;//输出哪个数字,默认不带小数点
typedef enum
{ZERO = 0x3F,ONE = 0x06,TWO = 0x5B,THREE = 0x4F,FOUR = 0x66,FIVE = 0x6D,SIX = 0x7D,SEVEN = 0x07,EIGHT = 0x7F,NINE = 0x6F
} display_num;//是否输出小数点
typedef enum
{NO,YES
} is_point;typedef struct
{display_ctrl_mode lightness;void (*display)(grid_sel, display_num, is_point);void (*changeLightness)(void);void (*disDisplay)(void);
} display_haldler;extern display_haldler displayHaldler;#endif

display.c

#include "myapplication.h"#define STB_SET        HAL_GPIO_WritePin(TM1602_STB_GPIO_Port, TM1602_STB_Pin, GPIO_PIN_SET);
#define STB_RESET      HAL_GPIO_WritePin(TM1602_STB_GPIO_Port, TM1602_STB_Pin, GPIO_PIN_RESET);
#define CLK_SET        HAL_GPIO_WritePin(TM1602_CLK_GPIO_Port, TM1602_CLK_Pin, GPIO_PIN_SET);
#define CLK_RESET      HAL_GPIO_WritePin(TM1602_CLK_GPIO_Port, TM1602_CLK_Pin, GPIO_PIN_RESET);
#define DIN_WRITE(x)   HAL_GPIO_WritePin(TM1602_DIN_GPIO_Port, TM1602_DIN_Pin, (x));static void Display(grid_sel gridSel, display_num displayNum, is_point isPoint);
static void ChangeLightness(void);
static void DisDisplay(void);display_haldler displayHaldler =
{LIGHTNESS_1,Display,ChangeLightness,DisDisplay
};//最底层时序操作
static void Display_Write(uint8_t dataWrited)
{uint8_t i = 0;STB_RESET;for(i; i<8; i++){CLK_RESET;DIN_WRITE(dataWrited & 0x01);CLK_SET;dataWrited >>= 1;}
}static void Display_Init(void)
{Display_Write(DI6_SEG8);STB_SET;Display_Write(FIXED_ADDR);STB_SET;
}static void Display(grid_sel gridSel, display_num displayNum, is_point isPoint)
{Display_Init();Display_Write(gridSel);if(isPoint == YES){Display_Write(displayNum + 0x80);  }else{Display_Write(displayNum);}STB_SET;Display_Write(EN_DISPLAY);STB_SET;
}
static void ChangeLightness(void)
{if(displayHaldler.lightness > LIGHTNESS_8){displayHaldler.lightness = LIGHTNESS_1;}Display_Write((displayHaldler.lightness)++);
}static void DisDisplay(void)
{Display_Write(DIS_DISPLAY);
}

完成了TM1602的底层封装,以及数码管的操作封装。

封装时一定要注意严格按照时序操作。

比如说上面红框中的地方,并不是每个字节传输完成后就拉高STB,所以不能在每次写字节函数中拉高STB,而是要把拉高STB的操作留给外层。要注意,拉高的时机,有的地方是一个字节后就拉高,有的地方是两个字节或者多个字节后再拉高。当然,字节传输函数中可以拉低STB,相比放外面更方便些。

如果要实现多个数码管同时显示,可以通过扫描实现,结合位选操作即可。

如果要不同数码管各显示个十百千万,可通过整除和取余来实现,比如:

//数码管显示计数值
Display.Disp(Disp_NUM_1,Cnt%10,      Disp_DP_OFF); //个位
Display.Disp(Disp_NUM_2,Cnt/10%10,   Disp_DP_OFF); //十位
Display.Disp(Disp_NUM_3,Cnt/100%10,  Disp_DP_OFF); //百位
Display.Disp(Disp_NUM_4,Cnt/1000%10, Disp_DP_OFF); //千位
Display.Disp(Disp_NUM_5,Cnt/10000%10,Disp_DP_OFF); //万位
Display.Disp(Disp_NUM_6,Cnt/100000,  Disp_DP_OFF); //十万位

时间关系,不再赘述。后面有时间再完善。

STM32实战总结:HAL之数码管相关推荐

  1. STM32实战总结:HAL之电机

    电机基础知识参考: 51单片机外设篇:电机_路溪非溪的博客-CSDN博客 无刷电机和有刷电机 先详细了解有刷电机: 带你了解(有刷)电机工作原理_哔哩哔哩_bilibili 再详细了解无刷电机: 无刷 ...

  2. STM32实战总结:HAL之GUI

    在TFT上简单的显示字符.数字.汉字.图形.图片等,都是一些简单的显示.如果想要进行较为复杂的显示,就推荐使用GUI. 市面上常见的嵌入式GUI有LVGL,emWin(ucGUI),TouchGFX, ...

  3. STM32实战(1):搭建模板工程

    " 从今天起我会更新一个STM32实战系列教程,以STM32F103RCT6核心板为例由浅至深的向大家介绍嵌入式软件开发的学习过程,计划是先从最基础的搭建工程开始,到裸机开发,再到各种中间件 ...

  4. 【STM32实战】机械臂快递分拣系统(一)——机械臂控制程序(下位机)编写

    [STM32实战]机械臂快递分拣系统(一)--机械臂控制程序(下位机)编写 前言 题目分析 工程模板生成 蓝牙模块的使用 蓝牙接收数据解析与机械臂控制 测试 前言 近期回校上最后一门课,刚好是做机械臂 ...

  5. STM32实战 1 | STM32Cube生态系统认识与介绍

    STM32实战 1 | STM32Cube生态系统认识与介绍 一.STM32Cube Ecosystem STM生态系统 二.PC软件工具套 三.STM32Cube MCU Packages(STM3 ...

  6. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  7. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  8. 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)

    [STM32笔记]HAL库低功耗模式配置(ADC唤醒无法使用.低功耗模式无法烧录解决方案) [STM32笔记]低功耗模式配置及避坑汇总 一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需 ...

  9. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  10. STM32实战六 PWM加移相正交

    这一章编写PWM程序,使用TIM3以两个通道,完全映射到PC6和PC7,除普通PWM输出外,增加移相正交PWM功能,为后面的编码器计数模式提供信号源. PWM.h #ifndef __PWM__ #d ...

最新文章

  1. KEGG功能注释工具 KofamKOALA 安装与使用
  2. sfdisk命令的使用技巧
  3. 计算机辅助药物合成投什么期刊,中国药物化学杂志审稿快吗
  4. ansible安装部署和配置、常用模块整理
  5. phpstrom 代码格式
  6. DJANGO MODELS通过DATETIMEFIELD保存到MYSQL的时间的时区问题
  7. 2022最新Spring相关大厂常问技术面试题大全 —— 金三银四好时机
  8. linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程
  9. 基于Java、Kafka、ElasticSearch的搜索框架的设计与实现
  10. JavaScript中的innerHTML,innerHTML,value属性
  11. 千万不能干的事(文摘)
  12. 浅谈算法——莫比乌斯反演
  13. 悄悄安装vcredist_x64.exe,不弹出对话框
  14. 扬州大学2022年858程序设计与数据结构试题参考答案
  15. 计算机密码突然不正确,win10开机密码明明正确,win10密码突然不对了
  16. ZED 视频 SVO 转换 其他格式
  17. win7旗舰版恢复出厂设置没有修复计算机,教你win7旗舰版怎么恢复出厂设置
  18. 案例分享:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)
  19. 阻滞增长模型求解_阻滞增长模型研究解读.ppt
  20. 不伤原图电脑在线去水印网站

热门文章

  1. IE无法打开internet网站已终止操作的解决的方法
  2. Gradle基础教程
  3. 如何利用微博热门提高引流效率
  4. 软件工程之系统架构图和系统架构描述
  5. mysql 读写分离 事务_mysql 读写分离(基础篇)
  6. 批量保存网页_一键保存网页图片!macOS自带神器,比《快捷指令》还好用
  7. 幼儿编程Scratch第31讲:垃圾车-乐高入门机器人-WeDo
  8. LAMP一键安装包是什么?
  9. 基于FPGA的OV5640摄像头驱动
  10. 12,jesd204b实战操作笔记