TM1620 6位数码管驱动程序,基于国产CH32V003F4P6

该代码是用于STM32平台的TM1620数码管驱动程序,包括`main.c`主函数,`debug.h`中定义的延时和串口打印函数,以及`smg.c/h`中TM1620的配置和显示函数。程序初始化GPIO并设置数码管显示,提供了全屏显示和分段显示数字的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

main.c

#include "debug.h"
#include "smg.h"



/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    SMG_CFG();

    SMG_display (123456);

    while (1)
    {

    }
}

debug.h

#ifndef __DEBUG_H
#define __DEBUG_H

#ifdef __cplusplus
 extern "C" {
#endif

#include <ch32v00x.h>
#include <stdio.h>

/* UART Printf Definition */
#define DEBUG_UART1    1

/* DEBUG UATR Definition */
#ifndef DEBUG
#define DEBUG   DEBUG_UART1
#endif

void Delay_Init(void);
void Delay_Us(uint32_t n);
void Delay_Ms(uint32_t n);
void USART_Printf_Init(uint32_t baudrate);

#ifdef __cplusplus
}
#endif

#endif /* __DEBUG_H */

TM1620驱动代码

smg.c


#include "debug.h"
#include "smg.h"


uchar SMG_CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void SMG_CFG(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);

    GPIO_InitStructure.GPIO_Pin = TM1620_CLK_Pin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(TM1620_CLK_GPIO, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = TM1620_STB_Pin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(TM1620_STB_GPIO, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = TM1620_DIN_Pin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(TM1620_DIN_GPIO, &GPIO_InitStructure);

}




void send_8bit(uchar dat)    //发送8位数据
{
  uchar i;
  for(i=0;i<8;i++)
  {
      CLR_CLK;
    if(dat&0x01)
        SET_DIN;
    else
        CLR_DIN;

    __NOP();
    SET_CLK;
    dat>>=1;
  }
  CLR_CLK;
  CLR_DIN;
}



void send_command(uchar com)  //发送命令字节
{
 SET_STB;                       //STB置高
 __NOP();
 CLR_STB;                       //STB置低
 send_8bit(com);                      //发送8bit数据
}


void displayall(uchar data)   //显示函数
{
    uchar i;
    send_command(0x02);     //6位8段模式
    send_command(0x40); //设置数据命令
    send_command(0xc0); //设置显示地址

    for(i=0;i<14;i++)
    {
      send_8bit(data);      //发送数据
     }
     send_command(0x8F);        //设置显示命令,设置占空比

     SET_STB;
}

/**********************************************
 send_command(0x02);    //设置显示模式
 send_command(0x44);    //设置数据命令,固定模式
 send_command(0xc0);    //设置显示地址
 send_8bit(0x3f);       //从00H开始,偶数地址送显示数据
 send_command(0x8F);    //设置显示命令,打开显示并设置占空比14/16.
 SET_STB;               //开显示
*******************************************************/
void SMG_display (unsigned long num)
{
    uchar i;
    uchar temp[6];
           temp [5]= num%1000000/100000 ;
           temp [4]= num%100000/10000 ;
           temp [3]= num%10000/1000 ;
           temp [2]= num%1000/100 ;
           temp [1]= num%100/10 ;
           temp [0]= num%10 ;

      send_command(0x02);    //设置显示模式,
      send_command(0x44);    //设置数据命令,采用地址固定模式

      for(i=0;i<6;i++)
      {
          if (i == 0)
          {send_command(0xca);}     //第6位
          else if (i == 1)
          {send_command(0xc8);}     //第5位
          else if (i == 2)
          {send_command(0xc6);}     //第4位
          else if (i == 3)
          {send_command(0xc4);}     //第3位
          else if (i == 4)
          {send_command(0xc2);}     //第2位
          else if (i == 5)
          {send_command(0xc0);}     //第1位


          send_8bit(SMG_CODE[temp[i]]);  //发送数据
          send_command(0x8F);       //设置显示命令,打开显示并设置占空比14/16.
          SET_STB;
      }

}




smg.h

#ifndef __smg_H
#define __smg_H

typedef unsigned char uchar;


#define TM1620_CLK_GPIO     GPIOD
#define TM1620_CLK_Pin      GPIO_Pin_3

#define TM1620_STB_GPIO     GPIOD
#define TM1620_STB_Pin      GPIO_Pin_2

#define TM1620_DIN_GPIO     GPIOD
#define TM1620_DIN_Pin      GPIO_Pin_4




#define SET_STB     GPIO_WriteBit(TM1620_STB_GPIO,TM1620_STB_Pin,Bit_SET)
#define CLR_STB     GPIO_WriteBit(TM1620_STB_GPIO,TM1620_STB_Pin,Bit_RESET)

#define SET_DIN     GPIO_WriteBit(TM1620_DIN_GPIO,TM1620_DIN_Pin,Bit_SET)
#define CLR_DIN     GPIO_WriteBit(TM1620_DIN_GPIO,TM1620_DIN_Pin,Bit_RESET)

#define SET_CLK     GPIO_WriteBit(TM1620_CLK_GPIO,TM1620_CLK_Pin,Bit_SET)
#define CLR_CLK     GPIO_WriteBit(TM1620_CLK_GPIO,TM1620_CLK_Pin,Bit_RESET)


void SMG_CFG(void);
void displayall(uchar data);
void SMG_display (unsigned long num);


#endif /* __smg_H */

新增数码管显示函数

基于公司产品开发,数码管位可能不一样,可根据自身需要更改,这里给一个参考

//数码管1,后三位
void SMG_display_1 (unsigned long num)
{
    uchar i;
    uchar temp[3];

           temp [2]= num%1000/100 ;
           temp [1]= num%100/10 ;
           temp [0]= num%10 ;

      send_command(0x02);    //设置显示模式,
      send_command(0x44);    //设置数据命令,采用地址固定模式

      for(i=0;i<3;i++)
      {
          if (i == 0)
          {send_command(0xca);}     //第6位
          else if (i == 1)
          {send_command(0xc8);}     //第5位
          else if (i == 2)
          {send_command(0xc6);}     //第4位

          send_8bit(SMG_CODE[temp[i]]);  //发送数据
          send_command(0x8F);       //设置显示命令,打开显示并设置占空比14/16.
          SET_STB;
      }

}



//数码管2,前三位
void SMG_display_2 (unsigned long num)
{
    uchar i;
    uchar temp[3];
               temp [2]= num%1000/100 ;
               temp [1]= num%100/10 ;
               temp [0]= num%10 ;

      send_command(0x02);    //设置显示模式,
      send_command(0x44);    //设置数据命令,采用地址固定模式

      for(i=0;i<3;i++)
      {
          if (i == 0)
          {send_command(0xc4);}     //第3位
          else if (i == 1)
          {send_command(0xc2);}     //第2位
          else if (i == 2)
          {send_command(0xc0);}     //第1位

          send_8bit(SMG_CODE[temp[i]]);  //发送数据
          send_command(0x8F);       //设置显示命令,打开显示并设置占空比14/16.
          SET_STB;
      }

}

### CH32V003F4P6 单片机 ADC 使用教程 #### 硬件概述 CH32V003系列基于RISC-V指令集架构设计,具有高性能、低功耗的特点。该系列中的CH32V003F4P6型号配备了一个12精度的模数转换器(ADC),支持多通道输入并具备灵活的工作模式配置能力[^2]。 #### 软件环境搭建 为了顺利开发针对此款MCU的应用程序,在开始编写具体功能之前需先完成必要的软件工具链安装工作。推荐采用官方提供的集成开发环境IDE以及配套库文件来简化项目创建过程。对于遇到编译错误的情况,如`make: *** No rule to make target...Stop.`提示,则可能是由于路径设置不当或是缺少某些依赖项所致[^3]。 #### 初始化配置 在使用ADC前要对其进行初始化操作,主要包括但不限于设定采样时间、选择触发源等参数。下面给出一段简单的C语言代码片段用于展示如何实现上述目的: ```c #include "ch32v003.h" void ADC_Init(void){ // 使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 配置GPIO端口作为模拟输入 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // 设置ADC分辨率及扫描方向 ADC_InitTypeDef ADC_InitStruct; ADC_StructInit(&ADC_InitStruct); // 默认参数填充 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStruct); // 开启ADC模块 ADC_Cmd(ADC1, ENABLE); } ``` #### 数据采集流程 当一切准备就绪之后就可以调用相应API函数来进行实际的数据读取了。这里提供一个完整的测量电压值的例子供参考学习之用: ```c uint16_t Read_Voltage(void){ uint16_t adc_value; // 启动一次转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换结束标志被置 // 获取转换后的数值 adc_value = ADC_GetConversionValue(ADC1); return adc_value; } int main(){ ADC_Init(); while (1) { printf("Voltage Value:%d\n",Read_Voltage()); Delay_ms(1000); // 延迟一秒再重复执行 } } ``` 通过以上介绍可以了解到关于CH32V003F4P6单片机上ADC组件的基础应用方法。当然这只是一个入门级别的指导材料,更多高级特性和优化技巧还需要读者自行深入探索研究。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值