【本文发布于https://blog.csdn.net/Stack_/article/details/114379996,未经许可不得转载,转载须注明出处】
/* 字模 @ 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;
}