一、TX1C数码管介绍
共阴极和共阳极数码管,实验板上是共阴极数码管,6位一体的数码管。
连接原理图如下面两图:连在一起的段线(段选线即abcdefgh)控制数码管亮什么数字,独立的公共端(位选线即共阴极或共阳极)控制哪一位数码管亮。因为段线是连接在一起的,所以显示的数字是一样的,共阴极一端是独立的公共端,所以低六位分别控制哪位数码管亮。用两个锁存器可以控制任意数码管显示任意数字。
一、数码管的静态显示
静态显示就是位选打开的数码管上显示的数字都相同,因为段选是连接在一起的。
1、数码管的前三位显示666
#include
sbit wela=P2^7;
sbit dula=P2^6;
void main()
{
wela=1;//位选打开,即锁存端置高,锁存器的输出随输入变化
P0=0xf8;//1111 1000,前三位点亮
wela=0;//位选关闭,即锁存端置低,锁存器保持之前的状态,就是让前三个数码管亮
dula=1;
P0=0x7d;//将数码管显示6数字,0111 1101
dula=0;
while(1)
{
}
}
#include
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x3e};//0到F的编码,最后一个是U,0011 1110
void delayms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
wela=1;
P0=0xc0;//1100 0000,六个数码管亮
wela=0;
while(1)
{
dula=1;
P0=table[9];//数组是从0开始的,显示9
dula=0;
delayms(500);
dula=1;
P0=0;
dula=0;
delayms(300);//由于连续两个9,中间熄灭300毫秒
dula=1;
P0=table[9];
dula=0;
delayms(500);
dula=1;
P0=table[6];//显示6
dula=0;
delayms(500);
dula=1;
P0=table[1];//由于显示不了I,所以用1代替一下
dula=0;
delayms(500);
dula=1;
P0=table[12];//显示C
dula=0;
delayms(500);
dula=1;
P0=table[16];//显示U
dula=0;
delayms(300);
}
}
二、数码管的动态显示
所谓的动态显示就是从第一个数码管到最后一个数码管依次显示数字,把显示数字进行延时,就成了每个数码管依次显示了,然后把时间缩得很短很短,数码管在轮流高速显示,人眼看不出来了,给人的感觉就是同时显示了。
下段代码就是显示996ICU字样
#include
#define uint unsigned int//宏定义,给unsigned int 重新命名为uint,方便使用
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x3e};//0到F的编码,最后一个是U,0011 1110
void delayms(uint xms);
void main()
{
dula=0;
wela=0;/*关闭位选,不然下面刚打开段选时,9也就是ox6f点亮的数码管都会显示9,只不过很快,眼睛看不见
,如果加一个延时语句就能看见了,可以在下面第一个dula=0语句后加while(1)测试一下*/
while(1)
{
dula=1;
P0=table[9];//第一个数码管显示9
dula=0;
P0=0xff;//消影。如果不加,后面打开第一个数码管之前先把9也就是0x6f给打开位选的P0,程
wela=1;//序跑的很快看不见,如果慢点就能看到数码管出现混乱现象
P0=0xfe;//打开第一个数码管
wela=0;
delayms(1);
wela=1;//如果不加这三个语句就会看到数码管没有亮的部分会有微弱亮度
P0=0xff;//原因是往下执行时,位选的fe先给下面段选,第一个数码管快速显示fe
wela=0;/*然后下面的table[9]就显示给了第一个数码管,因为这两个数都是9,换个数字
就明显了,所以在没有延时高速显示下会有微弱亮度,如果慢点可能会出现混乱现象,所有显示的数字
亮很多是因为有延时,所以直接关闭第一个数码管就解决问题了,由于高速显示也就看不到第一个数码管灭了*/
dula=1;
P0=table[9];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;//打开第二个数码管
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[6];//显示6
dula=0;
P0=0xff;
wela=1;
P0=0xfb;//打开第三个数码管
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[1];//显示I,用1代替
dula=0;
P0=0xff;
wela=1;
P0=0xf7;//打开第四个数码管
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[12];//显示C
dula=0;
P0=0xff;
wela=1;
P0=0xef;//打开第五个数码管
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[16];//显示U
dula=0;
P0=0xff;
wela=1;
P0=0xdf;//打开第六个数码管
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
刚开始delayms函数的时间放长一点,delayms(500),让它以0.5秒的速度依次显示,慢慢减小时间到delayms(1)1毫秒就体会的深一点了。
三、总结
1、编码方法
本实验板上共阴极数码管编码如下:unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};此编码是0到F,即0为0011 1111,1为0000 0110.不同的电路编码可能不同,知道数码管显示的原理就可以编码。在数组类型后面多了一个code关键字。注意:在单片机中定义数组是占用内存空间的,而定义编码时是直接分配到程序空间,编译后,编码占用的是程序存储空间,而不是内存空间。
2、消影很重要,不然数码管会混乱或者数字之外的部分会有余辉。在第二段代码中,关闭的位选人眼是看不见的,给人同时显示的原因就是高速显示和二极管点亮之后的余辉作用。