[mw_shl_code=c,true]/*
* _1602.c
*
* Created: 2014/4/18 16:12:06
* Author: Mfweb
*/
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
unsigned char table0[]="I love you";
unsigned char table1[]="0123456789";
/************************************************************************/
/*以下为陀螺仪定义 */
/************************************************************************/
#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取
/*******************/
//以下为TWI状态定义
//MT:主传输
//MR:主接收
//DATA:数据
//SLA:地址
//ACK:有应答
//NOACK:无应答
/*******************/
#define START 0x80
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
#define RD_DEVICE_ADDR 0xD1//读取的器件地址 需修改 前四位器件固定,后三位看连线,最后一位读写指令位
#define WD_DEVICE_ADDR 0xD0//写入的器件地址
/*******************/
/*******************/
//以下为TWI读写操作
/*******************/
#define Satrt() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动IIC
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止IIC
#define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生
#define TestAck() (TWSR & 0xf8)//观察返回状态
#define SetAck() (TWCR|=(1<<TWEA))//做出ACK应答
#define SetNoAck (TWCR&=~(1<<TWEA))//做出NoAck应答
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}//写数据到TWDR
/*******************/
char X_Z_J[10]="0000000000",Y_Z_J[10]="0000000000",Z_Z_J[10]="0000000000",X_J_J[10]="0000000000",Y_J_J[10]="0000000000",Z_J_J[10]="0000000000";
void twi_init(void)
{
TWBR=0x20;//比特率发生器分频因子
TWCR=0x04;//使能神马的
TWSR=0x00;//1分频
}
//IIC写入 wdata:写入的数据 waddr:写入的地址
unsigned char IIC_Write(unsigned char waddr,unsigned wdata)
{
Satrt();//开始信号
Wait();
if (TestAck()!=START)
return 1;
Write8Bit(WD_DEVICE_ADDR);//写器件地址
Wait();
if (TestAck()!=MT_SLA_ACK)
return 1;
Write8Bit(waddr);//写写入地址
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Write8Bit(wdata);//写数据
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Stop();//停止信号
return 0;
}
unsigned int IIC_Read(unsigned waddr)
{
unsigned int temp;
Satrt();//开始信号
Wait();
if (TestAck()!=START)
return 1;
Write8Bit(WD_DEVICE_ADDR);//写器件地址
Wait();
if (TestAck()!=MT_SLA_ACK)
return 1;
Write8Bit(waddr);//写读取地址
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Satrt();//重新开始信号
Wait();
if (TestAck()!=RE_START)
return 1;
Write8Bit(RD_DEVICE_ADDR);//写读取器件地址
Wait();
if (TestAck()!=MR_SLA_ACK)
return 1;
Twi();//总线重启
Wait();
if (TestAck()!=MR_DATA_ACK)
return 1;
temp=TWDR;
Stop();
return temp;
}
void init_()
{
DDRA=0xff;
PORTA=0x00;
DDRB=0xff;
PORTB=0x00;
DDRC|=(1<<7);
PORTC|=(1<<7);
DDRD|=(1<<7);
PORTD|=(1<<7);
}
void lcd_writecom(unsigned char com)
{
PORTD&=~(1<<7);
PORTA=com;
_delay_ms(5);
PORTC|=(1<<7);
_delay_ms(5);
PORTC&=~(1<<7);
}
void lcd_writedata(unsigned char data)
{
PORTD|=(1<<7);
PORTA=data;
_delay_ms(5);
PORTC|=(1<<7);
_delay_ms(5);
PORTC&=~(1<<7);
}
void lcd_init()
{
PORTB&=~(1<<0);
PORTB&=~(1<<1);
PORTC&=~(1<<7);//使能
lcd_writecom(0x38);
lcd_writecom(0x0c);
lcd_writecom(0x06);
lcd_writecom(0x01);
}
void mp6050_init()
{
IIC_Write(PWR_MGMT_1, 0x00); //解除休眠状态
IIC_Write(SMPLRT_DIV, 0x07);
IIC_Write(CONFIG, 0x06);
IIC_Write(GYRO_CONFIG, 0x18);
IIC_Write(ACCEL_CONFIG, 0x01);
}
int Get1Data(unsigned char REG_Address)
{
char H,L;
H=IIC_Read(REG_Address);
L=IIC_Read(REG_Address+1);
return (H<<8)+L; //合成数据
}
void inttochar(int a,char* p)
{
itoa(a,p,10);
}
void Get6050(void)
{
inttochar(Get1Data(ACCEL_XOUT_H),X_J_J);
inttochar(Get1Data(ACCEL_YOUT_H),Y_J_J);
inttochar(Get1Data(ACCEL_ZOUT_H),Z_J_J);
inttochar(Get1Data(GYRO_XOUT_H),X_Z_J);
inttochar(Get1Data(GYRO_YOUT_H),Y_Z_J);
inttochar(Get1Data(GYRO_ZOUT_H),Z_Z_J);
}
void display(void)
{
unsigned int i;
lcd_writecom(0x80);
for (i=0;i<7;i++)
{
lcd_writedata(X_J_J);
_delay_ms(5);
}
lcd_writedata("-");
_delay_ms(5);
for (i=0;i<7;i++)
{
lcd_writedata(Y_Z_J);
_delay_ms(5);
}
lcd_writedata("-");
_delay_ms(5);
lcd_writecom(0x80+0x40);
for (i=0;i<7;i++)
{
lcd_writedata(X_Z_J);
_delay_ms(5);
}
lcd_writedata("-");
_delay_ms(5);
for (i=0;i<7;i++)
{
lcd_writedata(Y_Z_J);
_delay_ms(5);
}
lcd_writedata("-");
_delay_ms(5);
}
int main(void)
{
unsigned int num;
_delay_ms(1000);
init_();
lcd_init();
twi_init();
mp6050_init();
_delay_ms(1000);
while(1)
{
Get6050();
display();
_delay_ms(200);
lcd_writecom(0x02);
}
}[/mw_shl_code]
|