开发板上设计了2个数码管和8个LED指示灯。数码管和LED复用数据总线,采用74HC245作为总线驱动芯片。CPLD内部固化了一个LED控制器,控制器采用动态扫描的方式维持LED显示。使用时ADSP-BF561处理器只需通过EBIU接口向CPLD内部的LED控制器送入需要显示的内容,LED控制器会自动将所要显示的数据锁存,并通过扫描维持该数据的显示,直到BF561重新向控制器送入数据信息。
LEDCS |
LED_A1 |
LED_A0 |
pLED_DAT_OUT |
说明 |
上升沿 |
0 |
0 |
XX |
数码管0显示数据 |
上升沿 |
0 |
1 |
XX |
数码管1显示数据 |
上升沿 |
1 |
0 |
XX |
LED显示数据 |
上升沿 |
1 |
1 |
保留 |
保留 |
其中pLED_DAT_OUT的数据D0-D7分别对应的数码管的8段a-h。
实验时驱动代码的编写过程要按照以下步骤进行
第一:向pCtrOut_Flag_OE寄存器写入数据,使能驱动器HC245 LED_OE=0。
第二:选择写入地址向pCtrOut_Flag_B对应的LED_A1和LED_A0写入数据。
第三:向pLED_DAT_OUT寄存器写入要显示的参数。
第四:控制pCtrIner_Flag寄存器的LEDCS位,使其产生一个上升沿,此时数据写入相应的寄存器:
pCtrOut_Flag_OE映射的物理地址为:0x20350000
pCtrIner_Flag映射的物理地址为:0x20360000
pCtrOut_Flag_B映射的物理地址为:0x20380000
pLED_DAT_OUT映射的物理地址为:0x20390000
代码分析:
void
leddisplay(uint8_t LEDNum,uint8_t data)
{
switch(LEDNum)
{
case 1: *pCtrOut_Flag_B
= 0x00; break; // LED_A1=0 LED_A1=0
case 2: *pCtrOut_Flag_B
= 0x00| LED_A0; break; // LED_A1=0 LED_A1=1
case 3: *pCtrOut_Flag_B
= 0x00| LED_A1; break; // LED_A1=1 LED_A1=1
default: printf("ERROR!\n"); break;
}
*pLED_DAT_OUT =data; // 输出显示数据
*pCtrIner_Flag_OE =0x00; // LEDCS 位为0
mdelay(10000);
*pCtrIner_Flag_OE =0x04; // LEDCS 位为1
}
代码运行结果:
1.
首先看到8个LED灯循环被点亮。
2.
数码管显示从99递减到00。
硬件连接原理图: