STM32 ILI9341驱动TFTLCD(八)LCD碰撞小球

发布者:SparklingDreams最新更新时间:2024-05-15 来源: elecfans关键字:STM32  ILI9341  驱动TFTLCD 手机看文章 扫描二维码
随时随地手机看文章

掌握了基本图形的画法后,我们可以开始尝试让这些基本图形变成动态的,就像一种桌面,有很多个小球,相互碰撞并改变小球颜色的动态效果。


要达到这种效果,首先要把这个大问题分解成若干个小问题:



1、先让一个小球在屏幕中运动到边界时能弹回;


2、两个小球同时运动时,除了到达边界弹回,还要两个小球相碰撞时弹回并改变颜色;


3、更多小球同时运动。


1、单球运动


单球运动,就是移动画出来的画空心圆,也就是只要改变圆心就可以实现,但是在画下一个圆之前要把上一次画的圆给清除掉。画完后,接着要判断圆心到边界的距离与半径的大小关系,确定下一次的运动方向。


单球运动函数


//单个球运动,碰到边界改变运动方向

//dir为运动方向的参数

u8 LCD_Drawball(u16 *x,u16 *y,u16 r ,u16 color,u16 dir)

{

  u16 flag_x = 0,flag_y = 0;


  LCD_DrawCircle(*x,*y,r,WHITE);//清除上次的圆

  switch(dir)              //选择运动方向

  {

    case 0:

      flag_x=0;flag_y=0;  

      break;

    case 1:

      flag_x=0;flag_y=1;

      break;

    case 2:

      flag_x=1;flag_y=0;

      break;

    case 3:

      flag_x=1;flag_y=1;

      break;

  }

  if(flag_y==0)

    (*y)++;            //移动圆心

  else if(flag_y==1)

    (*y)--;            //移动圆心

  if(flag_x==0)

    (*x)++;            //移动圆心

  else if(flag_x==1)  

    (*x)--;           //移动圆心

  LCD_DrawCircle(*x,*y,r,color);//画出移动后的圆


  if((*y)-r<=0)    //判断边界

    flag_y = 0;    //确定下次的运动方向

  if((*y)+r >=320)  //判断边界

    flag_y = 1;   //确定下次的运动方向

  if((*x)-r<=0)    //判断边界

    flag_x = 0;   //确定下次的运动方向

  if((*x)+r >=240)  //判断边界

    flag_x = 1;   //确定下次的运动方向


  if((flag_x==0)&(flag_y==0))dir=0;  

  if((flag_x==0)&(flag_y==1))dir=1;

  if((flag_x==1)&(flag_y==0))dir=2;

  if((flag_x==1)&(flag_y==1))dir=3;


  return dir;    //返回下一次的运动方向

}

主函数


#include 'stm32f4xx.h'

#include 'core_cm4.h'

#include 'ili9341.h'

#include 'lcd.h'



int main()

{

  u16 x1=30,y1=30,r1=20,dir1=0,color1=RED;


  ILI9341_Init();                  //ILI9341初始化

  while(1)

  {

    dir1=LCD_Drawball(&x1,&y1,r1,color1,dir1);

  }

}

2、双球运动


双球运动要在单球运动的基础上,再加上双球碰撞的判断函数。可以计算两个圆心的距离和两个圆的半径的大小关系,判断是否相碰撞,如果碰撞就对调运动方向,再改变颜色。


判断两球碰撞函数


//如果两个球碰撞,改变运动方向,颜色

void IfTwoBallCrash(u16 x1,u16 y1,u16 r1,u16 *color1,u16 *dir1,u16 x2,u16 y2,u16 r2,u16 *color2,u16 *dir2)

{

  u16 temp;

  if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=((r1+r2)*(r1+r2)))

  {

    temp=(*dir1);

    (*dir1)=(*dir2);

    (*dir2)=temp;

    (*color1)+=5000;

    (*color2)+=5000;

  }

}

由于要改变原有的数据,所以函数的传参要为指针类型。


主函数


#include 'stm32f4xx.h'

#include 'core_cm4.h'

#include 'ili9341.h'

#include 'lcd.h'



int main()

{

  u16 x1=30,y1=30,r1=20,dir1=0,color1=RED;

  u16 x2=100,y2=30,r2=20,dir2=1,color2=IRON_GRAY;


  ILI9341_Init();                  //ILI9341初始化

  while(1)

  {

    dir1=LCD_Drawball(&x1,&y1,r1,color1,dir1);

    dir2=LCD_Drawball(&x2,&y2,r2,color2,dir2);

    IfTwoBallCrash(x1,y1,r1,&color1,&dir1,x2,y2,r2,&color2,&dir2);

  }

}

```**3、多球运动**


多球运动同样可以通过调用以上两个函数实现,这里就不再进行分析了。


关键字:STM32  ILI9341  驱动TFTLCD 引用地址:STM32 ILI9341驱动TFTLCD(八)LCD碰撞小球

上一篇:STM32 ILI9341驱动TFTLCD(九)LCD显示ASCIIII
下一篇:STM32驱动ESP8266连接阿里云(1)----使用AT指令连接阿里云

推荐阅读最新更新时间:2024-11-07 10:20

使用STM32定时器输出任意相位差的方波
方法十分简单,不用说明,看图即知(这里画了2路输出,同样道理可以产生3路甚至4路输出)
[单片机]
使用<font color='red'>STM32</font>定时器输出任意相位差的方波
基于STM32单片机的工业循环水极化控制系统设计
0 引言 工业生产中的循环水系统在运行中对淡水消耗非常大,同时,为防止工业设备结垢等现象,需要对循环水不断添加各种化学药剂,且需要不断地排放污水、补充新鲜水,这样既对水资源造成了很大的浪费又污染环境。鉴此,笔者设计了一种基于ARM的工业循环水极化控制系统。该系统通过极化场对水的极化作用 ,实现对工业循环水的处理功能,达到减少水资源消耗、避免使用化学药剂、有效防止水资源污染的目的。 1 系统总体设计方案 基于ARM 的工业循环水极化控制系统采用ST公司的STM32F103微控制器作为主控制核心,由极化能量检测电路实时检测循环水水质参数,经STM32F103运算处理后,由极化能量输出电路调整极化能量的输出,由LCD显示电路实时显
[单片机]
基于<font color='red'>STM32</font>单片机的工业循环水极化控制系统设计
基于Cortex-M3的STM32微控制器处理先进电机控制方法
变频器的问世和先进的电机控制方法让三相无刷电机(交流感应电机或永磁同步电机)曾经在调速应用领域取得巨大成功。这些高性能的电机驱动器过去主要用于工厂自动化系统和机器人。十年来,电子元器件的大幅降价使得这些电机驱动器能够进入对成本敏感的市场,例如:家电、空调或个人医疗设备。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M3 内核的STM32系列微控制器为例论述这个过程。 图 3 : STM32: 强固的增长基础 首先,我们回顾一下电机控制的基本原理。在电机控制系统内,为什么处理器非常重要?我们为什么需要非常好的计算性能?毕竟,
[单片机]
基于Cortex-M3的<font color='red'>STM32</font>微控制器处理先进电机控制方法
STM32 —— LIN
/* LIN 总线的主要特性有 单主机 多从机概念 基于普通 UART/SCI 接口的低成本硬件实现 低成本软件或作为纯状态机 从机节点不需要石英或陶瓷谐振器可以实现自同步 保证信号传输的延迟时间 低成本的单线设备 速度高达 20kbit/s 总线的通讯由单个主机控制 每个报文帧都用一个分隔信号起始 ,一个同步场和一个标识符场 . 这些都由主机任务发送 从机任务则是发回数据场和校验场 报文路由 报文的内容由识别符命名 识别符不指出报文的目的地 但解释数据的含义 最大的 标识符数量是 64 其中 4 个保留用于专用的通讯 譬如软件升级或诊断 多播 由于引入了报文滤波的概念 任何
[单片机]
如何设置STM32单片机非初始化数据变量不被零初始化
一些产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备。而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零。 在给出方法之前,先来了解一下代码和数据的存放规则、属性,以及复位后为何默认非初始化变量所在RAM都被初始化为零了呢。 什么是初始化数据变量,什么又是非初始化数据变量?(因为我的文字描述不一定准确,所以喜欢举一些例子来辅助理解文字。) 定义一个变量:int nTimerCount=20;变量nTimerCount就是初始化变量,也就是已经有初值; 如果定义变量:int nTimerCount;变量nTimerCou
[单片机]
如何设置<font color='red'>STM32</font>单片机非初始化数据变量不被零初始化
STM32-FSMC-SRAM
一、基本概念 1. 与非总线复用的16位SRAM接口 FSMC配置 SRAM存储器和NOR闪存存储器共用相同的FSMC存储块,所用的协议依不同的存储器类型而有所不同。 控制SRAM存储器,FSMC应该具有下述功能: ● 使用或禁止地址/数据总线的复用功能。 ● 选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 ● 定义外部存储器的数据总线宽度:8或16位。 ● 使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 正如配置NOR闪存存储器一样,用户必须按照SRAM存储器的数据手册给出的时序数据,计算和设置下列参数: ● ADDSET:地址建立时间 ● ADDHOLD:地址保持时间 ● DATAST:数
[单片机]
stm32之i2C硬件驱动ht16c22
使用硬件i2c,驱动ht16c22,程序不稳定是肯定的,还是贴出来吧,项目中最好不要用。 文件i2c.h内容: #ifndef _STM32F103_I2C_H_ #define _STM32F103_I2C_H_ #include stm32f10x.h #define SlaveAddress 0x7e //0x7e //#define ModeSet 0b10001100 //80Hz,turn on sys and LCD bias,1/3 bias #define ModeSet 0x8C //80Hz,turn on sys and LCD bias,1/3 bias //#define VlcdAdjus
[单片机]
STM32独立看门狗IWDG时限的确定
看门狗定时时限= IWDG_SetReload()的值 / 看门狗时钟频率 看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数 1.STM32 看门狗的 例子 IWDG的时限定为280微秒。这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。 /* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) ------------------------------------------------------------- */ /* Enable write acces
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多开源项目推荐

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved