#include "wangjunqiang.h"
#define uchar unsigned char
#define uint unsigned int
//CS 接3.3V
#define sda PCout(6) //I2C 时钟传送位
#define scl PCout(7) //I2C 时钟传送位
//IO方向设置
#define SDA_IN() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=8<<6;}
#define SDA_OUT() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=3<<6;}
#define IIC_READ 0x1D //定义读指令
#define IIC_WRITE 0x1D //定义写指令
uchar table1[16]=" MMA7455 X= 0.00"; //1602显示数据
uchar table2[16]=" Y= 0.00 Z= 0.00";
uchar table3[16]="No Find MMA7455!";
uchar table4[10]="0128345679";
uchar table5[8] =" MMA7455";
uchar table7[16]="Value: X=0.50 ";
void iic_delay() //5us延时
{
delay_us(5);
}
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--);
}
/*********************************************************************/
/************** I2C通信部分 ***************/
/*********************************************************************/
void iic_start() //函数功能:I2C通信开始
{
SDA_OUT();
sda=1;
iic_delay();
scl=1;
iic_delay();
sda=0;
iic_delay();
}
void iic_stop() //函数功能:I2C通信停止
{
SDA_OUT();
sda=0;
iic_delay();
scl=1;
iic_delay();
sda=1;
iic_delay();
}
void iic_ack() //函数功能:I2C通信查应答位
{
SDA_OUT();
sda=1;
scl=1;
iic_delay();
scl=0;
}
void iic_write_byte(uchar wdata) //函数功能:向I2C从机写入一个字节
{
uchar i,temp,temp1;
SDA_OUT();
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) //函数功能:从I2C从机中读出一个字节
{
uchar x;
char data_data;
SDA_IN();
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;
}
return data_data;
}
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) //函数功能:按地址读出一字节数据
{
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;
}
/************************************************************************/
/************* LED显示阵列部分 **************/
/************************************************************************/
char self_test7455(void) //函数功能:检测7455有没有插好
{ // 如果没有插好,1602将会显示
uchar j; // “No acceleration!"
char t;
delay_50us(10);
iic_write(0x16,0x05);
delay_50us(20);
t=iic_read(0x16);
if(t!=0x05)
{
write_1602_com(0x80);
for(j=0;j<16;j++)
{
write_1602_dat(table3[j]);
delay_50us(10);
}
return 0;
}
return 1;
}
void Testinit1602()
{
char j;
write_1602_com(0x80);
for(j=0;j<16;j++)
{
write_1602_dat(table1[j]);
delay_50us(10);
}
write_1602_com(0x80+0x40);
for(j=0;j<16;j++)
{
write_1602_dat(table2[j]);
delay_50us(10);
}
}
void sendx() //函数功能:向1602发送x轴测量数据
{
uchar x1,x2,x3,xsign;
char x;
x=iic_read(0x06);
if((x&0x80)==0x00)
{
xsign=0x2b; //+
}
else
{
xsign=0x2d; //-
x=x-0x01;
x=~x;
}
x1=(x/63);
x2=((x*100/63)%100)/10;
x3=(x*100/63)%10;
write_1602_com(0x8B);
write_1602_dat(xsign);
delay_50us(10);
write_1602_com(0x8C);
write_1602_dat(table4[x1]);
delay_50us(10);
write_1602_com(0x8E);
write_1602_dat(table4[x2]);
delay_50us(10);
write_1602_com(0x8F);
write_1602_dat(table4[x3]);
delay_50us(20);
}
void sendy() //函数功能:向1602发送y轴测量数据
{
uchar y1,y2,y3,ysign;
char y;
y=iic_read(0x07);
if((y&0x80)==0x00)
{
ysign=0x2b; //+
}
else
{
ysign=0x2d; //-
y=y-0x01;
y=~y;
}
y1=(y/63);
y2=((y*100/63)%100)/10;
y3=(y*100/63)%10;
write_1602_com(0xC3);
write_1602_dat(ysign);
delay_50us(10);
write_1602_com(0xC4);
write_1602_dat(table4[y1]);
delay_50us(10);
write_1602_com(0xC6);
write_1602_dat(table4[y2]);
delay_50us(10);
write_1602_com(0xC7);
write_1602_dat(table4[y3]);
delay_50us(20);
}
void sendz() //函数功能:向1602发送z轴测量数据
{
uchar z1,z2,z3,zsign;
char z;
z=iic_read(0x08);
if((z&0x80)==0x00)
{
zsign=0x2b; //+
}
else
{
zsign=0x2d; //-
z=z-0x01;
z=~z;
}
z1=(z/63);
z2=((z*100/63)%100)/10;
z3=(z*100/63)%10;
write_1602_com(0xCB);
write_1602_dat(zsign);
delay_50us(10);
write_1602_com(0xCC);
write_1602_dat(table4[z1]);
delay_50us(10);
write_1602_com(0xCE);
write_1602_dat(table4[z2]);
delay_50us(10);
write_1602_com(0xCF);
write_1602_dat(table4[z3]);
delay_50us(20);
}
int main(void)
{
uchar j;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LCD_Init();
lcd1602_init();
lcd_clear();
RCC->APB2ENR|=1<<4; //使能PORTB时钟
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=3<<6;
self_test7455();
iic_write(0x10,0x15);//校正X值
iic_write(0x12,0x25);//校正Y值
iic_write(0x14,0x10);//校正Z值
delay_50ms(2);
write_1602_com(0x80);
for(j=0;j<8;j++)
{
write_1602_dat(table5[j]);
delay_50us(10);
}
while(1)
{
//是否安插模块
if(1)
{
{
iic_write(0x10,0x15);//校正X值
iic_write(0x12,0x25);//校正Y值
iic_write(0x14,0x10);//校正Z值
delay_50ms(2);
write_1602_com(0x80);
for(j=0;j<8;j++)
{
write_1602_dat(table5[j]);
delay_50us(10);
}
Testinit1602();
//测试
}
while(1)
{
if(1)
{
sendx();
//delay_50ms(1);
sendy();
//delay_50ms(1);
sendz();
delay_50ms(6);
}
else
break;
}
}
}
}
原子哥,不知道IIC哪里错了,在51上可以实现的,端口不知怎么配置,原子哥,帮帮忙啊 |