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

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;
      }

}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值