日志档案

发表于 2007-8-2 22:16:42

4

标签: 无标签

MAX7219和MSP430(调试通过)

/*****************************************************************************\

文件名:KuangJia.c

描述:MSP430框架程序。适用于MSP430F149,其他型号需要适当改变。

      不使用的中断函数保留或者删除都可以,但保留时应确保不要打开不需要的中断。

      保留中断函数,编译器将会为BSL密码填充所有的字节。

版本:1.1

\*****************************************************************************/

 

//头文件

#include <MSP430x14x.h>

 

//函数声明

#define max7219_shutdown 0x0c //0  关闭  1  开启

#define max7219_decodemode 0x09 //0  ndecode all

         //1  decode 0

            //0f decode 0-3

         //ff decode all

#define max7219_intensity 0x0a //亮度控制寄存器 0-f

/*显示位控制寄存器*********************************************/

/*0-第一位  1-第一、二位  ......7-全显示***********************/

#define max7219_scanlimit 0x0b

#define max7219_testreg  0x0f //测试模式 0 普通模式 1显示测试模式

#define max7219_dataaddr 0x01 //显示基址

 

/*MAX7219寄存器功能说明结束************************************/

//#define max7219_set0(x)  x=0

//#define max7219_set1(x)  x=1

#define max7219_clk  BIT2

#define max7219_load  BIT1

#define max7219_din  BIT0

 

unsigned int m;

unsigned char  display_buf[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

 

//----------------------------------

//功能:us 级别延时

// n="10",则延时10*5+6=56uS

//----------------------------------

 

 

 

void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟

{

    //int nCount;

    int i;

  //  int j;

   // nCount =1;

    for(i = nValue;i > 0;i--)

    {

           //for(j = nCount;j > 0;j--);

      _NOP();

      _NOP();

      _NOP();

     

    }

    return;

}

 

//-----------------------------------

void max7219_set1(x)

 

{      

    // 设定管脚为输出方向

       P1DIR |= x;

    // DQ管脚拉高

       P1OUT |= x;

       

}

void max7219_set0(x)

 

 

{      

  // 设定管脚为输出方向

       P1DIR |= x;

 

       // DQ管脚拉低

       P1OUT &= ~x;

       

}

void max7219_senddata(unsigned char addr,unsigned char data_send)  //两个无符号字符型

{

 unsigned char i,a;

 max7219_set0(max7219_load);

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

 {

  max7219_set0(max7219_clk);

  max7219_set1(max7219_clk); 

 }

 addr=addr<<4;

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

 {

  max7219_set0(max7219_clk);

  a=addr&0x80;

  if(a) max7219_set1(max7219_din);

  else max7219_set0(max7219_din);

  addr=addr<<1;

  max7219_set1(max7219_clk);

 

 }

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

 {

   max7219_set0(max7219_clk);

   a=data_send&0x80;

   if(a) max7219_set1(max7219_din);

   else max7219_set0(max7219_din);

   data_send=data_send<<1;

   max7219_set1(max7219_clk);

 }

  max7219_set1(max7219_load);

}

 

 

//max7219送数据函数             

void sent_data (m)

{

   unsigned int max7219_data;

   max7219_data =m;

 

   max7219_set0(max7219_clk);

   Delay_us(1);

   max7219_set0(max7219_din);

   Delay_us(1);

   max7219_set0(max7219_load);

    Delay_us(1);

 

    for ( max7219_data=0x8000; max7219_data>=0x0001; max7219_data=max7219_data>>1 )

    {

    if ( ( m&max7219_data) == 0 ) max7219_set0(max7219_din); else max7219_set1(max7219_din);

     max7219_set1(max7219_clk);

     Delay_us(1);

     max7219_set0(max7219_clk);

     Delay_us(1);

    }

   max7219_set1(max7219_load);

   Delay_us(1);  

}    

// max7219寄存器设置, 初始化

void max7219_init (void)

{

   

   /* sent_data( 0x0C01 ); // LED为正常状态

    sent_data( 0x0A04 ); // LED亮度为9/32

    sent_data( 0x0B03 ); // LED扫描范围DIGIT0-3

    sent_data( 0x0900 ); // LED显示为不译码方式 */

       sent_data(0x0C01);    //shutdown register format

        sent_data(0x09FF);    //decode mode code B 7-0

        sent_data(0x0A0F);    //intensity register format

        sent_data(0x0B07);    //sacan limit register format

        sent_data(0x0F00);    //display test register format

}

 

// 显示选项送显示器及输出控制函数

void display_out (void)

{

//显示数据送显示器

  // max7219_senddata(0x01,0x01);

  // max7219_senddata(0x02,0x01);

// max7219_senddata(0x03,0x01);

 //  max7219_senddata(0x04,0x01);

 

  //  max7219_senddata(0x05,0x01);

  //max7219_senddata(0x06,0x01);

   //max7219_senddata(0x07,0x01);

 // max7219_senddata(0x08,0x01);

   sent_data(0x0100+display_buf[0]);

   sent_data(0x0200+display_buf[1]);

   sent_data(0x0300+display_buf[2]);

   sent_data(0x0400+display_buf[3]);

  

   sent_data(0x0500+display_buf[4]);

   sent_data(0x0600+display_buf[5]);

   sent_data(0x0700+display_buf[6]);

   sent_data(0x0800+display_buf[7]);

}

 

void max7219_initial()

{

  max7219_set0(max7219_clk);

  max7219_set0(max7219_load);

  max7219_set0(max7219_din);

}

 

/*MAX7219驱动程序结束**********************************************/

void InitSys();

 

 

 

int main( void )

{

  WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗

 

  InitSys();                                //初始化

 

//start:

  //以下填充用户代码

 

              //max7219_initial();

                //max7219_data=1;

               max7219_init ();

               display_out ();

              for(int i="1000";1>0;i--)

 

 

              {Delay_us(1000);}

 

 

      

        //LPM3;                //进入低功耗模式nn0~4。若不希望进入低功耗模式,屏蔽本句

       ///goto start;

 

}

 

/*****************************************************************************

系统初始化

******************************************************************************/

void InitSys()

{

   unsigned int iq0;

 

       //使用XT2振荡器

   BCSCTL1&=~XT2OFF;                                        //打开XT2振荡器

   do

   {

             IFG1 &= ~OFIFG;                             // 清除振荡器失效标志

             for (iq0 = 0xFF; iq0 > 0; iq0--);           // 延时,等待XT2起振

    }while ((IFG1 & OFIFG) != 0);                        // 判断XT2是否起振

 

    BCSCTL2 =SELM_2+SELS;                             //选择MCLKSMCLKXT2

 

       //以下填充用户代码,对各种模块、中断、外围设备等进行初始化

 

   _EINT();   //打开全局中断控制,若不需要打开,可以屏蔽本句

}

系统分类: 汽车电子   |   用户分类: 无分类   |   来源: 转贴   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1232)    回复(0)  

投一票您将和博主都有获奖机会!