51单片上的数码管是由八个“8”构成,如图:
每个“8”都是由八个LED灯构成的,一共有八个“8”,一共32个LED,那如何控制对应的LED,组成想要的字符呢?
那就要了解数码管的电路图了,如图
图中的DIG就是所谓的“8”,DIG接阳极(12、9、8、6引口),11、7、4、2、10、5、3引口接阴极,DIG对应数码管图中的com。比如你要在第一个“8”中点亮“1”,先要点亮“8”中的b、c段,我们称之为位选,选择com1,称之为位选。
位选的a、b、c、d、e、f、g、dp要与M74HC573MIR有关,要开的话,则Y7C要为1,即译码器Y7为0,P2为1110 0000即0xe0
同理Y6为0,P2为1100 0000即0xc0
注意:DIG只能够一个一个显示的,那如何显示是一连串的字符能?
动态显示方法:
利用人眼“视觉残留”,依次点亮单个数码管,使人感觉8个数码管同时点亮!
【推荐】单个数码管显示时间为1ms或者2ms
显示0123456789可以通过STCAI-ISP中的范例程序,将其定义为数组,即可将十六进制对应为十进制,但是需要注意的是各数字是共阴极取法,要取反即加“~”
#include <STC15F2K60S2.H>
#include<intrins.h>
unsigned char cnt_shift=0;
void vDevice_ctrl(unsigned char P0data,unsigned char P2data)
{
P0=P0data;
P2=P2data;
P2=0;
}
void Timer2_Init(void) //1??@12.000MHz
{
AUXR |= 0x04; //?????1T??
T2L = 0x20; //???????
T2H = 0xD1; //???????
AUXR |= 0x10;
IE2 |= 0x04; //????2??
EA = 1;
}
unsigned char smg_code[8]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};
void smg_display()
{
static unsigned char i=0;
vDevice_ctrl(~smg_code[i],0xe0);
vDevice_ctrl(0x01<<i,0xc0);
i=(i+1)%8;
}
void vSystem_init()
{
vDevice_ctrl(0,0xa0);
}
void main()
{
vSystem_init();
Timer2_Init();
while(1)
{
}
}
void t2int() interrupt 12
{
cnt_shift++;
smg_display();
}