⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7455_mps430.txt

📁 GY-29-MMA7455发送资料
💻 TXT
字号:
#include <msp430x14x.h>

#include "sensor.h"
#include "data.h"

unsigned char testd=0;
/********************************************
系统初始化
********************************************/
void SysInit(void)
{
    unsigned char i;
    WDTCTL=WDTPW+WDTHOLD;
    BCSCTL1 &= ~XT2OFF;    		    // XT2 = HF XTA/*L
    do                   		    //wait for XT2 stable
     {
         IFG1 &= ~OFIFG;
         for (i = 0xFF; i > 0; i--);
     }
    while ((IFG1 & OFIFG) != 0);
    BCSCTL2 |= SELM1+SELS;                 // MCLK =  XT2 (safe); SCLK = MCLK
}
/***************************************************/
/*I/O初始化子程序                               */
/***************************************************/

void IOInit()          //1--OUT;0--IN
{
  
  P3DIR = 0XFB; // P3.3--CLK; P3.2--MISO; P3.1--MOSI; P3.0--/CS  1011
  P3SEL = 0X0E;
  P3OUT = 0X81;
  
  P4DIR = 0XFF;
  P4OUT = 0X00;
  
  P5DIR = 0XFF;
  P5OUT = 0X00;
  
  P1DIR = 0XFF;
  P1OUT = 0X00;   //P1.1--INT2;  P1.0--INT1;
  P1DIR |= RES  + DC + CS;
  P3DIR |= WR + RD;
}

void DELAY(unsigned int num)
{
  for( ; num>0 ; num--)
  {
    for(int m=0;m<1000;m++)
    ;
  }
}


void comm_out(unsigned int data)
{
    unsigned char   datal,datah;
    datal=  (unsigned char)data;
    datah=  data>>8;
    P1OUT &=~DC;
    P3OUT&=~WR;
    P5OUT = datah;
    P4OUT = datal;
    P3OUT|=WR;
    P1OUT |=DC;

}

void data_out(unsigned int data)
{
 unsigned char   datal,datah;
 datal=  (unsigned char)data;
 datah=  data>>8;
 P3OUT &=~WR;
 P5OUT = datah;
 P4OUT = datal;
 P3OUT |=WR;

}


void data_out2(unsigned int data1,unsigned int data2)
{

 P3OUT &=~WR;
 P5OUT = data1;
 P4OUT = data2;
 P3OUT |=WR;
}


void ram_address()
{
  comm_out(0x0015);
  data_out(0x0000);   //Column start address
  data_out(0x007f);   //Column end address
  comm_out(0x0075);
  data_out(0x0000);   //row start address
  data_out(0x005f);   //rou end address
}


void wr_address(unsigned int xstart,unsigned int xend,unsigned int ystart,unsigned int yend)
{
  comm_out(0x0015);
  data_out(xstart);   //Column start address
  data_out(xend);   //Column end address
  comm_out(0x0075);
  data_out(ystart);   //row start address
  data_out(yend);   //rou end address  
}


void oledinit()
{
  comm_out(0x00fd);   //Set Command Lock
  data_out(0x00b1);   //Unlock OLED driver IC

  comm_out(0x00ae);   //Display off

  comm_out(0x00a0);   //Set Re-map Color Depth
  data_out(0x0074);   //65k彩色模式???
 // data_out(0x00e4);   //262k 彩色模式, 16位mcu接口

  comm_out(0x00a1);   //Set Display Start Line
  data_out(0x0000);

  comm_out(0x00a2);   //Set Display offset
  data_out(0x0000);

  comm_out(0x00a6);   //Normal Display

  comm_out(0x00ab);   //Function Selection
  data_out(0x0041);

  comm_out(0x00b1);   //Set Reset(Phase 1)/Pre-charge(Phase2) Period
  data_out(0x0053);

  comm_out(0x00b3);   //Set frame rate
  data_out(0x00f1);  //晶振二分频

  comm_out(0x00b4);   //External VSL
  data_out(0x00a0);
  data_out(0x00b5);
  data_out(0x0055);

  comm_out(0x00b9);   //Use Built-in Linear LUT

  comm_out(0x00bb);   //Set Pre-charge voltage
  data_out(0x0000);

  comm_out(0x00be);   //Set VCOMH
  data_out(0x0007);   //0.58*Vref

  comm_out(0x00c1);   //Set Contrast Level For R,G,B
  data_out(0x00b1);   //Red Contrast Set
  data_out(0x00aa);   //Green Contrast Set
  data_out(0x0091);   //Bule Contrast Set

  comm_out(0x00c7);   //Master Current Control,120cd/m2
  data_out(0x0007);

  comm_out(0x00ca);   //Set MUX Radio
  data_out(0x005f);   //96 duty   5f    105---69


}

void oledon()
{

  P1OUT &=~ RES;
  DELAY(200);        //延时2uS
  P1OUT |= RES;

  oledinit();
}


void oledclear()
{
 unsigned char i,j;
  ram_address();
  comm_out(0x005c);   //写RAM
  for(i=0; i<96 ;i++)
  {
    for(j=0;j<128;j++)
    {
      data_out(0x0000);   // 0x0000
    }
  } 
}

void disp_num()//显示0~9数字
{
  unsigned int tempd;
  _DINT();
  for( int i=0;i<10;i++)
  {
    wr_address(11+9*i,18+i*9,21,36);
    comm_out(0x005c);
    for(int j=0;j<16;j++)
    {
      unsigned int temp=0x80;
      for(int m=0;m<8;m++)
      {
        tempd=temp>>m;
      if(num[i][j]&tempd)
        data_out2(0x1f,0xff);
      else
        data_out2(0x00,0x1f);
      }
    }
    
  }
  _EINT();
}

void disp_XDATA()
{
  unsigned int numb,tempd,i=0;
 // YDATA=ADC12MEM2;
  for(int n=4;n>0;n--)
  {
    if(n==4)
      numb = XDATA/1000;
    else if(n==3)
      numb = (XDATA%1000)/100;
    else if(n==2)
      numb = (XDATA%100)/10;
    else
      numb = (XDATA%10);
    wr_address(11+9*i,18+i*9,21,36);
    comm_out(0x005c);
    for(int j=0;j<16;j++)
    {
      unsigned int temp=0x80;
      for(int m=0;m<8;m++)
      {
        tempd=temp>>m;
      if(num[numb][j]&tempd)
        data_out2(0x1f,0xff);
      else
        data_out2(0x00,0x1f);
      }
    }
    i++;
  }
}

void disp_YDATA()
{
  unsigned int numb,tempd,i=0;
 // YDATA=ADC12MEM2;
  for(int n=4;n>0;n--)
  {
    if(n==4)
      numb = YDATA/1000;
    else if(n==3)
      numb = (YDATA%1000)/100;
    else if(n==2)
      numb = (YDATA%100)/10;
    else
      numb = (YDATA%10);
    wr_address(11+9*i,18+i*9,38,53);
    comm_out(0x005c);
    for(int j=0;j<16;j++)
    {
      unsigned int temp=0x80;
      for(int m=0;m<8;m++)
      {
        tempd=temp>>m;
      if(num[numb][j]&tempd)
        data_out2(0x1f,0xff);
      else
        data_out2(0x00,0x1f);
      }
    }
    i++;
  }
}

void disp_ZDATA()
{
  unsigned int numb,tempd,i=0;
 // YDATA=ADC12MEM2;
  for(int n=4;n>0;n--)
  {
    if(n==4)
      numb = ZDATA/1000;
    else if(n==3)
      numb = (ZDATA%1000)/100;
    else if(n==2)
      numb = (ZDATA%100)/10;
    else
      numb = (ZDATA%10);
    wr_address(11+9*i,18+i*9,55,70);
    comm_out(0x005c);
    for(int j=0;j<16;j++)
    {
      unsigned int temp=0x80;
      for(int m=0;m<8;m++)
      {
        tempd=temp>>m;
      if(num[numb][j]&tempd)
        data_out2(0x1f,0xff);
      else
        data_out2(0x00,0x1f);
      }
    }
    i++;
  }
}


//加上,屏幕开始闪
  void SensorWrite (unsigned int addr,unsigned data)
  {
    TXBUF0 = ((addr&0X3F)<<1)|0x80;   //0--read; 1--write;  bit0--don't care bit
    P3OUT &= ~ CSS;          //Clear Chip Select
    while(0==(UTCTL0&TXEPT));
    _NOP();
    TXBUF0 = data;
    while (0==(UTCTL0&TXEPT));
    _NOP();
    P3OUT |= CSS;
  }

int SensorRead(int addr)
{ 
  
  P3OUT &= ~ CSS;          //Clear Chip Select
     
    TXBUF0 = ((addr&0X3F)<<1);   //0--read; 1--write;  bit0--don't care bit
   while (0==(UTCTL0&TXEPT));
  // while (!(IFG1&URXIFG0));
    _NOP();

    TXBUF0 = 0x00;    
   while (0==(UTCTL0&TXEPT));
    //_NOP();

    //while (!(IFG1&URXIFG0));
    P3OUT |= CSS;
    return RXBUF0;
} 

void SensorInit(void)
{  
  SensorWrite(0x0D,0x80); //I2C总线关闭,spi使能
  SensorWrite(0x16,0x05);//0x51--4线SPImode,INT2读取数据准备状态,2g测试,自测未使能
  //testd=SensorRead(0x16);
  SensorWrite(0x17,0x03);//清除INT1、INT2的标志位
  SensorWrite(0x17,0x00);
  SensorWrite(0x18,0x80);//0X80--250  Hz; 0X00--125Hz , 0XC0 -- +/-
  SensorWrite(0x1A,0x00);//设置0x1A寄存器:Level detection threshold limit value
  SensorWrite(0x19,0x00);
  SensorWrite(0x10,0x00);   //XOFFSET(0x20),更改后结果不对
  SensorWrite(0x11,0x00);
  SensorWrite(0x12,0x00);  //YOFFSET(0x60),更改后结果不对
  SensorWrite(0x13,0x00);   
  SensorWrite(0x14,0x00);  //ZOFFSET(0x1c),更改后结果不对
  SensorWrite(0x15,0x00);
  SensorWrite(0x1D,0x00);//设置0x1d寄存器:Latency time value
  SensorWrite(0x1E,0x00);//设置0x1e寄存器:Time window for 2nd pulse value  
 /*
  SensorWrite(0x1B,0x00);//设置0x1B寄存器:Pulse detection threshold limit value
  SensorWrite(0x1C,0x00);//设置0x1C寄存器:Pulse duration value
 
 */
}

void main()
{
  /*
  SysInit();
  IOInit();
  oledon();
  oledclear();
  comm_out(0x00af);  //Display on
 
  //UART1 配置 
  U0CTL = SWRST;
  U0CTL |= CHAR +SYNC +MM ;  //设置为SPI主机,8位发送;SPI复位
  U0TCTL = 0x00;
  U0TCTL |= CKPH+SSEL1+STC ;  // 时钟边沿选择,并选SMCLK为时钟源,设置为3线SPI
  U0BR0 = 0X00;            
  U0BR1 = 0X7d;        //波特率:0X7D00对应250HZ;0XfA00对应125HZ;
  U0MCTL = 0X00;          //同步时设为0X00;异步时为小数调整部分
  ME1 = USPIE0;  //SPI模块使能
  U0CTL &= ~SWRST;  //SPI复位置零
  IE1 |= URXIE0;  //+ UTXIE0接收中断使能

  int i =500;
  do (i--);
  while (i != 0);  //等待一段时间,使SPI同步
  SensorInit(); 
  while(1)
   {  
     XDATA = SensorRead(0x00);
     disp_XDATA();
     YDATA = SensorRead(0x02);
     disp_YDATA();
     ZDATA = SensorRead(0x04); 
     disp_ZDATA();
   }
 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -