1.数码管
数码管分为共阴数码管和共阳数码管,我用的是共阴数码管,所以在此仅介绍共阴的,大家如果需要共阳数码管的知识,自己去搜索,网上很多资料。
一位数码管一般由8段构成,含7段数码和一段小数点。数码管根据其内部结构,如图所示。
数码管相当于8个(7段和点号)发光二极管连接在一起,共阴极就是8个二极管的阴极连接在一起,二极管要亮必需正偏,就是阴极接低电平,阳极接高电平,所以共阴极数码管段选加高电平该段才能亮。
例如数码管要显示0,那么就需要点亮a,b,c,d,e,f。而g,dp不需要点亮。根据内部结构图可知二进制显示就是0011 1111。那么其相对应的就是0x3f。依次类推,可以得出其他的数,当然了,这部分在网上都有现成的,小伙伴们只需要用的时候去搜一下即可。
2.数码管显示
这是我写的一个位选的代码,因为我用的是ULN2803去驱动数码管,所以我是这么写的,当当然了,之前有的用74LS138去驱动,不过这个好像现在基本不用了。现在应该有其他的去驱动。
switch(Location)
{
case 1:P10=1;P11=0;P13=0;P14=0;break;
case 2:P10=0;P11=1;P13=0;P14=0;break;
case 3:P10=0;P11=0;P13=1;P14=0;break;
case 4:P10=0;P11=0;P13=0;P14=1;break;
}
整体代码
#include <STC8h.H>
#define uint unsigned int
#define uchar unsigned char
//数码管段选
unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void GpioInit(void)
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P10=1;P11=0;P13=0;P14=0;break;
case 2:P10=0;P11=1;P13=0;P14=0;break;
case 3:P10=0;P11=0;P13=1;P14=0;break;
case 4:P10=0;P11=0;P13=0;P14=1;break;
}
P2=NixieTable[Number]; //段码输出
Delay(10); //显示一段时间
P2=0x00; //消影
}
void main()
{
GpioInit(); /*通用I/O口初始化*/
while(1)
{
Nixie(1,1); //在数码管的第1位置显示1
Nixie(2,2); //在数码管的第2位置显示2
Nixie(3,3); //在数码管的第3位置显示3
Nixie(4,4); //在数码管的第4位置显示4
}
}
相信大家肯定还有更好的数码管显示方式,这里只是提供我的方法,有不足的地方,希望大家指出。