管理员
  
- 积分
- 165377
- 金钱
- 165377
- 注册时间
- 2010-12-1
- 在线时间
- 2111 小时
|
发表于 2011-5-8 12:37:33
|
显示全部楼层
我们用的是MMA7660.
已经调试出来了,代码给你参考下:
#include "sys.h"
#include "delay.h"
#include "mma7660.h"
#include "lcd.h"
void MMA7660_Init(void)
{
IIC_Init();
MMA7660_WR_Reg(MMA_MODE,0X00); //配置寄存器的时候,必须进入standby模式
MMA7660_WR_Reg(MMA_SPCNT,0X00);
MMA7660_WR_Reg(MMA_INTSU,0X00); //不设置中断
MMA7660_WR_Reg(MMA_PDET,0X75); //
MMA7660_WR_Reg(MMA_SR,0X00);
MMA7660_WR_Reg(MMA_PD,0X17);
MMA7660_WR_Reg(MMA_MODE,0X01); //配置寄存器的时候,必须进入standby模式
}
//在指定位置显示指定数字,包含正负号
void LCD_ShowMNum(u16 x,u16 y,signed char numx)
{
u8 t,temp;
u8 num;
if(numx>=0)
{
num=numx;
LCD_ShowChar(x,y,'+',16,0);
}else
{
num=-numx;
LCD_ShowChar(x,y,'-',16,0);
}
x+=8;
for(t=0;t<2;t++)
{
temp=(num/mypow(10,1-t))%10;
LCD_ShowChar(x+(8)*t,y,temp+'0',16,0);
}
}
void mma_test(void)
{
signed char x,y,z;
LCD_ShowString(80,100,"X:");
LCD_ShowString(80,120,"Y:");
LCD_ShowString(80,140,"Z:");
while(1)
{
x=MMA7660_XYZ_RD(MMA_XOUT);
y=MMA7660_XYZ_RD(MMA_YOUT);
z=MMA7660_XYZ_RD(MMA_ZOUT);
LCD_ShowMNum(96,100,x);
LCD_ShowMNum(96,120,y);
LCD_ShowMNum(96,140,z);
delay_ms(100);
}
}
//写MMA7660寄存器
void MMA7660_WR_Reg(u8 addr,u8 val)
{
IIC_Start();
IIC_Send_Byte(MMA_WRITE); //发送写器件指令
IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送寄存器地址
IIC_Wait_Ack();
IIC_Send_Byte(val); //发送值
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
}
//读MMA7660寄存器
u8 MMA7660_RD_Reg(u8 addr)
{
u8 temp=0;
IIC_Start();
IIC_Send_Byte(MMA_WRITE); //发送写器件指令
temp=IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送寄存器地址
temp=IIC_Wait_Ack();
IIC_Start(); //重新启动
IIC_Send_Byte(MMA_READ); //发送读器件指令
temp=IIC_Wait_Ack();
temp=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NAK
IIC_Stop(); //产生一个停止条件
return temp; //返回读到的值
}
//dir:0,X;1,Y;2,Z
//返回值:+31~-32;
signed char MMA7660_XYZ_RD(u8 dir)
{
u8 i,j;
u8 temp;
signed char res;
signed char val[10];
for(i=0;i<10;i++)//读取
{
do
{
temp=MMA7660_RD_Reg(dir);
}while(temp&(1<<6));//需要再次读取
res=temp&0x1f;//得到真正的数值
if(temp&(1<<5))val=res-31;//反方向
else val=res;//正方向
}
for(i=0;i<9;i++)//排序
{
for(j=i+1;j<10;j++)
{
if(val>val[j])//升序排列
{
res=val;
val=val[j];
val[j]=res;
}
}
}
res=0;
for(i=3;i<7;i++)res+=val;
return res/4;//取平均值
}
|
|