对led中所涉及到的几个地址的说明:
#define CS1BASE
(0x11000000)
#define SEGP
((0x10000000+0x248))
#define DIGIP
((CS1BASE+0x0800))
#define LEDP
((CS1BASE+0x
上述几个值都是由硬件设计人员给出的。其中,
DIGIP 为位寄存器地址(总共有8个数码管,用来控制要对哪个数码管进行操作);
SEGP为段寄存器地址(其作用有两个:一是控制某个数码管的具体显示内容;二是设定要控制哪个灯);
LEDP 为控制灯的亮与灭(即只存在两个有效的值:0和1)
例子如下:
void myledtest()
{
//数组的内容分别为:8 7 6
unsigned long int tt[3] = {0x0000fe,0x0000e0,0x0000be};
int i = 0;
while (i<3)
{
//所有数码管的显示清空,即不显示
*(unsigned short*)(DIGIP)=0x00;
//指定数码管显示的内容
*(unsigned short*)(SEGP)=tt[i];
//指定用哪个数码管来显示
*(unsigned short*)(DIGIP)=0x0080>>i;
i++;
}
}
{
//数组的内容分别为:8 7 6
unsigned long int tt[3] = {0x0000fe,0x0000e0,0x0000be};
int i = 0;
while (i<3)
{
//所有数码管的显示清空,即不显示
*(unsigned short*)(DIGIP)=0x00;
//指定数码管显示的内容
*(unsigned short*)(SEGP)=tt[i];
//指定用哪个数码管来显示
*(unsigned short*)(DIGIP)=0x0080>>i;
i++;
}
}
void myLighttest()
{
int i = 0;
while (i<8)
{
//下行主要目的是清除数码管的显示,与灯并无关系
*(unsigned short*)(DIGIP)=0x00;
//下行清空灯的显示,即让所有灯都灭
*(unsigned short*)(LEDP)=0x00;
//设定哪个灯
*(unsigned short*)(SEGP)=0x80 >> i;
//设定由上句指定的灯为亮状态
*(unsigned short*)(LEDP)=1;
i++;
}
}
{
int i = 0;
while (i<8)
{
//下行主要目的是清除数码管的显示,与灯并无关系
*(unsigned short*)(DIGIP)=0x00;
//下行清空灯的显示,即让所有灯都灭
*(unsigned short*)(LEDP)=0x00;
//设定哪个灯
*(unsigned short*)(SEGP)=0x80 >> i;
//设定由上句指定的灯为亮状态
*(unsigned short*)(LEDP)=1;
i++;
}
}
注意:因为 SEGP是控制数码管和灯所公用的,所以容易搞混。
来源:https://www.cnblogs.com/gaotaozhaolei/archive/2007/05/15/747599.html