数码管,根据内部结构,可分为共阴极数码管和共阳极数码管。七段发光管加上一个小数点,共计8段。因此,我们对它编程的时候,刚好是用一个字节。
数码管的显示方式:
1)静态显示;
2)动态显示;
#include<reg52.h>
sbit dula = P2^6;
sbit wela = P2^7;
void main()
{
P0=0x3F;
dula=1;
dula=0; //锁住段显
P0=0xFE;
wela=1;
wela=0; //锁住位显
while(1);
}
选择仿真:
硬件仿真调试:
我们使用了数组,将共阴极的数码管的真值表,下标正好对应的是数码管的显示数值,这样就不用记真值表了。
#include<reg52.h>
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
P0=0xF0;
wela=1;
wela=0; //锁住位显
P0=table[0];
dula=1;
dula=0; //锁住段显
while(1);
}
需要掌握锁存器的功能。
让1/3/5位的数码管从0到1循环显示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6;
sbit wela = P2^7;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void main()
{
while(1)
{
P0=0xEA;
wela=1;
wela=0; //锁住位显
P0=table[0];
dula=1;
dula=0; //锁住段显0
delay(1000);
P0=table[1];
dula=1;
dula=0; //锁住段显1
delay(1000);
}
}
void delay(uint x)
{
for(i=x;i>0;i--)
{
for(j=120;j>0;j--);
}
}
然后是使用for循环语句将所有的数码管都从0到F都进行循环显示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6;
sbit wela = P2^7;
uchar num=0;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void main()
{
while(1)
{
// P0=table[0];
// dula=1;
// dula=0; //锁住段显0
// delay(1000);
// P0=table[1];
// dula=1;
// dula=0; //锁住段显1
// delay(1000);
for(num=0;num<16;num++)
{
P0=table[num];
dula=1;
dula=0;
P0=0xEA;
wela=1;
wela=0; //锁住位显
delay(1000); //延迟1秒
}
}
}
void delay(uint x)
{
uint i;
uint j;
for(i=x;i>0;i--)
{
for(j=120;j>0;j--);
}
}
关键字code,没有加code的时候,定义的变量都放在单片机的RAM中,在程序中可以随意去改变这些变量的值。但是还有一种数据,在程序中使用,却不会改变它的值。定义这种数据的时候,可以加一个code关键字进行下修饰。这个数据会存储到程序空间的Flash中。这样可以大大节省单片机的RAM的使用量。
共阳极数码管的真值表:
unsigned char code table[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};