12段8位驱动芯片TM1629D驱动12位8段共阳数码管

4 篇文章 2 订阅

【本文发布于https://blog.csdn.net/Stack_/article/details/114379996,未经许可不得转载,转载须注明出处】


在这里插入图片描述

参考官方手册共阳接法画出原理图(SMG1、SMG2、SMG4从左到右排列,定义从左到右的数码管为第0个 - 第11个)




/* 字模 @ CSDN Tyrion.Mon */
const uint8_t char_NUM[10] =  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数字 0 -- 9

DisplayOne64bitNum(888888888888);	//发起调用

/**
  * @brief  TM16x29D显示一个数字,最大999999999999
  * @note   这个数从左到右依次对应上面的第0个-第11个数码管
  * @param  
  * @retval None
  * @author @ CSDN Tyrion.Mon
  * @date   
  */
void DisplayOne64bitNum(uint64_t num)
{
	uint8_t pBuf[12];
	int8_t i;
	for(i=11; i>=0; i--)
	{
		pBuf[i] = char_NUM[num%10];
		num /= 10;
	}
	TM1629D_Display(pBuf);
}

/**
  * @brief  TM16x29D送显,共阳接法需要经过处理才能正确显示
  * @note   调用TM1629D_DealData处理要显示的12个字节数据后发送到TM1629D
  * @param  
  * @retval None
  * @author @ CSDN Tyrion.Mon
  * @date   
  */
void TM1629D_Display(uint8_t *TM1629D_data)
{
	uint8_t TM1629D_buf[16];  //TM1629D处理后的显示缓冲区
	
	TM1629D_DealData(TM1629D_data, TM1629D_buf);
	
	/* 此处可以for简写 */
	TM16xx_WriteOneData(0xc0, TM1629D_buf[0]);
	TM16xx_WriteOneData(0xc2, TM1629D_buf[1]);
	TM16xx_WriteOneData(0xc4, TM1629D_buf[2]);
	TM16xx_WriteOneData(0xc6, TM1629D_buf[3]);
	TM16xx_WriteOneData(0xc8, TM1629D_buf[4]);
	TM16xx_WriteOneData(0xca, TM1629D_buf[5]);
	TM16xx_WriteOneData(0xcc, TM1629D_buf[6]);
	TM16xx_WriteOneData(0xce, TM1629D_buf[7]);
	TM16xx_WriteOneData(0xc1, TM1629D_buf[8]);
	TM16xx_WriteOneData(0xc3, TM1629D_buf[9]);
	TM16xx_WriteOneData(0xc5, TM1629D_buf[10]);
	TM16xx_WriteOneData(0xc7, TM1629D_buf[11]);
	TM16xx_WriteOneData(0xc9, TM1629D_buf[12]);
	TM16xx_WriteOneData(0xcb, TM1629D_buf[13]);
	TM16xx_WriteOneData(0xcd, TM1629D_buf[14]);
	TM16xx_WriteOneData(0xcf, TM1629D_buf[15]);
}

/**
  * @brief  TM1629D显示数据处理函数
  * @note   
  * @param  TM1629D_data 要显示的12字节数据,共阳接法需要经过处理才能正确显示
  * @param  TM1629D_buf  处理后发送到TM1629D显示的数据
  * @retval None
  * @author @ CSDN Tyrion.Mon
  * @date   
  */
void TM1629D_DealData(uint8_t *TM1629D_data, uint8_t *TM1629D_buf)
{
	uint8_t i = 0, j = 0;
	
	for (i = 0; i < 16; i++)
		TM1629D_buf[i] = 0x00;
	
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			TM1629D_buf[j] >>= 1;
			if ((TM1629D_data[i] >> j) & 0x01)
				TM1629D_buf[j] |= 0x80;
		}
	}
	for (i = 8; i < 12; i++)
	{
		for (j = 8; j < 16; j++)
		{
			TM1629D_buf[j] >>= 1;
			if ((TM1629D_data[i] >> (j-8)) & 0x01)
				TM1629D_buf[j] |= 0x80;
		}
	}
	for (j = 8; j < 16; j++)
		TM1629D_buf[j] >>= 4;
}


void TM16xx_WriteOneData(uint8_t Addr, uint8_t data)
{
	GPIO_ResetBits(TM1629D_CS_PORT, TM1629D_CS_PIN);
	
	TM16xx_WriteByte(Addr);
	TM16xx_WriteByte(data);
	
	GPIO_SetBits(TM1629D_CS_PORT, TM1629D_CS_PIN);
}
/**
  * @brief  向TM16xx发一字节数据
  * @note   
  * @param  uint8_t byte
  * @retval None
  * @author 
  * @date   
  */
void TM16xx_WriteByte(uint8_t byte)
{
	uint8_t i;
	for (i = 0; i < 8; i++)
	{
		GPIO_ResetBits(TM16xx_CLK_PORT, TM16xx_CLK_PIN);
		if((byte >> i) & 0x01) //字节传输,先低后高
			GPIO_SetBits(TM16xx_DIO_PORT, TM16xx_DIO_PIN);
		else
			GPIO_ResetBits(TM16xx_DIO_PORT, TM16xx_DIO_PIN);
		GPIO_SetBits(TM16xx_CLK_PORT, TM16xx_CLK_PIN);
	}
}




TM1629D_DealData函数最初版本,根据手册写、调试得出的,废了不少脑细胞。上面是简化版本

@ CSDN Tyrion.Mon
void TM1629D_DealData(void)
{
	uint8_t i = 0, j = 0;
	
	for(i=0; i<16; i++)        //清零缓冲区
		TM1629D_buf[i] = 0x00;
	
	for(i=0; i<8; i++)         //将TM1629D_data[]数组数据分配到SEG1 - SEG8 ,即 数码管第 1 -- 8 个
	{
		for(j=0; j<8; j++)
			TM1629D_buf[j] >>= 1;
		
		if((TM1629D_data[i]>>0) & 0x01)
			TM1629D_buf[0] |= 0x80;
		if((TM1629D_data[i]>>1) & 0x01)
			TM1629D_buf[1] |= 0x80;
		if((TM1629D_data[i]>>2) & 0x01)
			TM1629D_buf[2] |= 0x80;
		if((TM1629D_data[i]>>3) & 0x01)
			TM1629D_buf[3] |= 0x80;
		if((TM1629D_data[i]>>4) & 0x01)
			TM1629D_buf[4] |= 0x80;
		if((TM1629D_data[i]>>5) & 0x01)
			TM1629D_buf[5] |= 0x80;
		if((TM1629D_data[i]>>6) & 0x01)
			TM1629D_buf[6] |= 0x80;
		if((TM1629D_data[i]>>7) & 0x01)
			TM1629D_buf[7] |= 0x80;
	}
	for(i=8; i<12; i++)        //将TM1629D_data[]数组数据分配到SEG9 - SEG12 ,即 数码管第 9 -- 12 个
	{
		for(j=8; j<16; j++)
			TM1629D_buf[j] >>= 1;
		
		if((TM1629D_data[i]>>0) & 0x01)
			TM1629D_buf[8] |= 0x80;
		if((TM1629D_data[i]>>1) & 0x01)
			TM1629D_buf[9] |= 0x80;
		if((TM1629D_data[i]>>2) & 0x01)
			TM1629D_buf[10] |= 0x80;
		if((TM1629D_data[i]>>3) & 0x01)
			TM1629D_buf[11] |= 0x80;
		if((TM1629D_data[i]>>4) & 0x01)
			TM1629D_buf[12] |= 0x80;
		if((TM1629D_data[i]>>5) & 0x01)
			TM1629D_buf[13] |= 0x80;
		if((TM1629D_data[i]>>6) & 0x01)
			TM1629D_buf[14] |= 0x80;
		if((TM1629D_data[i]>>7) & 0x01)
			TM1629D_buf[15] |= 0x80;
	}
	
	for(j=8; j<16; j++)        //SEG9 - SEG12  低四位有效,高四位无效
		TM1629D_buf[j] >>= 4;
}

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值