freedomhit

单双击通讯程序

0
阅读(2873)

 

#include
#include"IIC.h"
#include "OCM12864.h"
#define slave 0xA6
#define  time  10000
#define count 0			   //读取字节数=count+1;
int i ;
unsigned char Aspeed[6];		   //从ADXL345寄存器中读出来的6个值组成的数组
extern unsigned int ValueX,ValueY,ValueZ;	  //	 对取出的数重新组合,为绝对值	
extern int XAPP,YAPP,ZAPP;	//处理后的加速度值

void delay(int lengh)
{
	while(lengh>0)
	lengh--;
}
void write(unsigned char slvadd,unsigned char subadd,char data)
{
	I2C1MTX=subadd;						  //		装载子地址
	I2C1ADR=slvadd;							//		装载从机地址
	while((I2C1FSTA&0X30)!=0X00){}			//		等待FIFO发送成功
							//
	I2C1MTX=data;							//		向子地址中装载数据
	while((I2C1FSTA&0X30)!=0X00){}			//		等待FIFO发送完成
	delay(time);							 //
	I2C1CCNT=0X80;							  //	 停止信号
}
void read(unsigned char slvadd,unsigned char subadd)
{
	I2C1MTX=subadd;							 //		   装载子地址
	I2C1ADR=slvadd;							  //	   装载从机地址
	while((I2C1FSTA & 0X30)!= 0x00)	{}			  //	   等待FIFO发送成功
	delay(4000);							  //	   长延时
	I2C1CNT=count;							  //	   在从机中一次读出的字节数   (默认值为0,表示一个字节)
	I2C1ADR=slvadd+1;						  //	   装载从机地址(LSB=1,主机读)
//	while((I2C1FSTA&0XC0)!=0X80){}			  //	   等待数据接收完成
//	I2C1CCNT=0X80;							  //		停止信号
}
void Init_ADXL345()
{
   write(slave,0x31,0x0B);   //测量范围,正负16g,13位模式
   write(slave,0x2C,0x08);   //速率设定为12.5 参考pdf13页
   write(slave,0x2D,0x08);   //选择电源模式   参考pdf24页
 //  write(slave,0x2E,0x80);   //使能 DATA_READY 中断
   write(slave,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
   write(slave,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
   write(slave,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
  
   write(slave,0x2E,0X60);		 //INT_ENABLE,能检测单击‘双击或两者都能
   write(slave,0x2A,0X04);		  //TAP_AXES,激活对单击/双击检测的任意一个参与轴
   write(slave,0x1d,0x30);	   //THRESH_TAP,保存敲击中断阙值,无符号,与敲击事件的幅度比较,比例因子62.5/LSB ,3g
   write(slave,0x21,0X20);		 //DUR,最大敲击时间, 比例因子为625us/LSB ,10MS
   write(slave,0x22,0X24);     //latent,最大延迟时间,  比例因子为1.25ms/LSB ,10MS
   write(slave,0x23,0Xff);		  //window,延迟时间的间隔,  1.25ms/LSB	,80MS
   write(slave,0x24,0X10);	
 //  write(slave,0x2F,0x20);
} 
void Init_IIC(void)
{
//	GP0CON=0X00;	 //配置P0.4外部中断IRQ0;
	GP1CON=0X2200; //配置P1.2,P1.3 为SCL和SDA;
	I2C1DIV=0X3232;//配置串行时钟的速率为100kHz
					//400k 0x3232
	I2C1CFG=0X82;//使能主机并且使能主机时钟	
   // IRQEN=XIRQ0_BIT; 
	Init_ADXL345();
//	IRQ =  MY_IRQ_FOUNCTION;
}
void single_tap()
{
	read(slave,0x30);
	if(I2C1MRX&0x20) 
	{
		 disp_str(30,2,"double_tap");
		 delay(1000000);
		 //while(I2C1MRX&0X20){};	
		  clear_screen(0);
	}
	else if(I2C1MRX&0x40)
	{
		  disp_str(30,3,"single_tap");
		 // while(I2C1MRX&0X40){};
		  delay(1000000); 
		   clear_screen(0);	
	}
}
/*
void Value_ADXL345()

{	 

//	float temp;
    delay(10000);
//	write(slave,0x31,0x0b);
//	read(slave,0x00);
    read(slave,0x32); 
	for(i=0;i<6;i++)
	{
		while((I2C1FSTA&0XC0)!=0X80){}
		Aspeed[i]=I2C1MRX;	
	//	delay(400);导致出错
	}  // GP4DAT=0X04000000;
	 ValueX=((Aspeed[1]<<8))|Aspeed[0] ;
	 if(ValueX&0x1000)
	 {
		 ValueX=0xffff-ValueX+1;
		 disp_str(68,2,"-");
	 }
	 else
	 {
	 	 disp_str(70,2,"+");
	 }

     ValueY=((Aspeed[3]<<8))|Aspeed[2] ;
	if(ValueY&0x1000)
	 {
		 ValueY=0xffff-ValueY+1;
		 disp_str(68,4,"-");
	 }
	 else
	 {
	 	 disp_str(70,4,"+");
	 }
	 ValueZ=((Aspeed[5]<<8))|Aspeed[4] ;
	 if(ValueZ&0x1000)
	 {
		 ValueZ=0xffff-ValueZ+1;
		 disp_str(68,6,"-");
	 }
	 else
	 {
	 	 disp_str(70,6,"+");
	 }
	 XAPP=ValueX*3.9; 	
	 YAPP=ValueY*3.9; 
	 ZAPP=ValueZ*3.9; 
}  */
/*
void MY_IRQ_FOUNCTION(void)
{	  
	read(slave,0x30);
	if(I2C1MRX&0x40)
	{
		GP4DAT=0X02000000;
	}
	else if(I2C1MRX&0x20)
	{
		GP4DAT=0X02020000;
	}
} */