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


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


12段8位驱动芯片TM1629D驱动12位8段共阳数码管_第1张图片

参考官方手册共阳接法画出原理图(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;
}





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

你可能感兴趣的:(MCU,硬件,stm32)