单双击通讯程序
0赞
发表于 3/1/2012 9:23:42 AM
阅读(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; } } */
