动态数码管模块
共有八个数码管,八个数码管采用2个74HC573锁存器对单片机P0口的输出信号进行锁存,并增强信号驱动能力进而驱动8个数码管,其中U7的锁存输入Y7C是段选,U8的锁存输入Y6C是位选。
每个数码管共有8个字段:dp g f e d c b a, 控制数码管的显示实际上就是控制数码管字段的高低电平显示,通过控制字段的发光来表示字符。这是共阴极数码管,比如:要使数码管显示为0,则数码管段表示为:1100 0000 ,十六进制为0xc0,要表示其他数字亦然。
因为这是用两个锁存器来控制的,在段选之前,我们要先通过U8锁存器进行位选,也就是选择对应的几号数码管亮起,当然,如果需要全部亮起,只需要把延时时间变短即可(只是肉眼看不出来的频率)。
比赛常用数码管代码模板
1)扫描动态数码管
uchar code duan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
0xff, 0xbf}; //16 17
uchar Table[8];
//数码管扫描
void Smg_Scan(void)
{
static uchar index = 0;
P2 = P2&0x1f|0xe0;
P0 = 0xff;
P2 = P2&0x1f;
P2 = P2&0x1f|0xc0;//打开Y6
P0 = 1<<index;//位选
P2 = P2&0x1f;
P2 = P2&0x1f|0xe0;//打开Y7
P0 = ~duan[Table[index]];//显示段码
P2 = P2&0x1f;
index++;
index &= 0x07;
}
2)显示数码管
void Smg_show()
{
if(mode == 0)
{
//模式0的操作
}
else if(mode == 1)
{
//模式1的操作
}
//以此类推
}
3)显示LED
//LED显示
void LED_work(u8 dat)
{
P2 = (P2 & 0x1f) | 0x80;
P0 = dat;
P2 = P2 & 0x1f;
}