STM32移植1.44寸TFT LCD实现显示传感器数值

做毕设的时候遇到了难题,某宝买的一个小小的TFT LCD送的例程无法实现非填充模式,例如我想在显示屏上显示传感器获取到的数值,第一遍是正常的,但是后面显示的数值会在原来的基础上叠加,导致屏幕一团团的。

某宝的显示屏如下:
在这里插入图片描述
未修改显示函数效果如下:
在这里插入图片描述
查了好多帖子,最后在openedv论坛的某个大佬分享的源码和原子本来的例程中才找到了解决这个问题的办法,下面就是需要修改成非填充模式的操作。

函数原型为淘宝店家给的函数,就不全部列出来了,就仅仅把需要修改的地方写出来。

  • 需要修改第一个函数为LCD_ShowChar( )
    函数如下:
//******************************************************************
//函数名:  LCD_ShowChar
//功能:    显示单个英文字符
//输入参数:(x,y):字符显示位置起始坐标
//        	fc:前置画笔颜色
//			bc:背景颜色
//			num:数值(0-94)
//			size:字体大小
//			mode:模式  0,非叠加模式;1,叠加模式
//返回值:  无
//修改记录:无
//******************************************************************  
void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
{  
    u8 temp,t1,t; 
    u8 csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数
	num=num-' ';//得到偏移后的值
	LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口		
	for(t=0;t<csize;t++)
	{
		if(size==12)temp=asc2_1206[num][t];//调用1206字体
		else temp=asc2_1608[num][t];		 //调用1608字体
		for(t1=0;t1<csize/2;t1++)
		{                 
		    if(temp&0x01)
            {
                LCD_DrawPoint(x+t1,y+t);
                LCD_WR_DATA_16Bit(POINT_COLOR);
            }
			else
            {
                if(mode==0) 
                {
                    LCD_DrawPoint(x+t1,y+t);
                    LCD_WR_DATA_16Bit(BACK_COLOR);
                }
            }
			temp>>=1; 				
		}			
	}	
	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏    	   	 	  
} 

叠加模式不多说,非叠加模式就是当mode=0时,调用LCD_DrawPoint()进行画点,然后再在8位总线下写入一个16位数据,该数据位背景颜色BLACK_COLOR,后temp右移遍历。

  • (调用该函数情况下)修改的第二个函数为LCD_ShowNum( )
    函数如下:

//******************************************************************
//函数名:  LCD_ShowNum
//功能:    显示单个数字变量值
//输入参数:x,y :起点坐标	 
//			len :指定显示数字的位数
//			size:字体大小(12,16)
//			color:颜色
//			num:数值(0~4294967295)
//返回值:  无
//修改记录:无
//******************************************************************  			 
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/mypow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,' ',size,0);
				continue;
			}else enshow=1; 
		 	 
		}
	 	LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,temp+'0',size,0); 
	}
} 

其实这个函数最好还是在u8 size后面添加一个参数u8 mode,就可以在调用函数的时候方便修改模式,这里我偷懒为了使用该函数实现非填充模式就直接在函数调用LCD_ShowChar()函数的时候直接写参数0,固定成了非填充模式。

  • 主函数部分:
/****************************************************************************************************
//=======================================液晶屏数据线接线==========================================//
//CS		接PB12	//片选信号
//CLK	    接PB13	//SPI时钟信号
//SDI(DIN)	接PB15	//SPI总线数据信号
//=======================================液晶屏控制线接线==========================================//
//RS(D/C)   接PB1	//寄存器/数据选择信号(RS=0数据总线发送的是指令;RS=1数据总线发送的是像素数据)
//RST	      接系统复位NRST	//液晶屏复位信号,低电平复位
/
//==================================如何精简到只需要3个IO=======================================//
//1.CS信号可以精简,不作SPI复用片选可将CS接地常低,节省1个IO
//2.LED背光控制信号可以接高电平3.3V背光常亮,节省1个IO
//3.RST复位信号可以接到单片机的复位端,利用系统上电复位,节省1个IO
//==================================如何切换横竖屏显示=======================================//
//打开lcd.h头文件,修改宏#define USE_HORIZONTAL 值为0使用竖屏模式.1,使用横屏模式
//===========================如何切换模拟SPI总线驱动和硬件SPI总线驱动=========================//
//打开lcd.h头文件,修改宏#define USE_HARDWARE_SPI  值为0使用模拟SPI总线.1,使用硬件SPI总线
**************************************************************************************************/	
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "gui.h"
#include "usart.h"
#include "led.h"
#include  "usmart.h"

//LED 状态设置函数
void led_set(u8 sta)
{
    LED0=sta;
}

//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
    ledset(sta);
}

__align(4) u8 dtbuf[50];

int main(void)
{
    int x;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(9600);	 //串口初始化为9600
    delay_init();	    	 //延时函数初始化
    LED_Init();
	SystemInit();        //初始化RCC 设置系统主频为72MHZ
	LCD_Init();	         //液晶屏初始化
    usmart_dev.init(72); 	//初始化USMART
    LCD_Clear(BLACK);
    POINT_COLOR=RED;
	while(1)
    {
        for(x=0;x<60;x++)
        {
            //LCD_ShowNum(52,52,x,2,16);
            sprintf((char *)dtbuf,"%d",x);
            //LCD_ShowString(10+38,10,16,dtbuf,0); 
            Gui_StrCenter(0,50,BLUE,YELLOW,dtbuf,16,0);//居中显示
            delay_ms(1000);
        }
        if(x==60)
        {
            x=0;
        }
	}		  	
}

主函数就是在屏幕上显示一个累加计时的功能,没什么特别的。具体的效果忘了拍图保存,下一篇帖子做MPU6050的时候有一张类似的效果图,可以参考那个。

需要源码的话看我简介取吧,项目代码都放那里,就不直接挂网盘了。

  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
### 回答1: 要使用STM32F103RCT6驱动1.44TFT LCD显示屏,首先需要了解TFT LCD显示屏的基本工作原理和通信接口。 TFT LCD显示屏由控制器和显示面板组成,控制器负责将图像数据发送到显示面板,并控制显示面板的驱动方式。STM32F103RCT6是一款32位ARM Cortex-M3核心的微控制器,具有丰富的外设和较高的处理能力,适合用于驱动TFT LCD显示屏。 接下来需要确定TFT LCD显示屏的通信接口是什么,常见的通信接口有SPI、I2C和8080并行接口等。对于1.44TFT LCD显示屏,通常采用SPI接口进行通信。 在进行硬件连接之前,需要查看TFT LCD显示屏的规格书和STM32F103RC6的数据手册来了解各个引脚的功能和连接方式。通常,SPI接口需要如下连接:使用STM32F103RCT6的SPI主机模式,分别连接STM32F103RCT6的SPI主机的SCK、MISO、MOSI管脚(对应SPI1或SPI2)与TFT LCD显示屏的SCK、SDO、SDI管脚,还需要连接片选管脚,以及连接显示屏的复位管脚和片选管脚以及电源供应和地。 在软件方面,需要先配置STM32F103RCT6的SPI外设,并设置通信速率、数据位长度等参数。然后,编写驱动程序,通过SPI与TFT LCD显示屏进行数据通信,将显示数据发送到TFT LCD显示屏,以实现图像显示的功能。 总的来说,驱动1.44TFT LCD显示屏需要进行硬件设置和软件编程。通过了解TFT LCD显示屏的通信接口和STM32F103RCT6的外设特性,并编写相应的驱动程序,就可以实现TFT LCD显示屏的驱动及图像显示功能。 ### 回答2: 要驱动1.44TFTLCD显示屏,首先要使用STM32F103RCT6开发板与显示屏进行连接。我们可以通过GPIO口实现数据线与显示屏相连,而控制线则通过专门的引脚连接。 接下来需要编写相关的驱动代码来控制显示屏。我们可以使用HAL库提供的函数,来设置GPIO口的输出模式,以及数据传输相关的操作。利用SPI或者I2C通信协议,我们可以通过发送命令和数据来控制显示屏的显示内容。 在驱动代码中,我们需要先初始化SPI或者I2C通信,并配置相应的参数,比如时钟频率、传输模式等。 接着,我们需要编写命令和数据的发送函数,通过SPI或I2C发送相关指令给显示屏。比如,我们可以通过发送命令来设置显示区域、背光亮度等参数。 最后,我们可以编写显示函数来实现显示屏上显示图像或者文字。通过发送数据来更新显示内容,并且可以设置不同的显示模式,如图形显示字符显示等。 需要注意的是,针对不同的显示屏型号,具体的驱动代码可能会有所不同。因此,在编写驱动代码时,需要结合显示屏的数据手册来编写相应的控制指令和函数。 以上是关于如何驱动1.44TFTLCD显示屏的大致步骤。在实际应用中,还需要对具体的硬件结构和功能要求进行详细调试和开发。 ### 回答3: STM32F103RCT6是一款ARM Cortex-M3内核的微控制器,可以用于控制各种外设和驱动显示屏。在驱动1.44TFT LCD显示屏时,我们需要按照以下步骤进行设置和编程: 1. 连接硬件:首先,将STM32F103RCT6与1.44TFT LCD显示屏连接起来。根据显示屏和微控制器的规格书或引脚配置表,将引脚正确连接。 2. 配置GPIO引脚:在STM32F103RCT6的寄存器中,通过设置GPIO引脚的模式和速度,将其配置为输出模式。将对应的引脚配置为控制显示屏的D/C引脚(用于选择数据/指令)、CS引脚(用于片选)、以及时钟引脚和数据引脚等。 3. 编写驱动程序:使用C语言或其他适合的编程语言,编写代码来控制和驱动1.44TFT LCD显示屏。根据显示屏的数据手册和命令集,实现显示屏的初始化、清屏、写入像素数据等功能。 4. 设置显示屏参数:根据需要,设置显示屏的相关参数,例如屏幕分辨率、颜色模式显示方向等。这些参数需要根据具体的显示屏型号来设置。 5. 显示数据:通过驱动程序发送像素数据,将需要显示的图像或文本等内容写入显示屏。 6. 刷新显示:根据需要,定时刷新显示屏内容,以保持实时更新的效果。 通过以上步骤,我们可以实现STM32F103RCT6对1.44TFT LCD显示屏的驱动。需要根据具体的硬件和显示屏型号进行适配和调试,确保驱动程序的正确性和稳定性。同时,根据项目的需求和复杂度,可能需要更详细的代码和配置设置。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值