新手入门
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2014-5-10
- 在线时间
- 0 小时
|
5金钱
我用的是原子哥给的MMA7660程序,希望在OLED上面显示7660的x,y,z的值和18b20的温度值,可是加上下面程序中红色背景的程序后OLED上面就不显示主程序中while中的程序,我仿真了一下觉得是进入了蓝色背景中temp=MMA7660_RD_Reg(dir);
}while(temp&(1<<6));//需要再次读取 的死循环 ,我是个菜鸟,希望大神们帮帮我,挺急的
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "mma7660.h"
#include "oled.h"
#include "ds18b20.h"
//写MMA7660寄存器
void MMA7660_WR_Reg(u8 addr,u8 val)
{
IIC_Start();
IIC_Send_Byte(MMA_WRITE); //发送写器件指令
IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送寄存器地址
IIC_Wait_Ack();
IIC_Send_Byte(val); //发送值
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
}
//读MMA7660寄存器
u8 MMA7660_RD_Reg(u8 addr)
{
u8 temp=0;
IIC_Start();
IIC_Send_Byte(MMA_WRITE); //发送写器件指令
temp=IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送寄存器地址
temp=IIC_Wait_Ack();
IIC_Start(); //重新启动
IIC_Send_Byte(MMA_READ); //发送读器件指令
temp=IIC_Wait_Ack();
temp=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NAK
IIC_Stop(); //产生一个停止条件
return temp; //返回读到的值
}
//dir:0,X;1,Y;2,Z
//返回值:+31~-32;
signed char MMA7660_XYZ_RD(u8 dir)
{
u8 i,j;
u8 temp;
signed char res;
signed char val[10];
for(i=0;i<10;i++)//读取
{
do
{
temp=MMA7660_RD_Reg(dir);
}while(temp&(1<<6));//需要再次读取
res=temp&0x1f;//得到真正的数值
if(temp&(1<<5))val=res-31;//反方向
else val=res;//正方向
}
for(i=0;i<9;i++)//排序
{
for(j=i+1;j<10;j++)
{
if(val>val[j])//升序排列
{
res=val;
val=val[j];
val[j]=res;
}
}
}
res=0;
for(i=3;i<7;i++)res+=val;
return res/4;//取平均值
}
void MMA7660_Init(void)
{
IIC_Init();
MMA7660_WR_Reg(MMA_MODE,0X00); //配置寄存器的时候,必须进入standby模式
MMA7660_WR_Reg(MMA_SPCNT,0X00);
MMA7660_WR_Reg(MMA_INTSU,0X00); //不设置中断
MMA7660_WR_Reg(MMA_PDET,0X75); //
MMA7660_WR_Reg(MMA_SR,0X00);
MMA7660_WR_Reg(MMA_PD,0X17);
MMA7660_WR_Reg(MMA_MODE,0X01); //配置寄存器的时候,必须进入standby模式
}
//显示x,y,z的值
int main(void)
{
short temp;
signed char x,y,z;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
OLED_Init(); //初始化液晶
DS18B20_Init();
MMA7660_Init();
OLED_ShowString(0,0,"designed by ZC");
OLED_ShowString(0,16,"x= y= z=");
OLED_ShowString(0,48,"n=");
OLED_Refresh_Gram();
while(1)
{
OLED_Refresh_Gram();
temp=DS18B20_Get_Temp();
OLED_ShowString(0,32,"Temp is:");//显示温度
OLED_ShowNum(65,32,temp/10,2,16);
OLED_ShowString(80,32,".");
OLED_ShowNum(90,32,temp%10,1,16);
OLED_ShowString(100,32,"C");
x=MMA7660_XYZ_RD(MMA_XOUT);
y=MMA7660_XYZ_RD(MMA_YOUT);
z=MMA7660_XYZ_RD(MMA_ZOUT);
OLED_ShowNum(15,16,x,2,16);
OLED_ShowNum(56,16,y,2,16);
OLED_ShowNum(100,16,z,2,16);
delay_ms(300);
}
}
|
|