数码管和灯

led中所涉及到的几个地址的说明:
#define CS1BASE (0x11000000)
#define SEGP ((0x10000000+0x248))
#define DIGIP ((CS1BASE+0x0800))
#define LEDP ((CS1BASE+0x0C00))

上述几个值都是由硬件设计人员给出的。其中,

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
++;
        }
}

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
++;
        }
}

注意:因为 SEGP是控制数码管和灯所公用的,所以容易搞混。




原文地址:https://www.cnblogs.com/gaotaozhaolei/p/747599.html