snifer

[原创]基于ADSP BF561的 LED与点阵数码管的应用

0
阅读(6237)

ADSP-BF561 的推出使Analog Devices公司的Blackfin处理器系列得到了进一步的扩充,这款器件具有由两个Blackfin处理器内核构成的对称多处理结构。这款芯片的应用很多,闲暇之余,我用这款芯片成功实现了对LED彩色数码管的写入控制,心情非常激动,写出来与大家共勉。

首先普及一下LED。

在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会 把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反 向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制 作的二极管叫发光二极管,通称LED

 LED的发光颜色和发光效率与制作LED的材料和工艺有关,目前广泛使用 的有红、绿、蓝三种。由于LED工作电压低(仅1.5-3V),能主动发光且有 一定亮度,亮度又能用电压(或电流)调节,本身又耐冲击、抗振动、寿命 长(10万小时),所以在大型的显示设备中,目前尚无其他的显示方式与 LED显示方式匹敌。 把红色和绿色的LED放在一起作为一个像素制作的显示屏叫双基色屏或 伪彩色屏;把红、绿、蓝三种LED管放在一起作为一个像素的显示屏叫三基 色屏或全彩屏。制作室内LED屏的像素尺寸一般是2-10毫米,常常采用把几 种能产生不同基色的LED管芯封装成一体,室外LED屏的像素尺寸多为12-26 毫米,每个像素由若干个各种单色LED组成,常见的成品称像素筒或像素模块。   

LED显示屏如果想要显示图象,则需要构成像素的每个LED的发光亮度都 必须能调节,其调节的精细程度就是显示屏的灰度等级。灰度等级越高,显 示的图像就越细腻,色彩也越丰富,相应的显示控制系统也越复杂。在当前 的技术水平下,256级灰度的图像,颜色过渡已十分柔和,图像还原效果比 较令人满意。 资料显示,LED光源比白炽灯节电87%、比荧光灯节电50%,而寿命比白 炽灯长20~30倍、比荧光灯长10倍。LED光源因具有节能、环保、长寿命、安全、响应快、体积小、色彩丰富、可控等系列独特优点,被认为是节电降能 耗的最佳实现途径。 

下面看一下LED数码管电路图。

ADSP BF561可以设置2 个数码管,由74HC273 控制。74HC273是同步串行转并行的锁存器,在此通过SPI 总线和ADSP BF561 连接,锁存数据后驱动数码管发光。

下面是我写的软件部分,重要代码片断分析如下:

Led.h中对寄存器的声明和函数的定义

// led number

#define lednum1con *(volatile unsigned char *)0x08000110

#define lednum2con *(volatile unsigned char *)0x08000112

// led array

#define led1con *(volatile unsigned char *)0x08000100

#define led2con *(volatile unsigned char *)0x08000102

#define led3con *(volatile unsigned char *)0x08000104

#define led4con *(volatile unsigned char *)0x08000106

#define led5con *(volatile unsigned char *)0x08000108

#define led6con *(volatile unsigned char *)0x0800010a

#define led7con *(volatile unsigned char *)0x0800010c

#define led8con *(volatile unsigned char *)0x0800010e

void set_lednum(void);

void set_1_led(void);

void set_2_led(void);

void set_3_led(void);

void set_4_led(void);

void test_led(void);

led.c函数

void set_lednum(void)

{

 

int i,j;                                                                     

int \ num[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0xff};

lednum2con=num[0];

lednum1con=num[0];

for(j=1;j<16;j++)

{

for(i=0;i<=15;i++)

{

lednum2con=num[i];

hudelay(1000);

}

lednum1con=num[j];

//hudelay(3500);

}

}

OK了,可以写入任意你想显示的内容,晚上在实验室亮起来,非常漂亮,假期过的太快了,加油!