问题:
上篇文章写了TM1637显示数字,本次补充小数点和字符串输入自由显示程序,最终的API。
解决:
1.修改.c文件
static uint8_t number[] =
{
//0 1 2 3 4 5 6 7 8 9
0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,
//0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
0xFD,0x61,0xDB,0xF3,0x67,0xB7,0xBF,0xE1,0xFF,0xF7,
//NULL
0x0
};
2.显示程序
/**
* 函数功能: 数码管显示.
* 输入参数: 字符串
* 返 回 值: 无
* 说 明:例如"1.234"
*/
void TM1637_Display(char data[6])
{
/* 字符串处理 */
char data_lenth = strlen((const char *)data);
uint8_t point_flag = 0; //该元素为'.'标志
char tube[4] = {0}; //编码序号:number[tube[x]]
char number_count = 3; //数码管位序0-3
for(uint8_t i = data_lenth;i > 0;i--)
{
if(data[i - 1] == '.') //该字符为'.'
point_flag = 1;
else
{
switch(data[i - 1]) //获取该字符编码序号
{
case '0': tube[number_count] = 0; break;
case '1': tube[number_count] = 1; break;
case '2': tube[number_count] = 2; break;
case '3': tube[number_count] = 3; break;
case '4': tube[number_count] = 4; break;
case '5': tube[number_count] = 5; break;
case '6': tube[number_count] = 6; break;
case '7': tube[number_count] = 7; break;
case '8': tube[number_count] = 8; break;
case '9': tube[number_count] = 9; break;
default : break;
}
if(point_flag == 1) //该元素右侧数据为'.'
{
point_flag = 0;
tube[number_count] += 10; //小数点
}
number_count--; //-1:0位空XXXX,0:1位空_XXX,1:2位空_ _XX,2:3位空_ _ _X。
}
}
switch(number_count) //不显示的位
{
case 0: tube[0] = 20; break;
case 1: tube[0] = 20;tube[1] = 20; break;
case 2: tube[0] = 20;tube[1] = 20;tube[2] = 20; break;
default : break;
}
/* 数码管显示 */
TM1637_Start();
TM1637_Send_Command(0x40); //数据控制(0x44--固定地址,0x40--地址自增),固定地址需另写程序
TM1637_Stop();
TM1637_Start();
TM1637_Send_Command(0xC0); //地址控制(0xC0--C3:数码管1-4)
TM1637_Send_Data(number[tube[0]]); //数码管1
TM1637_Send_Data(number[tube[1]]); //数码管2
TM1637_Send_Data(number[tube[2]]); //数码管3
TM1637_Send_Data(number[tube[3]]); //数码管4
TM1637_Stop();
TM1637_Start();
TM1637_Send_Command(0x8C); //显示控制(0x88/89/8B/8C/8D/8E/8F亮度从低到高,0x87关闭显示)
TM1637_Stop();
}
总结:
至此,该数码管软硬件设计结束,有了5个好看的数码管。