📄 7455_mps430.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 + -