首页 > 其他分享 >基于过程单片机CH32、STM32实现TM1640点亮16位共阴极数码管,显示“0~F”数字

基于过程单片机CH32、STM32实现TM1640点亮16位共阴极数码管,显示“0~F”数字

时间:2022-10-30 19:33:35浏览次数:88  
标签:WriteData CH32 16 void 数码管 地址 GPIO TM1640

TM1640入门学习手册

实例1 EgTM1640——【基于CH32V103】

本节我们目标是实现TM1640点亮16位共阴极数码管,显示“0~F”数字;

1 硬件设计

GPIO初始化配置 SCL(PB6) SDA(PB7);开漏输出,通过IO模拟驱动TM1640,TM1640IC驱动有点类似于I2C;

2 软件设计

首先是TM1640初始化TM1640_GPIO_INIT,设置为开漏极输出,如下:

/*********************************************************************
 * @fn      TM1640_GPIO_INIT
 *
 * @brief   Initializes GPIOB.6 GPIOB.7
 *
 * @return  none
 */
void TM1640_GPIO_INIT(void) {

    GPIO_InitTypeDef GPIO_InitStructure = { 0 };

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB, GPIO_Pin_6);//SCL
    GPIO_SetBits(GPIOB, GPIO_Pin_7);//SDA
}

接着设置TM1640,并写入段码

void TM1640_Handle(void)
{
    u8 i;
    TM1640_Generate_START();
    TM1640_WriteData(0x40);//数据命令设置:普通模式,地址自动加一
    TM1640_Generate_STOP();

    TM1640_Generate_START();
    TM1640_WriteData(0xC0);////地址命令设置:初始地址00H
    for(i=0;i<16;i++)  //发送16位显示数据
    {
        TM1640_WriteData(CODE[i]);
    }
    TM1640_Generate_STOP();

    TM1640_Generate_START();
    TM1640_WriteData(0x8c);    //显示控制:显示开,脉冲宽度设为11/16
    TM1640_Generate_STOP();
    Delay_Ms(10);

}

3 下载验证

显示"0~F";

image

实例2 EgTM1640——【基于STM32F103】

本节我们目标是实现TM1640点亮16位共阴极数码管,显示“0~F”数字;

1 硬件设计

GPIO初始化配置 SCL(PB6) SDA(PB7);开漏输出,通过IO模拟驱动TM1640,TM1640IC驱动有点类似于I2C;

TM1640概述

TM1640 是一种LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。本产品性能优良,质量可靠。主要应用于电子产品LED显示屏驱动。采用SOP28、SSOP28的封装形式。

特性说明
  • 采用CMOS工艺
  • 显示模式(8 段×16 位)
  • 辉度调节电路(占空比 8 级可调)
  • 两线串行接口(SCLK,DIN)
  • 振荡方式:内置RC振荡
  • 内置上电复位电路
  • 封装形式:SOP28、SSOP28
管脚定义:

image-20221028215534932

管脚功能定义:

image-20221028215737311

逻辑电源电压 为5V,SEG 脚驱动拉电流(VDD = 4.5~ 5.5 V、Vo = 0V)为90mA;GRID脚驱动灌电流200 mA;最大时钟频率为1MHz;

接口说明

微处理器的数据通过两线总线接口和 TM1640 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号必须保持不变;只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位在后传输.数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平变为高电平。
指令数据传输过程如下图:

image-20221028221751517

这里我们使用写 SRAM 数据地址自动加 1 模式:

image-20221028221905760

Command1:设置数据
Command2:设置地址
data1~N:传输显示数据(最多 16 字节,不能多写)
Command3:控制显示

数据指令

指令用来设置显示模式和LED 驱动器的状态。
在指令START有效后由DIN输入的第一个字节作为一条指令。经过译码,取最高B7、B6两位比特位以区别
不同的指令。

image-20221028222030939

数据 命令设置:

image-20221028222129480

地址命令设置:

image-20221028222201843

上电时,地址默认设为C0H。
显示数据与芯片管脚以及显示地址之间的对应关系如下表所示:

image-20221028222246762

显示控制 命令

image-20221028222344305

2 软件设计

首先是TM1640初始化MX_GPIO_Init,设置为开漏极输出,如下:


void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);

  /*Configure GPIO pins : PB6 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

接着设置TM1640,并写入段码

void TM1640_Handle(void)
{
    u8 i;
    TM1640_Generate_START();
    TM1640_WriteData(0x40);//数据命令设置:普通模式,地址自动加一
    TM1640_Generate_STOP();

    TM1640_Generate_START();
    TM1640_WriteData(0xC0);////地址命令设置:初始地址00H
    for(i=0;i<16;i++)  //发送16位显示数据
    {
        TM1640_WriteData(CODE[i]);
    }
    TM1640_Generate_STOP();

    TM1640_Generate_START();
    TM1640_WriteData(0x8c);    //显示控制:显示开,脉冲宽度设为11/16
    TM1640_Generate_STOP();
    delay_ms(10);

}

其中,

TM1640_WriteData(0x40);是Command1数据命令设置,普通模式,地址自动加一;

TM1640_WriteData(0xC0);是Command2地址命令设置,初始地址00H;

TM1640_WriteData(CODE[i]);是传输显示数据(最多 16 字节,不能多写);

TM1640_WriteData(0x8c);是Command3控制显示:显示开,脉冲宽度设为11/16

3 下载验证

显示"0~F";

image

标签:WriteData,CH32,16,void,数码管,地址,GPIO,TM1640
From: https://www.cnblogs.com/Li-Share/p/16842004.html

相关文章

  • 10/30 基于SeedUbuntu16.04的缓冲区溢出实验
    sudosysctl-wkernel.randomize_va_space=0gcc-fno-stack-protectorexample.cgcc-zexecstack-otesttest.c/*call_shellcode.c//设置四个寄存器eax,ebx,ecx,ed......
  • Database代做编程辅导:ECS165A Normal Form/BCNF/3NF/4NF
    全文链接:tecdat.cn/?p=29690IntroductionNormalFrom是数据库理论里面最恶心的问题,从1NF到6NF,加上BCNF,DKNF以及UF。有运行结果作参考,做这种理论题简直是受罪,每一题都得反......
  • leetcode-2160-easy
    MinimumSumofFourDigitNumberAfterSplittingDigitsYouaregivenapositiveintegernumconsistingofexactlyfourdigits.Splitnumintotwonewintegers......
  • 浙江理工大学入队200题——16I
    问题I:零基础学C/C++172——猴子选大王题目描述有n只猴子围成一圈,从1~n编号,大家决定从中选出一个大王。经过协商,决定选大王的规则为:从编号为1的猴子开始报数,报到k的猴......
  • CF1622D. Shuffle 题解 组合数学/枚举
    题目链接:​​https://codeforces.com/problemset/problem/1622/D​​题目大意:给定一个长度为\(n\)的01字符串\(s\),你可以对这个字符串进行最多一次操作,该次操作需要选择......
  • 浙江理工大学入队200题——16H
    问题H:零基础学C/C++179——注册账号题目描述在某网站收集了n个人的注册账号,账号类型有身份证号或者QQ号两种。请编程用适当的数据结构保存信息,并统计身份证中男性和女......
  • 浙江理工大学入队200题——16G
    问题G:零基础学C/C++178——成绩统计题目描述兴趣小组收集学员成绩信息,每个学员的成绩有两种表示方法,一种用best、good、poor三种等级来表示,还有一种就是直接用分数来......
  • 浙江理工大学入队200题——16E
    问题E:零基础学C/C++175——身高问题题目描述输入n个学生的信息,每个学生信息包括姓名、身高、学号。请编程输出身高最高的学生的信息。输入第1行一个正整数n,表示学......
  • 浙江理工大学入队200题——16C
    问题C:零基础学C/C++173——桌面窗体重叠题目描述一个windows桌面上的窗体用4个整数定义位置:左边坐标、右边坐标、下边坐标、上边坐标现在,请输入2个窗体的位置信息,判......
  • 浙江理工大学入队200题——16D
    问题D:零基础学C/C++174——作业统计题目描述为了了解学生的课后作业负担情况,需要统计学生连续若干天完成作业所需的总时间。现在,输入某位学生n天完成作业的时间,格式为......