/*------------------------------------------------------------------------------------------------------------------------------*/
/* Copyright (C), 2009-2011, CIDP, Co., Ltd */
/* FileName: MMA7455.C */
/* Author: 张云博 Version: V1.0 Date: 2011.08.28 */
/* Description: MMA7455 测试程序程序 */
/* Function List: */
/*------------------------------------------------------------------------------------------------------------------------------*/
#include <reg52.h>
#include <math.h>
#include <intrins.h> //要用到_nop_();函数
#define uchar unsigned char
#define uint unsigned int
/***************************************************************************/
/*********** 单片机引脚定义 ************/
/***************************************************************************/
sbit MMA_CS= P2^2; // 使能IIC通信
sbit SDA = P2^1; // I2C 数据传送位
sbit SCL = P2^0; // I2C 时钟传送位
sbit rs = P2^6; // 1602RS控制位
sbit rw = P2^5; // 1602RW控制位
sbit e = P2^7; // 1602E 控制位
/****************************************************************************/
/********** 数据部分 ***********/
/****************************************************************************/
#define IIC_READ 0x1D //定义读指令
#define IIC_WRITE 0x1D //定义写指令
uchar set_key_sign; //是否在设置状态标志
uchar delaysign; //视觉停留标志
uchar xposivalue; //x正方向满格显示g值
uchar xnegavalue; //x反方向满格显示g值
uchar yposivalue; //y正方向满格显示g值
uchar ynegavalue; //y反方向满格显示g值
uchar xposilightnum; //x正方向亮灯数量(1——16)
uchar xnegalightnum; //x反方向亮灯数量(1——16)
uchar yposilightnum; //y正方向亮灯数量(1——8)
uchar ynegalightnum; //x正方向亮灯数量(1——8)
uchar ack_sign; //I2C 应答标志
uchar table1[16]=" hello! X= 0.00"; //1602显示数据
uchar table2[16]=" Y= 0.00 Z= 0.00";
uchar table3[16]="No acceleration!";
uchar table4[10]="0123456789";
uchar table5[8] ="Warning!";
uchar table7[16]="value: X=0.50 ";
/**************************************************************************/
/************ 各延时程序 **************/
/**************************************************************************/
void iic_delay() //5us延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void delay_50ms(uchar t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
/************************************************************************/
/************** 1602显示部分 *****************/
/************************************************************************/
void write_com(uchar com) //函数功能:写指令
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void write_date(uchar dat) //函数功能:写数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void init1602(void) //函数功能:初始化1602
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x38);
write_com(0x01);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
/*********************************************************************/
/************** I2C通信部分 ***************/
/*********************************************************************/
/************************************************************************
函数名称:void iic_start(); //启动总线函数
全局变量:无
参数说明:无
返回说明:无
设 计 人:
版 本:1.0
说 明:
************************************************************************/
void iic_start()
{
SDA = 1;
iic_delay();
SCL = 1;
iic_delay();
SDA = 0;
iic_delay();
}
/************************************************************************
函数名称:void iic_stop(); //结束总线函数
全局变量:无
参数说明:无
返回说明:无
设 计 人:
版 本:1.0
说 明:
************************************************************************/
void iic_stop()
{
SDA = 0;
iic_delay();
SCL = 1;
iic_delay();
SDA = 1;
iic_delay();
}
/************************************************************************
函数名称:void iic_ack(); //应答函数
全局变量:无
参数说明:无
返回说明:无
设 计 人:
版 本:1.0
说 明:
************************************************************************/
void iic_ack()
{
SDA = 1;
SCL = 1;
iic_delay();
ack_sign = SDA;
SCL=0;
}
/************************************************************************
函数名称:void iic_write_byte(uchar wdata); //字节数据传送函数
全局变量:无
参数说明:wdata(需要发送的数据)
返回说明:无
设 计 人:
版 本:1.0
说 明:发送一个字节到IIC芯片中
************************************************************************/
void iic_write_byte(uchar wdata)
{
uchar i,temp,temp1;
temp1 = wdata;
for (i = 0; i < 8; i++)
{
SCL = 0;
iic_delay();
temp = temp1;
temp = temp & 0x80;
if( temp == 0x80)
SDA = 1;
else
SDA = 0;
iic_delay();
SCL = 1;
iic_delay();
SCL=0;
iic_delay();
temp1 = temp1 << 1;
}
}
/************************************************************************
函数名称:char iic_read_byte(void); //字节数据读取函数
全局变量:无
参数说明:无
返回说明:读取到的一个字节
设 计 人:
版 本:1.0
说 明:从IIC芯片中读取一个字节数据
************************************************************************/
char iic_read_byte(void)
{
uchar x;
char data_data;
for (x = 0; x < 8; x++)
{
data_data=data_data<<1;
SDA = 1;
iic_delay();
SCL = 0;
iic_delay();
SCL = 1;
iic_delay();
if (SDA == 1)
data_data|=0x01;
//else
// data_data&=0xfe;
}
return data_data;
}
/************************************************************************
函数名称:void iic_write(uchar byte_add,uchar wdata);//指定地址写数据函数
全局变量:无
参数说明:byte_add(地址) wdata(数据)
返回说明:无
设 计 人:
版 本:1.0
说 明:启动总线,发送地址,写入数据结束总线
************************************************************************/
void iic_write(uchar byte_add,uchar wdata)
{
uchar t;
t = (IIC_WRITE << 1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
iic_write_byte(wdata);
iic_ack();
iic_stop();
}
/************************************************************************
函数名称:char iic_read(uchar byte_add); //指定地址读数据函数
全局变量:无
参数说明:byte_add(地址)
返回说明:数据值(x)
设 计 人:
版 本:1.0
说 明:启动总线,发送地址,读取数据,结束总线
************************************************************************/
char iic_read(uchar byte_add)
{
uchar t;
char x;
t = (IIC_WRITE << 1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
t = ((IIC_READ << 1) | 0x01);
iic_start();
iic_write_byte(t);
iic_ack();
x = iic_read_byte();
iic_ack();
iic_stop();
return x;
}
void self_test7455() //自检的同时相当于初始化(写0x16寄存器)
{
uchar j;
char t;
MMA_CS = 1;
delay_50us(10);
iic_write(0x16,0x05);
delay_50us(20);
t = iic_read(0x16);
if (t != 0x05)
{
write_com(0x80);
for ( j = 0; j < 16; j++)
{
write_date(table3[j]);
delay_50us(10);
}
while(1);
}
else
{
write_com(0x80);
for(j = 0; j < 16; j++)
{
write_date(table1[j]);
delay_50us(1