在对LED灯的应用有了一定的了解之后,我开始学习了一些关于数码管的应用。
在我的开发板上,有独立共阳管和八位共阴管 。数码管从高位到低位的段码依次是h(dp),g,f,e,d,c,b,a共八位。共阴管是“1”表示亮,“0”表示灭,而共阳管则是相反的。顺便提一句,若是要检测数码管是否完好,可以用数码管“8”来检测。
若是要在数码管上显示0~F,则可以用一套固定的十六进制数表示,可以放在数组中,为{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。这一个数组是用来表示共阴管的亮的,而若是共阳管的时候,需要在前面加上“~”。
独立共阳管显示0-F
自己写的几个延时函数
void DelayUs2X(unsigned char t)//微秒级延时
{
while(t--);
}
void DelayMs(unsigned char t)//毫秒级延时
{
while(t--)
{
DelayUs2X(245);
DelayUs2X(245);
}
}
void DelayS(unsigned char t)//秒级延时
{
while(t--)
{
DelayMs(245);
}
}
段码和位码的用数组存放
unsigned char code Seg_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//段码,显示器现实的数字对应0~15
unsigned char code Bit_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0x0df,0xbf,0x7f};
//位码,对应8个数码管
unsigned char code LOVE[]={0x06,0x00,0x38,0x3f,0x3e,0x79,0x00,0x3e};
// I L O V E U
单个数码管从0——15的显示,因为板子上的单个数码管是共阳极的,所以需要给代码去反
void main()//单个数码管零到16的显示
{
while(1)
{
if(i==16)
{
i=0;
}
P1 =~Seg_Code[i];
i++;
DelayS(5);//相当于1秒的延迟
}
}
八位数码管一次显示从1到15,每次位选一个数码管
void show_0_15()//0到15的八位数码管一次显示
{
DataPort = 0;//清除数据,防止重影
for(i=0;i<16;i++,j++)//先送位码,再选段码
{
if(j==8)
{
j=0;
}
DataPort =Bit_Code[j];//送位码确定哪个数码管显示
Bit_Latch = 1;//开门
Bit_Latch = 0;//关门
// Delay();
DataPort = Seg_Code[i];//送段码,确定显示的数字
Seg_Latch = 1;//开门
Seg_Latch = 0;//关门
Delay();
}
}
Display显示函数,用来确认需要从第几码管显示以及显示几位数码管
void DisPlay(unsigned char FirstBit,unsigned char Num)//显示几位数码管以及各自上面的数字
{
unsigned char i;
for(i=0;i
8位累加器,从0到99999999
void leijiaqi()//累加器8位
{
unsigned long int num=0;
unsigned int j;
while(1)
{
j++;
if(j==24)//延时空跑24圈,num+1;这24圈只是为了跑亮八个灯
{
j=0;
num++;
if(num==10000000)
num=0;
}
TempData[0]=Seg_Code[num/10000000];
TempData[1]=Seg_Code[(num%10000000)/1000000];
TempData[2]=Seg_Code[(num%1000000)/100000];
TempData[3]=Seg_Code[(num%100000)/10000];
TempData[4]=Seg_Code[(num%10000)/1000];
TempData[5]=Seg_Code[(num%1000)/100];
TempData[6]=Seg_Code[(num%100)/10];
TempData[7]=Seg_Code[(num%10)/1];
DisPlay(0,8);
}
}
在八位数码管上动态显示11位的手机号码,将上一位空格共12位
void main()
{
unsigned long int num=0;
unsigned int j;
while(1)
{
j++;
if(j==40)//延时空跑24圈,num+1;这24圈只是为了跑亮八个灯
{
temp%=1000;
temp++;
j=0;
}
//temp%=8;
for(i=0;i<8;i++)
{
TempData[i]=PhoneNumber[(i+temp)%12];
}
DisPlay(0,8);
}
}