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