@goal: 数码管的动态显示&小数点处理&特殊符号处理,附原理图见结尾
共阳码不带小数点(0-F),带小数点&0x7f即可: {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
NIXIETUBE.C——数码管
/**************************************************************************
*@MCU : STC15F2K60S2 CT107D开发板
*@pattern :IO模式
*@IRC :12MHZ
*@Data : 2024/2/10
*@annotation :数码管为共阳数码管
*@function :实现动态显示数码管,小数点可选,且可显示特殊符号
***************************************************************************/
#include "MAIN.H"
u8 data Disp_Buff[] = {33,33,33,33,33,33,33,33,33}; //8位显示缓冲区,舍弃第0位
u8 code LED_Tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, //0-F不带小数点
0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f,0x88&0x7f,0x83&0x7f,0xc6&0x7f,0xa1&0x7f,0x86&0x7f,0x8e&0x7f, //0-F带小数点
0xBF, //第32位,特殊符号“中间一杠”
0Xff //none
};
//@role :底层驱动数码管扫描函数
//@detail :居中断,建议2ms调用一次
void Display_Loop()
{
static u8 i = 1;
SWI_138(7);P0 = 0XFF; //消影
SWI_138(6);P0 = 0X01<< i-1 ; //数码管位选和扫描
SWI_138(7);P0 = LED_Tab[Disp_Buff[i]]; //数码管位选和扫描
i++;if(i==9)i=1;
}
//@role :显示设置,修改缓冲区的参数
//@detail :loc can be 1-8、num can be 0-9、point can be 0 or 1,point为小数点位,高电平有效
void Display_Set(u8 loc,num,point)
{
if(point==1){Disp_Buff[loc] = num+16;}
else Disp_Buff[loc] = num ;
}
测试程序调试现象如下: