STM32F407驱动GC9A01+CST816D触摸显示屏

这篇具有很好参考价值的文章主要介绍了STM32F407驱动GC9A01+CST816D触摸显示屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32F407驱动GC9A01+CST816D触摸显示屏

1 GC9A01简介

GC9A01是一款spi接口的1.28寸圆形屏,分辨率240*240,3.3v供电。

2 CST816D简介

CST816D是一款IIC接口的触摸屏,模块上有4根信号线RST->复位线,INT->触摸中断线,当触摸屏检测到触摸信号后会输出高电平,SCL->数据时钟线,SDA->数据线。如果只是简单的使用INT线可以不使用。

3 SPI驱动GC9A01

3.1 SPI接口初始化

3.1.1 初始化RS、RST、CS、led信号的GPIO

	GPIO_InitTypeDef  GPIO_InitStructure;
	      
	RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC ,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_1 |GPIO_Pin_12 | GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOC, &GPIO_InitStructure);

3.1.2 硬件SPI接口初始化

GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能PB时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟
 
  //PB13--SCL ,PB15--SDI初始化设置, 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;//PB13,PB15复用功能输出	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13复用为 SPI2
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB15复用为 SPI2
 
	//这里只针对SPI口初始化
	RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//复位SPI2
	RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI2

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:全速双工模式
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;	//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;	//串行同步时钟的空闲状态为高电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;	//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
	SPI_Cmd(SPI2, ENABLE); //使能SPI外设
	SPI2_ReadWriteByte(0xff);//启动传输	

3.2 LCD初始化

	Lcd_Reset();    //复位液晶屏

	Lcd_WriteIndex(0x11);//Sleep exit 
	
	delay_ms (200);
	
	LCD_BLK_SET;//打开背光
	delay_ms(100);

	Lcd_WriteIndex(0xEF);
	Lcd_WriteIndex(0xEB);
	Lcd_WriteData(0x14); 
	
  Lcd_WriteIndex(0xFE);			 
	Lcd_WriteIndex(0xEF); 

	Lcd_WriteIndex(0xEB);	
	Lcd_WriteData(0x14); 

	Lcd_WriteIndex(0x84);			
	Lcd_WriteData(0x40); 

	Lcd_WriteIndex(0x85);			
	Lcd_WriteData(0xFF); 

	Lcd_WriteIndex(0x86);			
	Lcd_WriteData(0xFF); 

	Lcd_WriteIndex(0x87);			
	Lcd_WriteData(0xFF);

	Lcd_WriteIndex(0x88);			
	Lcd_WriteData(0x0A);

	Lcd_WriteIndex(0x89);			
	Lcd_WriteData(0x21); 

	Lcd_WriteIndex(0x8A);			
	Lcd_WriteData(0x00); 

	Lcd_WriteIndex(0x8B);			
	Lcd_WriteData(0x80); 

	Lcd_WriteIndex(0x8C);			
	Lcd_WriteData(0x01); 

	Lcd_WriteIndex(0x8D);			
	Lcd_WriteData(0x01); 

	Lcd_WriteIndex(0x8E);			
	Lcd_WriteData(0xFF); 

	Lcd_WriteIndex(0x8F);			
	Lcd_WriteData(0xFF); 


	Lcd_WriteIndex(0xB6);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x20);

	Lcd_WriteIndex(0x36);
	if(USE_HORIZONTAL==0)Lcd_WriteData(0x08);
	else if(USE_HORIZONTAL==1)Lcd_WriteData(0xC8);
	else if(USE_HORIZONTAL==2)Lcd_WriteData(0x68);
	else Lcd_WriteData(0xA8);

	Lcd_WriteIndex(0x3A);			
	Lcd_WriteData(0x05); 


	Lcd_WriteIndex(0x90);			
	Lcd_WriteData(0x08);
	Lcd_WriteData(0x08);
	Lcd_WriteData(0x08);
	Lcd_WriteData(0x08); 

	Lcd_WriteIndex(0xBD);			
	Lcd_WriteData(0x06);
	
	Lcd_WriteIndex(0xBC);			
	Lcd_WriteData(0x00);	

	Lcd_WriteIndex(0xFF);			
	Lcd_WriteData(0x60);
	Lcd_WriteData(0x01);
	Lcd_WriteData(0x04);

	Lcd_WriteIndex(0xC3);			
	Lcd_WriteData(0x13);
	Lcd_WriteIndex(0xC4);			
	Lcd_WriteData(0x13);

	Lcd_WriteIndex(0xC9);			
	Lcd_WriteData(0x22);

	Lcd_WriteIndex(0xBE);			
	Lcd_WriteData(0x11); 

	Lcd_WriteIndex(0xE1);			
	Lcd_WriteData(0x10);
	Lcd_WriteData(0x0E);

	Lcd_WriteIndex(0xDF);			
	Lcd_WriteData(0x21);
	Lcd_WriteData(0x0c);
	Lcd_WriteData(0x02);

	Lcd_WriteIndex(0xF0);   
	Lcd_WriteData(0x45);
	Lcd_WriteData(0x09);
	Lcd_WriteData(0x08);
	Lcd_WriteData(0x08);
	Lcd_WriteData(0x26);
 	Lcd_WriteData(0x2A);

 	Lcd_WriteIndex(0xF1);    
 	Lcd_WriteData(0x43);
 	Lcd_WriteData(0x70);
 	Lcd_WriteData(0x72);
 	Lcd_WriteData(0x36);
 	Lcd_WriteData(0x37);  
 	Lcd_WriteData(0x6F);

	Lcd_WriteIndex(0xF2);   
 	Lcd_WriteData(0x45);
 	Lcd_WriteData(0x09);
 	Lcd_WriteData(0x08);
 	Lcd_WriteData(0x08);
 	Lcd_WriteData(0x26);
 	Lcd_WriteData(0x2A);

	Lcd_WriteIndex(0xF3);   
 	Lcd_WriteData(0x43);
 	Lcd_WriteData(0x70);
 	Lcd_WriteData(0x72);
 	Lcd_WriteData(0x36);
 	Lcd_WriteData(0x37); 
 	Lcd_WriteData(0x6F);

	Lcd_WriteIndex(0xED);	
	Lcd_WriteData(0x1B); 
	Lcd_WriteData(0x0B); 

	Lcd_WriteIndex(0xAE);			
	Lcd_WriteData(0x77);
	
	Lcd_WriteIndex(0xCD);			
	Lcd_WriteData(0x63);		

	Lcd_WriteIndex(0x70);			
	Lcd_WriteData(0x07);
	Lcd_WriteData(0x07);
	Lcd_WriteData(0x04);
	Lcd_WriteData(0x0E); 
	Lcd_WriteData(0x0F); 
	Lcd_WriteData(0x09);
	Lcd_WriteData(0x07);
	Lcd_WriteData(0x08);
	Lcd_WriteData(0x03);

	Lcd_WriteIndex(0xE8);			
	Lcd_WriteData(0x34);

	Lcd_WriteIndex(0x62);			
	Lcd_WriteData(0x18);
	Lcd_WriteData(0x0D);
	Lcd_WriteData(0x71);
	Lcd_WriteData(0xED);
	Lcd_WriteData(0x70); 
	Lcd_WriteData(0x70);
	Lcd_WriteData(0x18);
	Lcd_WriteData(0x0F);
	Lcd_WriteData(0x71);
	Lcd_WriteData(0xEF);
	Lcd_WriteData(0x70); 
	Lcd_WriteData(0x70);

	Lcd_WriteIndex(0x63);			
	Lcd_WriteData(0x18);
	Lcd_WriteData(0x11);
	Lcd_WriteData(0x71);
	Lcd_WriteData(0xF1);
	Lcd_WriteData(0x70); 
	Lcd_WriteData(0x70);
	Lcd_WriteData(0x18);
	Lcd_WriteData(0x13);
	Lcd_WriteData(0x71);
	Lcd_WriteData(0xF3);
	Lcd_WriteData(0x70); 
	Lcd_WriteData(0x70);

	Lcd_WriteIndex(0x64);			
	Lcd_WriteData(0x28);
	Lcd_WriteData(0x29);
	Lcd_WriteData(0xF1);
	Lcd_WriteData(0x01);
	Lcd_WriteData(0xF1);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x07);

	Lcd_WriteIndex(0x66);			
	Lcd_WriteData(0x3C);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0xCD);
	Lcd_WriteData(0x67);
	Lcd_WriteData(0x45);
	Lcd_WriteData(0x45);
	Lcd_WriteData(0x10);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x00);

	Lcd_WriteIndex(0x67);			
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x3C);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x00);
	Lcd_WriteData(0x01);
	Lcd_WriteData(0x54);
	Lcd_WriteData(0x10);
	Lcd_WriteData(0x32);
	Lcd_WriteData(0x98);

	Lcd_WriteIndex(0x74);			
	Lcd_WriteData(0x10);	
	Lcd_WriteData(0x85);	
	Lcd_WriteData(0x80);
	Lcd_WriteData(0x00); 
	Lcd_WriteData(0x00); 
	Lcd_WriteData(0x4E);
	Lcd_WriteData(0x00);					
	
	Lcd_WriteIndex(0x98);			
	Lcd_WriteData(0x3e);
	Lcd_WriteData(0x07);

	Lcd_WriteIndex(0x35);	
	Lcd_WriteIndex(0x21);

	Lcd_WriteIndex(0x11);
	delay_ms(120);
	Lcd_WriteIndex(0x29);
	delay_ms(20);

4 IIC驱动

IIC驱动这里是使用GPIO模拟,STM32自带的硬件IIC接口使用时有问题。

4.1 初始化GPIO

4.1.1 配置RST复位引脚

4.1.2 配置IIC引脚

4.2 CST816D读写时序

4.2.1 写时序

	IIC_Start();  //产生一个起始信号
	IIC_Send_Byte(0X2a);//发送器件地址0X2a(手册上写的是0x1a,但使用逻辑分析仪实测出来这个地址是0x2a)
	IIC_Wait_Ack(); //等待应答
	IIC_Send_Byte(addr);   //发送低地址
	IIC_Wait_Ack();//等待应答
	IIC_Send_Byte(data);   
	IIC_Wait_Ack();//等待应答
	IIC_Stop();//产生一个停止条件 
	delay_ms(10);	

4.2.2 读时序

	IIC_Start();  				//产生一个起始信号
	IIC_Send_Byte(0X2a);   	//发送器件地址0X2a 	   
	IIC_Wait_Ack(); 			//等待应答
	IIC_Send_Byte(addr);  	 	//发送地址
	IIC_Wait_Ack();			//等待应答
	IIC_Start();  	 	   		//产生一个起始信号
	IIC_Send_Byte(0X2b); //进入接收模式(写一个0x2b)		   
	IIC_Wait_Ack();			//等待应答
	temp=IIC_Read_Byte(0);		//回读数据
	IIC_Stop();				//产生一个停止信号	   

4.2.3 获取触摸屏坐标

触摸的状态是0x03寄存器的高两位,0x00表示无效,0x01表示无触摸,0x02表示有触摸,xy坐标的精度是12位的,0x03[0:3]+0x04[0:7],0x05[0:3]+0x06[0:7],由于1.28寸屏的分辨率是240*240,所以8位精度就够了,所以只读了8位数据。
cst816d,stm32,单片机,嵌入式硬件

	key_mod = (CST_Read_One_Byte(0x03) & 0xc0)>>6;		//获取按下的状态
	*touch_x = CST_Read_One_Byte(0x04);				//获取x坐标
	*touch_y = CST_Read_One_Byte(0x06);				//获取y坐标

5 实现触摸屏绘画功能

回读触摸屏的坐标,再使用画点函数将该坐标绘制出来,就可以实现一个简单的绘画功能了。文章来源地址https://www.toymoban.com/news/detail-798567.html

while(1)
	{		
		//获取触摸指标
		ret = CST816D_Read(&xdat,&ydat);
		//触摸坐标取反
		xdat = 240-xdat;
		ydat = 240-ydat;
		//显示坐标值
		Lcd_ShowString(50,20,"x=",BLACK,WHITE,12,0);
		Lcd_ShowIntNum(60,20,xdat,3,BLACK,WHITE,12);
		Lcd_ShowString(50,40,"y=",BLACK,WHITE,12,0);
		Lcd_ShowIntNum(60,40,ydat,3,BLACK,WHITE,12);
		Lcd_ShowIntNum(60,60,ret,3,BLACK,WHITE,12);
		//检测到触摸屏被按下
		if(ret == 2)
		{
			//绘制坐标点
			Lcd_DrawPoint(xdat,ydat,DARKBLUE);
			Lcd_DrawRectangle(xdat,ydat,xdat+5,ydat+5,DARKBLUE);
		}
	}

到了这里,关于STM32F407驱动GC9A01+CST816D触摸显示屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】BLDC驱动&控制开发笔记 | 07_SPI通信测试 - STM32F407用SPI配置DRV8323驱动芯片

    最近在埋头搞STM32 + 无刷直流电机控制,想实现用自己的STM32F407VGT6芯片板子,外加一块驱动板(目前选用到TI的DRV8302或者DRV8323驱动芯片),搞定电机驱动,最后实现比较好的控制效果。如果不是同一块芯片的同学也不用急着走,大体上都是可借鉴哒~ 本文主要实现使用SPI通信

    2024年02月08日
    浏览(55)
  • 雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕

    雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕 AT32A403A Board开发板 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口GC9A01 推荐一个屏幕资料参考网站 http://www.lcdwiki.com/1.28inch_IPS_Module 1.28寸圆形IPS彩屏,支持 RGB 65K色显示,显示色彩丰富 240X240分辨率,显示清晰

    2024年03月22日
    浏览(46)
  • 【DRV8323】电机驱动芯片寄存器配置指南,通过STM32F407的SPI通信配置

    笔者计划使用一块使用到STM32F407控制芯片与DRV8323s驱动芯片的板子,驱动BLDC。了解到需要使用SPI通信来配置DRV8323s驱动芯片,配置过程中涉及DRV8323数据手册中提及的几个寄存器,故写此文做个记录。 另外,DRV8323芯片和DRV8302、DRV8303、DRV8353都有极大的相似之处,可以相互参考

    2024年02月02日
    浏览(62)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(61)
  • STM32F407的时钟

    时钟源用来为环形脉冲发生器提供频率稳定且电平匹配的方波时钟脉冲信号。它通常由石英 晶体振荡器和与非门组成的正反馈振荡电路组成,其输出送至环形脉冲发生器。 F4开发指南P107 F4开发指南P108 HSI高速内部时钟源 High Speed Internal。RC 振荡器,频率为 16MHz。可以直接作为

    2024年02月10日
    浏览(55)
  • STM32F407的介绍

    内核 32位 高性能ARM Cortex-M4处理器 时钟: 高达168MHz,实际还可以超频一点点 stm32f407的主频通过PLL倍频后能够达到168MHz,而且芯片内置一个16MHz的晶振和一个32KHz的晶振,可以满足不同功耗的需求。 支持FPU(浮点运算)和DSP指令 144引脚 114个IO口 存储器容量: 1024K FLASH, 192K

    2024年02月10日
    浏览(58)
  • STM32F407——串口通信

    本文将对串口通信的分类和基于 stm32 的串口配置进行介绍,以及如何使用串口调试助手进行串口收发功能的调试,旨在帮助还不会使用 stm32 单片机串口资源进行通信的家人们快速学会如何使用串口来进行通信。 (纯干货、快速上手、零基础也能会!!!) (1)串口,即串

    2023年04月08日
    浏览(56)
  • 初识 STM32和STM32F407简介

    2007 年 6 月,ST 在北京发布了全球第一款基于 ARM Cortex M3 内核的 32 位通用微控制 器芯片:STM32F103,以优异的性能,丰富的资源,超高的性价比,迅速占领市场,从此一鸣 惊人,一发不可收拾,截止到 2020 年 6 月,STM32 累计出货量超过 45 亿颗。 战舰开发板使用的 STM32F103ZET6

    2023年04月08日
    浏览(75)
  • STM32F407 移植 FreeRTOS

    本实验是基于正点原子 STM32F407ZG 探索者开发板完成的,所以需要一个STM32F407ZG 探索者开发板 用于移植的基础工程(下面会讲) FreeRTOS源码(下面会讲) 本实验所有用到的代码:基于正点原子STM32F407的FreeRTOS移植工程.zip 1.1 移植前准备 1.1.1 基础工程 由于后续需要用到 LED、

    2024年02月08日
    浏览(70)
  • STM32F407 --USART使用

    目录 1. 串口配置--普通模式 2. 实现数据的传输主函数 1)单引号双引号的应用数组传输 2)将调试信息用串口打印传送到电脑上 1. 串口配置--普通模式 F407使用的M4内核与F103使用的M3内核不一样,导致在使用配置上有区别。需要在F103配置的基础上专门将GPIO的PIN配置成复用功能

    2024年02月16日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包