|
MPU6050的SDA线接在板子上时1602不能显示数据,把SDA拔下来时就能正常显示了,不是IO冲突的原因,是什么问题呢?(主控MSP430F149)
不应该是硬件的问题 换了个传感器还是这个问题 大家看下代码吧:
main.c- #include <msp430f149.h>
- #include <intrinsics.h>
- #include "MPU6050.h"
- #include "LCD1602.h"
- #include "I2C.h"
- #define CPU_F ((double)8000000)
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
- /*--------------------------------------------------------
- 功能: 系统时钟初始化
- 输入参数: 无
- 输出参数: 无
- --------------------------------------------------------*/
- static void ClockInit(void)
- {
- int i;
- BCSCTL2 |= SELM1+SELS; //MCLK时钟源为XT2CLK,SMCLK时钟源为XT2CLK
- do{
- IFG1&=~OFIFG; //清除震荡标志
- for(i=0;i<100;i++)
- _NOP(); //延时等待
- }
- while((IFG1&OFIFG)!=0); //如果标志为1 ,则继续循环等待
- IFG1&=~OFIFG;
- }
- /*--------------------------------------------------------
- 功能: I/O初始化
- 输入参数: 无
- 输出参数: 无
- --------------------------------------------------------*/
- static void GPIOInit(void)
- {
- P2SEL = 0x00; //设置IO口为普通I/O模式
- //P1SEL = 0x00; //设置IO口为普通I/O模式
- //P1DIR = 0x00; //P1作为输入
- }
- /*--------------------------------------------------------
- 功能: 定时器A初始化
- 输入参数: 无
- 输出参数: 无
- --------------------------------------------------------*/
- static void TimerAInit(void)
- {
- TACTL |= TASSEL_2+TACLR;
- TACCTL0 |= CCIE;
- TACTL |= ID_3+MC0;
- TACCR0 = 1000; //定时1ms
- }
- /*--------------------------------------------------------
- 功能: 主函数
- 输入参数: 无
- 输出参数: 无
- --------------------------------------------------------*/
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD;
-
- /*各模块初始化*/
- ClockInit();
- GPIOInit();
- TimerAInit();
- LCDPort_init();
- LCD_init();
-
- LCD_clear();
- InitMPU6050();
- delay_ms(10);
-
- //_EINT(); //开总中断
-
- while(1)
- {
- LCD_write_str(1,1,"Welcome");
- //delay_ms(3);
- //Display10BitData(GetData(ACCEL_XOUT_H),2,1); //显示X轴加速度
- //Display10BitData(GetData(ACCEL_YOUT_H),7,0); //显示Y轴加速度
- //Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //显示Z轴加速
- }
- }
- /*--------------------------------------------------------
- 功能: 定时器A中断服务程序
- --------------------------------------------------------*/
- # pragma vector = TIMERA0_VECTOR // 提供中断函数的入口地址
- __interrupt void TimerA(void)
- {
- //P3OUT = ~P3OUT; //控制灯闪烁
- }
复制代码 1602.c:MPU6050.c:- /*********************************************************
- MPU6050驱动
- *********************************************************/
- #include "MPU6050.h"
- #include "LCD1602.h"
- #include "I2C.h"
- uchar dis[4]; //显示数字(-511至512)的字符数组
- int dis_data; //变量
- //**************************************
- //初始化MPU6050
- //**************************************
- void InitMPU6050()
- {
- Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
- Single_WriteI2C(SMPLRT_DIV, 0x07);
- Single_WriteI2C(CONFIG, 0x06);
- Single_WriteI2C(GYRO_CONFIG, 0x18);
- Single_WriteI2C(ACCEL_CONFIG, 0x01);
- }
- //**************************************
- //合成数据
- //**************************************
- int GetData(uchar REG_Address)
- {
- char H,L;
- H=Single_ReadI2C(REG_Address);
- L=Single_ReadI2C(REG_Address+1);
- return (H<<8)+L; //合成数据
- }
- //**************************************
- //在1602上显示10位数据
- //**************************************
- void Display10BitData(int value,uchar x,uchar y)
- {
- value/=64; //转换为10位数据
- lcd_printf(dis, value); //转换数据显示
- LCD_write_str(x,y,dis);
- //DisplayListChar(x,y,dis,4); //启始列,行,显示数组,显示长度
- }
- /*--------------------------------------------------------------------
- 功能:整数转字符串(便于在1602上显示)
- --------------------------------------------------------------------*/
- void lcd_printf(uchar *s,int temp_data)
- {
- if(temp_data<0)
- {
- temp_data=-temp_data;
- *s='-';
- }
- else *s=' ';
- *++s =temp_data/100+0x30;
- temp_data=temp_data%100; //取余运算
- *++s =temp_data/10+0x30;
- temp_data=temp_data%10; //取余运算
- *++s =temp_data+0x30;
- }
复制代码 I2C.c: |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|