在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → STM32结合TFT显示重力传感器X、Y、Z的数值

STM32结合TFT显示重力传感器X、Y、Z的数值

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.25M
  • 下载次数:11
  • 浏览次数:91
  • 发布时间:2021-06-03
  • 实例类别:嵌入式开发
  • 发 布 人:张1835828080
  • 文件格式:.rar
  • 所需积分:2
 相关标签: STM32 STM3 TFT 传感器 stm

实例介绍

【实例简介】STM32结合彩色TFT结合重力传感器实验程序

【实例截图】

from clipboard

【核心代码】

#include "prohead.h"//TFT原有的1111111111///////////////按键调光也要用333333重力加速度也要用444444444444
#include "system.h"//////////////////加入转灯程序用的22222222222222222222222
#include "led.h"/////////////////////加入转灯程序用的222222222222222222222222
#include "driver.h" //TFT原有的11111111111111111111
#include "driverzhong.h" ///////////////////////////////////////////////////重力加速度要用11111111111111111111
#include "I2C.h"///////////////////////////////////////////////////////////重力加速度要用11111111111111111111
#include "Driverled.h" ////////////////////////////////按键调光也要用的33333
#include "lcdlib.h"//TFT原有的11111111111111111111111111111111111111111111111
#include "iImag1.h"//TFT原有的11111111111111111111111111111111111111111111111
void DIS_Delayms(u16 Num);
//***************************************************************
// 深圳EU电子出品-版权所有-翻版必究
//*************程序从这里执行**************************************************
/*-------------------------------------------------------------------------------------------------------
*  重力传感器  
-------------------------------------------------------------------------------------------------------*/
//MMA7660FCX I2C读写地址
#define MMA7660ADRW   0x98   // write address
#define MMA7660ADRR   0x99 // read address
//输出方向值
enum{
DIRT0,   //正向
DIRT1,      //左向
DIRT2,      //右向
DIRT3       //反向
};
//重力传感器Pola状态(过去.现在)
u8 Pre_PoLaStatus, Cur_PoLaStatus;  
//方向输出控制
bool DirtOutputFlag = False; 
//系统方向值
u8 Dirt_Vaule = DIRT0;
//内部寄存器地址 Xout/TILT
const u8 AddressXout[] = {0x00}, AddressTILT[] = {0x03}; 
//方向检测控制
bool Dirt_CheckFlag = True;
//开启模块并执行初始化
void DirtModeOn(void)
{
/* 0x07模式寄存器,待机模式, 自动睡眠计数器分频系数为 1 */ 
u8 Data1[]= {0x07,0x00};
/*0x05--Sleep Count Register ,0xff--32秒后进入睡眠状态,0x03--前后左右上下方向改变,产生中断*/
u8 Data2[]= {0x05,0xff,0x03};
/*0x08--Sample Rate Register,在活跃状态下 8 samples/second ,
在睡眠状态下,1 sample/second,2个测量样本相匹配,则更新TILT寄存器 */
u8 Data3[]= {0x08,0x3c,0xe0,0x00};
/* 0x07模式寄存器,活跃模式,自动睡眠使能,自动唤醒使能, 自动睡眠计数器分频系数为 1 */
/*中断推挽输出,低电平有效(下降沿)*/
u8 Data4[]={0x07,0x59};
I2C_ON();
I2C_Send(MMA7660ADRW,Data1,TWO); //在对其他寄存器进行操作前,应该先让mma7660处于待命模式
I2C_Send(MMA7660ADRW,Data2,THREE); //初始化自动 睡眠寄存器(0x05)和中断 配置寄存器(0x06)
I2C_Send(MMA7660ADRW,Data3,FOUR);   //设置采样率,不使能tap检测,
I2C_Send(MMA7660ADRW,Data4,TWO); //进入active模式
//Driver_I2COFF();
}
//x/y/z-out加速度对应值
//0 :1-22  -:63-42 
const u16 G_Num[] = {0, 47, 94, 141, 188, 234, 281, 328, 375, 422, 469, 516, 563, 609, 656, 703, 750, 797, 844, 891, 938, 984, 1000};
//当前加速度值0-2000
u16 XOut = 0;
u16 YOut = 0;
u16 ZOut = 0;
u16 count=0;
u16 count1=0;
u16 count2=0;
int main(void)
{
u16 xx;
u16 yy;
u16 colorf;
u16 colorb;
int s;
//int ledn;//led延时用
 // int leds;//led闪烁用
   //u16 count;
//重力MCU初始化
Driver_MCU_Initzhong();
//方向传感器
    DirtModeOn();
Driver_MCU_Init();//对MCU初始化,定义各个端口
                  //(TFT和调光程序都要初始化,都用这个)。
LCD_Init();//TFT初始化
LED_Init();//对LED端口初始化,使LED可以闪烁。
Driver_LcdBacklight(True);//开背光 
LCD_ClrScr(GREEN);//lcd清屏幕为某色(绿色)
//开机LOGO
DIS_Delayms(200);
LCD_DisARectangular(10, 5, 10, 69, YELLOW);//在x0,y0 ~ x1,y1位置处,显示一个颜色为Color的长方形
LCD_DisGB2312String16x16(10, 5, "彩屏实验", BLUE, YELLOW);//在x0,y0位置显示一汉字字符串,颜色为fColor,背景色为bColor
LCD_DisABorder(26, 5, 42, 69, WHITE);//在x0,y0 ~ 对角x1,y1,画一个颜色为Color的矩形边框
LCD_DisASCString16x8(26, 5, "X", WHITE, RED);//在x0,y0位置显示一个ASC字符,颜色为fColor,背景色为bColor
LCD_DisGB2312String16x16(26, 13, "轴", WHITE, RED);
LCD_DisASCString16x8(26, 29, ":", WHITE, RED);
LCD_DisALine(43, 5, 1, 64, RED);//在x0,y0位置显示一条直线(dir:横向1/纵向2),长度为lenth,颜色为color
LCD_DisALine(44, 5, 1, 64, RED);

LCD_DisABorder(60, 5, 42, 69, WHITE);//在x0,y0 ~ 对角x1,y1,画一个颜色为Color的矩形边框
LCD_DisASCString16x8(60, 5, "Y", WHITE, RED);//在x0,y0位置显示一个ASC字符,颜色为fColor,背景色为bColor
LCD_DisGB2312String16x16(60, 13, "轴", WHITE, RED);
LCD_DisASCString16x8(60, 29, ":", WHITE, RED);
LCD_DisALine(77, 5, 1, 64, RED);//在x0,y0位置显示一条直线(dir:横向1/纵向2),长度为lenth,颜色为color
LCD_DisALine(78, 5, 1, 64, RED);
LCD_DisABorder(94, 5, 42, 69, WHITE);//在x0,y0 ~ 对角x1,y1,画一个颜色为Color的矩形边框
LCD_DisASCString16x8(94, 5, "Z", WHITE, RED);//在x0,y0位置显示一个ASC字符,颜色为fColor,背景色为bColor
LCD_DisGB2312String16x16(94, 13, "轴", WHITE, RED);
LCD_DisASCString16x8(94, 29, ":", WHITE, RED);
LCD_DisALine(111, 5, 1, 64, RED);//在x0,y0位置显示一条直线(dir:横向1/纵向2),长度为lenth,颜色为color
LCD_DisALine(112, 5, 1, 64, RED);
DIS_Delayms(200);
LCD_DisGB2312String32x32(260,       75, "热爱图",     BLUE, YELLOW);//32X32的汉字
//ledn=0;
//leds=0;
// Driver_OpenEA();//触摸调光 由Drive.C可知 用A0和G8口接触摸开关控制程序
while(1)
{
u8 Buff[4];
u32 DelayTimer;
//读一次重力传感器的Xout.Yout.Zout.TILT
I2C_Send(MMA7660ADRW, (u8*)AddressXout, 1);   
I2C_Recv(MMA7660ADRR, Buff, 4);   
if(Buff[3]&CHSBIT6)
{
//若设备正在更新状态,再读一次TILT
I2C_Send(MMA7660ADRW, (u8*)AddressTILT, 1);   
I2C_Recv(MMA7660ADRR, &Buff[3], 1);
}
//获取POLA状态位 可用于简单判断方向值(见出厂程序)
Cur_PoLaStatus  = ((Buff[3])>>2)&0x07;
//这里我们获取x/y/z-out值,存于Buff[0],Buff[1],Buff[2]中
//本实验只需用到x-out与y-out值
if(!(Buff[0]&CHSBIT6))
{
//bit6为零 x-out为有效值
static u8 Num = 0;
static s16 Temp[10];
//采集加速度值并转换(-1000~1000)
if(Buff[0] == 0 || (Buff[0] >=1 && Buff[0] <= 22))
Temp[Num ] = G_Num[Buff[0]];
else if(Buff[0] >=42 && Buff[0] <= 63)
{
Buff[0] -= 41;
Buff[0] = 23 - Buff[0];
Temp[Num ] = -G_Num[Buff[0]];
}
//消抖求平均值
if(Num == 10)
{
u8 i;
s16 BuffTemp;
//找出最小值
for(i=0; i<9; i )
if(Temp[i] < Temp[i 1])
{
BuffTemp = Temp[i 1];
Temp[i 1] = Temp[i];
Temp[i] = BuffTemp;
}
//找出最大值
for(i=0; i<8; i )
if(Temp[i] > Temp[i 1])
{
BuffTemp = Temp[i 1];
Temp[i 1] = Temp[i];
Temp[i] = BuffTemp;
}
//计算平均值
XOut = (Temp[0] Temp[1]  Temp[2] Temp[3] Temp[4] Temp[5] Temp[6] Temp[7])/8 1000;
count=XOut;
/* //led显示
if(XOut <= 1000)
{
LED_ON( 0 );
// Driver_LightPWMSet(0, (1000-XOut)/100);
// Driver_LightPWMSet(2, 0);
}
else
{
LED_ON( 2 );
// Driver_LightPWMSet(2, (XOut-1000)/100);
// Driver_LightPWMSet(0, 0);
}
*/ Num = 0;
}
}
if(!(Buff[1]&CHSBIT6))
{
//bit6为零 y-out为有效值
static u8 Num = 0;
static s16 Temp[10];
//采集加速度值并转换(-1000~1000)
if(Buff[1] == 0 || (Buff[1] >=1 && Buff[1] <= 22))
Temp[Num ] = G_Num[Buff[1]];
else if(Buff[1] >=42 && Buff[1] <= 63)
{
Buff[1] -= 41;
Buff[1] = 23 - Buff[1];
Temp[Num ] = -G_Num[Buff[1]];
}
//消抖求平均值
if(Num == 10)
{
u8 i;
s16 BuffTemp;
//找出最小值
for(i=0; i<9; i )
if(Temp[i] < Temp[i 1])
{
BuffTemp = Temp[i 1];
Temp[i 1] = Temp[i];
Temp[i] = BuffTemp;
}
//找出最大值
for(i=0; i<8; i )
if(Temp[i] > Temp[i 1])
{
BuffTemp = Temp[i 1];
Temp[i 1] = Temp[i];
Temp[i] = BuffTemp;
}
//计算平均值
YOut = (Temp[0] Temp[1]  Temp[2] Temp[3]  Temp[4] Temp[5]  Temp[6] Temp[7])/8 1000;
count1=YOut;
/* //led显示
if(YOut <= 1000)
{
LED_ON( 1 );
//Driver_LightPWMSet(1, (1000-YOut)/100);
// Driver_LightPWMSet(3, 0);
}
else
{
LED_ON( 3 );
//Driver_LightPWMSet(3, (YOut-1000)/100);
//Driver_LightPWMSet(1, 0);
}
*/ Num = 0;
}
}
//延时
DelayTimer = 1000;
while(DelayTimer--);
/*
if (leds>1)
{
leds=0;
ledn=0;
}
*/

if (count>999)
{
s=count/1000;//千位取整运算8888
xx=26;
yy=37;
colorf=RED;
  colorb=YELLOW;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb);//千位显示
}  
if (count>99)
{
if (count<=999)
{
  xx=26;
yy=37;
colorf=YELLOW;
  colorb=YELLOW;
s=0;//随便填数,避免延时不准
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb);//千位覆盖
}
//delay(0);
  s=count/100%10;//百位取整求余运算8888
xx=26;
yy=45;
colorf=RED;
  colorb=YELLOW;
LCD_DisASCdong16x8(xx, yy, s,colorf,colorb);//百位显示
}
if (count>9)
{
if (count<=99)
{
xx=26;
yy=37;
colorf=YELLOW;
  colorb=YELLOW;
s=0;//随便填数,避免延时不准
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //千位覆盖
 yy=45;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //百位覆盖
}
s=count%100/10;//十位取整运算8888
xx=26;
yy=53;
colorf=RED;
  colorb=YELLOW;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //十位显示
}
if (count<=9)
{
  xx=26;
yy=37;
colorf=YELLOW;
  colorb=YELLOW;
s=0;//随便填数,避免延时不准
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //千位覆盖
 yy=45;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //百位覆盖
 yy=53;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //十位覆盖
}
s=count%10;//个位取余运算
 xx=26;
yy=61;
colorf=RED;
  colorb=YELLOW;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //个位显示
 

if (count1>999)
{
s=count1/1000;//千位取整运算8888
xx=60;
yy=37;
colorf=RED;
  colorb=YELLOW;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb);//千位显示
}  
if (count1>99)
{
if (count1<=999)
{
  xx=60;
yy=37;
colorf=YELLOW;
  colorb=YELLOW;
s=0;//随便填数,避免延时不准
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb);//千位覆盖
}
//delay(0);
  s=count1/100%10;//百位取整求余运算8888
xx=60;
yy=45;
colorf=RED;
  colorb=YELLOW;
LCD_DisASCdong16x8(xx, yy, s,colorf,colorb);//百位显示
}
if (count1>9)
{
if (count1<=99)
{
xx=60;
yy=37;
colorf=YELLOW;
  colorb=YELLOW;
s=0;//随便填数,避免延时不准
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //千位覆盖
 yy=45;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //百位覆盖
}
s=count1%100/10;//十位取整运算8888
xx=60;
yy=53;
colorf=RED;
  colorb=YELLOW;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //十位显示
}
if (count1<=9)
{
  xx=60;
yy=37;
colorf=YELLOW;
  colorb=YELLOW;
s=0;//随便填数,避免延时不准
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //千位覆盖
 yy=45;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //百位覆盖
 yy=53;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //十位覆盖
}
s=count1%10;//个位取余运算
 xx=60;
yy=61;
colorf=RED;
  colorb=YELLOW;
 LCD_DisASCdong16x8(xx, yy, s,colorf,colorb); //个位显示
DIS_Delayms(5); 

/*
  ledn ;
if (leds>0)
{
Driver_LcdBacklight(1); //Driver_LcdBacklight(0);
}
if (leds<1) //当leds清零时复合此条件
{
Driver_LcdBacklight(1);
}
LED_ON( leds );
leds ;
//count ;
if (Driver_Key1Sta())
{
DIS_Delayms(200);
if (Driver_Key1Sta())
{
count ; 
}
}
else if(Driver_Key2Sta())
{
DIS_Delayms(200);
if (Driver_Key2Sta())
{
count--; 
}

}*/
}
}
  /*------------------------------------------
*  显示延时  
--------------------------------------------*/
void DIS_Delayms(u16 Num)
{
    u16 Timer;
while(Num--)
{
Timer = 25000;
while(Timer--); 
}
}
/*-------------------------------------------------------------------------------------------------------
*  10ms定时中断处理  
-------------------------------------------------------------------------------------------------------*/
/*void Time_IntHandle(void)
{
static u8 Num = ZERO;
if( Num == 20)
{
//----------- 0.2s间隔处理事务 -----------
//触摸调节LED灯光
static u8 Sta = 1;
if(Driver_Key1Sta())
{
//触摸KEYA 调亮
if(Sta < 9)
Sta ;
Driver_LightPWMSet(Sta);
}
else if(Driver_Key2Sta())
{
//触摸KEY3 调暗
if(Sta > ZERO)
Sta--;
Driver_LightPWMSet(Sta);
}
  //--------------------------------------
  Num = ZERO;
}
}
*/


标签: STM32 STM3 TFT 传感器 stm

实例下载地址

STM32结合TFT显示重力传感器X、Y、Z的数值

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警