STM32 ILI9341驱动TFTLCD(七)LCD画实心三角形、矩形、圆形

发布者:温柔的爱情最新更新时间:2024-05-31 来源: elecfans关键字:STM32  ILI9341  驱动TFTLCD  LCD 手机看文章 扫描二维码
随时随地手机看文章

上次测试画直线函数时,已经通过三条直线画出了一个空心三角形,今天来画一下实心的,分别画下实心三角形、实心矩形、实心圆。


1、实心三角形



实心三角形,可以先画任意两条边,然后以这两条边的交点为顶点,向第三条直线的点画直线。在画第三条直线时,思想和画直线是一样的,只是在画好点之后,多加了顶点向刚画好的点画直线这一步。到第三条直线画完时,实心三角形也就画好了。


画实心三角形函数


void LCD_DrawSolidTriangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 color)

{

  u16 xm = 0,ym = 0;

  u16 step = 0;  


  LCD_DrawLine(x0,y0,x1,y1,color);//画第一条直线

  LCD_DrawLine(x0,y0,x2,y2,color);//画第二条直线


  if(x2< x1)    //如果起点在终点左边,起点终点互换位置,确保从左到右划线

  {

    xm = x1;

    x1 = x2;

    x2 = xm;


    ym = y1;

    y1 = y2;

    y2 = ym;

  }

  xm = x1;

  ym = y1;

  LCD_DrawPoint(xm,ym,color);//写起点


  if(y2 >=y1)    //斜率为正

  {

    step = (y2-y1)+(x2-x1);//需要移动的步数

    while(step--)

    {

      if((y2-ym)*(x2-x1) >(y2-y1)*(x2-xm))//判断斜率

        ym++;

      else 

        xm++;

      LCD_DrawPoint(xm,ym,color);

      LCD_DrawLine(x0,y0,xm,ym,color);

    }

  }

  else        //斜率为负

  {

    step = (y1-y2)+(x2-x1);//需要移动的步数

    while(step--)

    {

      if((y2-ym)*(x2-x1)< (y2-y1)*(x2-xm))//判断斜率

        ym--;

      else 

        xm++;

      LCD_DrawPoint(xm,ym,color);

      LCD_DrawLine(x0,y0,xm,xm,color);

    }

  }

}

主函数


#include 'stm32f4xx.h'

#include 'core_cm4.h'

#include 'ili9341.h'



int main()

{

  u16 i = 0;

  ILI9341_Init();                  //ILI9341初始化

  LCD_DrawSolidTriangle(10,200,10,10,200,200,RED);

  while(1);

}

屏幕显示如图

图片

2、实心矩形


空心矩形的画法可以想象同空心三角形一样,只要给出两个对角点,就可以确定矩形的四个点,连出四条线组成矩形。


空心矩形函数


void LCD_DrawRectangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 color)

{

  LCD_DrawLine(x0,y0,x0,y1,color);

  LCD_DrawLine(x0,y0,x1,y0,color);

  LCD_DrawLine(x0,y1,x1,y1,color);

  LCD_DrawLine(x1,y0,x1,y1,color);

}

实心矩形可以从左到右依次从上往下画线,原理也很简单。函数如下


void LCD_DrawSolidRectangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 color)

{

  u16 i = 0;

  for(i=0;i< y1-y0;i++)

  {

    LCD_DrawLine(x0,y0+i,x1,y0+i,color);

  }

}

主函数


#include 'stm32f4xx.h'

#include 'core_cm4.h'

#include 'ili9341.h'



int main()

{

  u16 i = 0;

  ILI9341_Init();                  //ILI9341初始化

  LCD_DrawSolidRectangle(100,100,200,200,RED);

  while(1);

}

屏幕显示如图

1ee81b84d0a725bd83f8df7b85a544c4_wKgaomTCH42ADbx6AAM6aJs7GMA561.jpg

3、实心圆


空心圆的画法,可以把圆分为8等分,每份占45°,根据圆的对称性,画出其中1/8,其余的也就画出来了。


圆上的点的和半径之间有xx+yy=r*r的关系,可以通过判断和半径之间的大小关系来确定每一个点要怎么移动。同时,如果圆心为原点,那么45°对应的x和y是相等的,可以通过这个来判断这1/8的圆是否已经画好。


空心圆函数


void LCD_DrawCircle(u16 x,u16 y,u16 r,u16 color)

{

  u16 xm = 0,ym = r;

  u16 i = 0;

  //先画出圆在x、y轴上的四个点

  LCD_DrawPoint(x,y+r,color);

  LCD_DrawPoint(x+r,y,color);

  LCD_DrawPoint(x,y-r,color);

  LCD_DrawPoint(x-r,y,color);


  while(xm<=ym)//判断是否画完

  {

    if((xm*xm+ym*ym)< (r*r))//在圆内

      xm++;

    else   //在圆外

      ym--;

    LCD_DrawPoint(x+xm,y+ym,color);

    LCD_DrawPoint(x-xm,y+ym,color);

    LCD_DrawPoint(x-ym,y+xm,color);

    LCD_DrawPoint(x-ym,y-xm,color);

    LCD_DrawPoint(x+ym,y+xm,color);

    LCD_DrawPoint(x+ym,y-xm,color);

    LCD_DrawPoint(x+xm,y-ym,color);

    LCD_DrawPoint(x-xm,y-ym,color);

  }

}

主函数


#include 'stm32f4xx.h'

#include 'core_cm4.h'

#include 'ili9341.h'



int main()

{

  u16 i = 0;

  ILI9341_Init();                  //ILI9341初始化

  LCD_DrawCircle(120,150,100,RED);

  while(1);

}

屏幕显示如图

e2a8484f30b1edc3b54f7e7640c79a7b_wKgZomTCH42AEznsAAI-Wleu6d0544.jpg

空心圆完成了,实心的就很好画了。只要让圆的半径从0开始增加到目标半径,依次画出每个半径的圆,最后呈现出来的就是一个实心圆了。


实心圆函数


void LCD_DrawSolidCircle(u16 x,u16 y,u16 r,u16 color)

{

  u16 i = 0;

  for(i=1;i< r;i++)

    LCD_DrawCircle(x,y,i,color);

}

主函数


#include 'stm32f4xx.h'

#include 'core_cm4.h'

#include 'ili9341.h'



int main()

{

  u16 i = 0;

  ILI9341_Init();                  //ILI9341初始化

  LCD_DrawSolidCircle(120,150,100,RED);

  while(1);

}

屏幕显示如图

图片

LCD上基本图形的画法就介绍到这里了。


关键字:STM32  ILI9341  驱动TFTLCD  LCD 引用地址:STM32 ILI9341驱动TFTLCD(七)LCD画实心三角形、矩形、圆形

上一篇:晶振没有内置到芯片中的原因 stm32f10x系统时钟工作原理
下一篇:STM32驱动ESP8266连接阿里云(2)----接入阿里IoT Studio实现Web可视化

推荐阅读最新更新时间:2024-11-08 14:07

成本压力下第三季度液晶显示器降价幅度受限
  根据集邦科技(TrendForce)旗下研究部门WitsView最新终端零售价调查显示,2010年第三季液晶显示器(LCD Monitor)终端平均零售价格为201美元,QoQ增加2.2%,突显传统返校潮促销旺季,价格不跌反升的现象。   受第二季的淡季影响,加上欧洲债信危机的冲击,IT产品终端需求急速萎缩,使液晶显示器品牌厂商的高价库存迟迟无法被消化,另外又面临第二季起面板价格逐步下滑的跌价损失,双重成本力道的夹击,经营的相当辛苦。液晶显示器品牌厂商虽于第三季开始策略性调降主流尺寸售价以增加销售量,然在库存成本较高影响下,品牌厂商能做的降价促销幅度相对有限,其中仅以主流尺寸18.5"W及19"W跌幅较大,QoQ分别下跌6.
[半导体设计/制造]
STM32总结之I2C协议
一、I2C物理层 I2C总线有如下特点: 1.在一个I2C总线中,可以连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。 2.一个I2C总线只使用2条总线线路,一条为双向串行数据线SDA,一条串行时钟线SCL。 数据线用来传输数据,时钟线用于数据同步。 3.每个连接到总线上的设备都有一个独立的地址,通讯主机可以用这个地址进行不同 设备之间的访问。 4.总线通过上拉电阻连接到电源。当I2C设备空闲时,会输出高阻态(意思是既不输出 高电平,也不输出低电平),而当所有设备都空闲时,都输出高阻态,由上拉电阻把总线 拉成高电平。 5.多个主机同时使用总线时,为了防止数据冲突
[单片机]
<font color='red'>STM32</font>总结之I2C协议
结构体对齐在STM32中的具体体现和如何进行不同对齐方式的设置
引言 在嵌入式系统开发中,结构体作为一种常见的数据组织方式,在内存中的布局方式对于程序性能和内存占用具有重要影响。本文将深入探讨单片机C语言中的结构体对齐原理、重要性以及不同的对齐方式,并通过示例演示结构体对齐如何影响内存占用、访问性能以及传输与存储。同时,我们将关注STM32这样的嵌入式系统,讨论结构体对齐在STM32中的具体体现和如何进行不同对齐方式的设置。 结构体对齐原理 1、为什么需要对齐? 在计算机内存中,数据的存储通常需要按照一定规则进行,这被称为内存对齐。内存对齐的目的是为了提高访问数据的效率,特别是对于硬件平台而言。不同的处理器架构可能有不同的对齐要求。 2、不同的对齐方式 单字节对齐(By
[单片机]
结构体对齐在<font color='red'>STM32</font>中的具体体现和如何进行不同对齐方式的设置
STM32关于GPIO的8种模式理解
1、上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。 2、下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。 3、浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。 4、模拟输入:模拟输入是指传统方式的输入.数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的
[单片机]
<font color='red'>STM32</font>关于GPIO的8种模式理解
如何将STM32单片机的JTAG口作为GPIO使用
使用STM32F系列,会遇到将JTAG口复用为SPI1或直接用做普通IO。 针对于F1系列,需要先禁止使能 JTAG,然后将其复用为其他口或者普通IO。 针对F4系列,STM32F4库函数中,已经取消了GPIO_*PinRemapConfig()函数,对于复用功能使用GPIO*_PinAFConfig()函数了! 但是在GPIO_PinAFConfig()函数已经没有禁止JTAG/SW等选项了,而是复用到AF0~AF15线上,其中AF0是系统功能(也是复位初始功能)。 其中调试接口就是系统功能,这样需要禁用JTAG功能只需把引脚复用到AF1~AF15中的一个就行了。 直接复用就可使用相应的复用功能,不用想着失能
[单片机]
STM32出现HardFault_Handler故障的原因及处理方法整理
STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 出现问题时排查的方法: 1、发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Return address、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址,因此在堆栈中反数第三个字即为出错位置。 2、默认的HardFault_Handler处理方法是B .将它
[单片机]
用AT89C52控制步进电机及LCD
  此运动控制器技术特点是:采用了 单片机 技术、 LCD 显示、232串口通讯、按钮复用、光隔离等控制技术,具有精度高、体积小、重量轻、抗干扰能力强,并且操作简单,成本低廉,现已广泛应用于简易的单轴点胶机,模具控制器, IC 测量机等设备。      1.主要功能:      ●可手动设定位置参数:      ●LCD显示:      ●有专用及通用I/O。      ●可扩展串行通讯.以实现上位PC控制。      2.控制器系统结构框图:   3.单片机(AT89C52)管脚功能如下图所示:      4. LED 显示模块(NT-1624A1      此控制器采用的LCD显示模块为2×16的字符型显示模块,由单片
[单片机]
用AT89C52控制步进电机及<font color='red'>LCD</font>
STM32 | 使用STM32内部Flash额外的空间来存储数据
本次分享关于STM32内部FLASH的笔记。 STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些需要掉电保存的数据。 本文以STM32103ZET6为例。STM32103ZET6属于大容量产品,其闪存模块组织如下: 其主存储器大小为512KB,分为256页,每页大小都为2KB。我们的程序一般默认烧写到第0页的起始地址(0x08000000)处。当BOOT0引脚和BOOT1引脚都接GND时,就是从这个地址开始运行代码的。这个地址在keil中可以看到: 假如我们要下载的程序大小为4.05KB,则第0、1、2页
[单片机]
<font color='red'>STM32</font> | 使用<font color='red'>STM32</font>内部Flash额外的空间来存储数据
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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