USB???

usbd_dcd_if.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : usbd_cdc_if.c
  * @version        : v1.0_Cube
  * @brief          : Usb device for Virtual Com Port.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc_if.h"

/* USER CODE BEGIN INCLUDE */

/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  * @brief Usb device library.
  * @{
  */

/** @addtogroup USBD_CDC_IF
  * @{
  */

/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
  * @brief Private types.
  * @{
  */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
  * @brief Private defines.
  * @{
  */

/* USER CODE BEGIN PRIVATE_DEFINES */
/* Define size for the receive and transmit buffer over CDC */
/* It's up to user to redefine and/or remove those define */
#define APP_RX_DATA_SIZE  2048
#define APP_TX_DATA_SIZE  2048
/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
  * @brief Private macros.
  * @{
  */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
  * @brief Private variables.
  * @{
  */
/* Create buffer for reception and transmission           */
/* It's up to user to redefine and/or remove those define */
/** Received data over USB are stored in this buffer      */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];

/** Data to send over USB CDC are stored in this buffer   */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

/* USER CODE BEGIN PRIVATE_VARIABLES */
uint32_t USB_Txbuf=0;
uint32_t USB_Rxbuf=0;
/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,
  CDC_Receive_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes the CDC media low layer over the FS USB IP
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Init_FS(void)
{
  /* USER CODE BEGIN 3 */
  /* Set Application Buffers */
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
  return (USBD_OK);
  /* USER CODE END 3 */
}

/**
  * @brief  DeInitializes the CDC media low layer
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_DeInit_FS(void)
{
  /* USER CODE BEGIN 4 */
  return (USBD_OK);
  /* USER CODE END 4 */
}

/**
  * @brief  Manage the CDC class requests
  * @param  cmd: Command code
  * @param  pbuf: Buffer containing command data (request parameters)
  * @param  length: Number of data to be sent (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
  /* USER CODE BEGIN 5 */
  switch(cmd)
  {
    case CDC_SEND_ENCAPSULATED_COMMAND:

    break;

    case CDC_GET_ENCAPSULATED_RESPONSE:

    break;

    case CDC_SET_COMM_FEATURE:

    break;

    case CDC_GET_COMM_FEATURE:

    break;

    case CDC_CLEAR_COMM_FEATURE:

    break;

  /*******************************************************************************/
  /* Line Coding Structure                                                       */
  /*-----------------------------------------------------------------------------*/
  /* Offset | Field       | Size | Value  | Description                          */
  /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
  /* 4      | bCharFormat |   1  | Number | Stop bits                            */
  /*                                        0 - 1 Stop bit                       */
  /*                                        1 - 1.5 Stop bits                    */
  /*                                        2 - 2 Stop bits                      */
  /* 5      | bParityType |  1   | Number | Parity                               */
  /*                                        0 - None                             */
  /*                                        1 - Odd                              */
  /*                                        2 - Even                             */
  /*                                        3 - Mark                             */
  /*                                        4 - Space                            */
  /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
  /*******************************************************************************/
    case CDC_SET_LINE_CODING:

    break;

    case CDC_GET_LINE_CODING:

    break;

    case CDC_SET_CONTROL_LINE_STATE:

    break;

    case CDC_SEND_BREAK:

    break;

  default:
    break;
  }

  return (USBD_OK);
  /* USER CODE END 5 */
}

/**
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
  *         through this function.
  *
  *         @note
  *         This function will block any OUT packet reception on USB endpoint
  *         untill exiting this function. If you exit this function before transfer
  *         is complete on CDC interface (ie. using DMA controller) it will result
  *         in receiving more data while previous ones are still not sent.
  *
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  //USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  //USBD_CDC_ReceivePacket(&hUsbDeviceFS);

  if(USB_Rxbuf+*Len<=APP_TX_DATA_SIZE)
  {
    memcpy((uint8_t*)(UserTxBufferFS+USB_Rxbuf),Buf,*Len);
    USB_Rxbuf+=*Len;
    
  }
  else
  {
    memcpy((uint8_t*)(UserTxBufferFS),Buf,*Len);
    USB_Rxbuf+=*Len;
    USB_Txbuf=0;
  }
  
  return (USBD_OK);
  /* USER CODE END 6 */
}

/**
  * @brief  CDC_Transmit_FS
  *         Data to send over USB IN endpoint are sent over CDC interface
  *         through this function.
  *         @note
  *
  *
  * @param  Buf: Buffer of data to be sent
  * @param  Len: Number of data to be sent (in bytes)
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */
  return result;
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
/**
  * 函数功能: USB虚拟串口回显测试
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void USB_CDC_TX_RX(void)
{
  uint32_t buff_size;
  
  if(USB_Txbuf!=USB_Rxbuf)
  {
    if(USB_Txbuf>USB_Rxbuf)
    {
      buff_size=USB_Rxbuf;
    }
    else
    {
      buff_size=USB_Rxbuf-USB_Txbuf;            
    }
    while(CDC_Transmit_FS((uint8_t *)(UserTxBufferFS+USB_Txbuf),buff_size)==USBD_OK);
    
    USB_Rxbuf+=buff_size;
    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  }
   
}

 usbd_conf.c

void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)
{
  if(pcdHandle->Instance==USB_OTG_FS)
  {
  /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */

  /* USER CODE END USB_OTG_FS_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USB_OTG_FS_CLK_DISABLE();
  
    /**USB_OTG_FS GPIO Configuration    
    PA11     ------> USB_OTG_FS_DM
    PA12     ------> USB_OTG_FS_DP 
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);

    /* Peripheral interrupt Deinit*/
    HAL_NVIC_DisableIRQ(OTG_FS_IRQn);

  /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */

  /* USER CODE END USB_OTG_FS_MspDeInit 1 */
  }
}

usb_device.c

void MX_USB_DEVICE_Init(void)
{
  /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
  
  /* USER CODE END USB_DEVICE_Init_PreTreatment */
  
  /* Init Device Library, add supported class and start the library. */
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);

  USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);

  USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);

  USBD_Start(&hUsbDeviceFS);

  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
  
  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}

boot main.c

#include "bsp.h"			 /* 底层硬件驱动 */


/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME	"V7-LCD的汉字显示和2D图形显示(小字库)"
#define EXAMPLE_DATE	"2020-08-09"
#define DEMO_VER		"1.0"


static void PrintfLogo(void);
static void JumpToApp(void);


/* 设置未初始化变量 */
#if defined (__ICCARM__)  /* IAR */

#pragma location = ".NoInit"  
uint32_t g_JumpInit;

#elif defined(__CC_ARM)   /* MDK AC5 */

uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init)); 
 
#elif  (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) /* MDK AC6 */

uint32_t g_JumpInit __attribute__( ( section( ".bss.NoInit"))); 

#elif  defined(__GNUC__)      /* GCC */

__attribute__((section( ".NoInit"))) uint32_t g_JumpInit;

#endif

/*
*********************************************************************************************************
*	函 数 名: main
*	功能说明: c程序入口
*	形    参: 无
*	返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
	uint8_t ucKeyCode;
	
	FONT_T tFont12;			    /* 定义一个字体结构体变量,用于设置字体参数 */
	FONT_T tFont16;				/* 定义一个字体结构体变量,用于设置字体参数 */
	uint8_t buf[100], count = 0;
	
	//变量操作//
	if (g_JumpInit == 0xAA553344)	        /* 软件复位后再进入APP,提供一个干净的CPU环境给APP */
	{	
		JumpToApp();	                    /* 去执行APP程序 */
	}
	else if (g_JumpInit == 0x5AA51234)	    
	{
		
		/* 用户可以自己加处理,比如APP请求升级固件, 直接进入固件升级状态 */
	}
	else
	{
		/* 用户可以自己加处理 */
	}
	//
	

	/* 设置字体参数 */
	{
		tFont12.FontCode = FC_ST_12;	    /* 字体代码 12点阵 */
		tFont12.FrontColor = CL_WHITE;		/* 字体颜色 */
		tFont12.BackColor = CL_BLUE;	    /* 文字背景颜色 */
		tFont12.Space = 0;					/* 文字间距,单位 = 像素 */
	}
	
	/* 设置字体参数 */
	{
		tFont16.FontCode = FC_ST_16;	    /* 字体代码 16点阵 */
		tFont16.FrontColor = CL_WHITE;		/* 字体颜色 */
		tFont16.BackColor = CL_BLUE;	    /* 文字背景颜色 */
		tFont16.Space = 0;					/* 文字间距,单位 = 像素 */
	}
	
	
	bsp_Init();		/* 硬件初始化 */
	PrintfLogo();	/* 打印例程名称和版本等信息 */

	/* 延迟200ms再点亮背光,避免瞬间高亮 */
	bsp_DelayMS(200); 
	
	/* 清屏 */
	LCD_ClrScr(CL_BLUE);

	/* 显示汉字 */
	LCD_DispStr(5, 3, "故人西辞黄鹤楼,烟花三月下扬州。", &tFont12); 
	LCD_DispStr(5, 18, "孤帆远影碧空尽,唯见长江天际流。", &tFont12); 
	LCD_DispStr(5, 38, "故人西辞黄鹤楼,烟花三月下扬州。", &tFont16); 
	LCD_DispStr(5, 58, "孤帆远影碧空尽,唯见长江天际流。", &tFont16); 
	
	/* 绘制2D图形 */
	LCD_DrawLine(5, 120, 100, 220, CL_RED);
	LCD_DrawRect(120, 120, 100, 100, CL_RED);
	LCD_DrawCircle(280, 170, 50, CL_RED);
	LCD_Fill_Rect (340, 120, 100, 100, CL_BUTTON_GREY);
	
	/* 界面整体显示完毕后,再打开背光,设置为缺省亮度 */
	bsp_DelayMS(100); 
	LCD_SetBackLight(BRIGHT_DEFAULT);	
	
	bsp_StartAutoTimer(0, 200); /* 启动1个200ms的自动重装的定时器,软件定时器0 */
	
	while (1)
	{
		/* 判断软件定时器0是否超时 */
		if(bsp_CheckTimer(0))
		{
			/* 每隔200ms 进来一次 */  
			bsp_LedToggle(4);
			
			sprintf((char *)buf, "count = %03d", count++);
			LCD_DispStr(5, 90, (char *)buf, &tFont16); 
		}
		
		ucKeyCode = bsp_GetKey();	/* 读取键值, 无键按下时返回 KEY_NONE = 0 */
		if (ucKeyCode != KEY_NONE)
		{
			/* 有键按下 */
			switch (ucKeyCode)
			{
				case KEY_DOWN_K1:		/* K1按键按下 */
					g_JumpInit = 0xAA553344;
					NVIC_SystemReset();	/* 复位CPU */
					break;

				default:
					break;
			}
		}
	}
}

/*
*********************************************************************************************************
*	函 数 名: JumpToApp
*	功能说明: 跳转到APP
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void JumpToApp(void)
{
#if 1
	void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
	__IO uint32_t BootAddr = 0x08100000; /* STM32H7的系统BootLoader地址 */

	g_JumpInit = 0xAA553344;

	/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
	SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

	/* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)BootAddr);
	

	/* 跳转到系统BootLoader */
	SysMemBootJump(); 

	/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
	while (1)
	{

	}
#else
	uint32_t i=0;
	void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
	__IO uint32_t BootAddr = 0x08100000; /* STM32H7的系统BootLoader地址 */
	

	/* 关闭全局中断 */
	DISABLE_INT(); 

	/* 关闭滴答定时器,复位到默认值 */
	SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

	/* 设置所有时钟到默认状态,使用HSI时钟 */
	HAL_RCC_DeInit();

	/* 关闭所有中断,清除所有中断挂起标志 */
	for (i = 0; i < 8; i++)
	{
		NVIC->ICER[i]=0xFFFFFFFF;
		NVIC->ICPR[i]=0xFFFFFFFF;
	}	

	/* 使能全局中断 */
	ENABLE_INT();

	/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
	SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

	/* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)BootAddr);
	
	/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
	__set_CONTROL(0);

	/* 跳转到系统BootLoader */
	SysMemBootJump(); 

	/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
	while (1)
	{

	}
	
#endif
}

app main.c

#include "bsp.h"			 /* 底层硬件驱动 */



/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME	"V7-LCD的电阻触摸和电容触摸(电阻触摸支持2点和4点校准)"
#define EXAMPLE_DATE	"2020-08-09"
#define DEMO_VER		"1.0"


static void PrintfHelp(void);
static void PrintfLogo(void);
static void DispFirstPage(void);

/* 设置未初始化变量 */
#if defined (__ICCARM__)  /* IAR */

#pragma location = ".NoInit"  
uint32_t g_JumpInit;

#elif defined(__CC_ARM)   /* MDK AC5 */

uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init)); 
 
#elif  (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) /* MDK AC6 */

uint32_t g_JumpInit __attribute__( ( section( ".bss.NoInit"))); 

#elif  defined(__GNUC__)      /* GCC */

__attribute__((section( ".NoInit"))) uint32_t g_JumpInit;

#endif


/*
*********************************************************************************************************
*	函 数 名: main
*	功能说明: c程序入口
*	形    参: 无
*	返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{

	uint16_t ucBright;	   	/* 背光亮度(0-255) */
	uint8_t ucKeyCode;		/* 按键代码 */
	uint8_t fRefresh;		/* 刷屏请求标志,1表示需要刷新 */
    FONT_T tFont;		    /* 定义一个字体结构体变量,用于设置字体参数 */
	char buf[64];
    uint16_t usAdcX, usAdcY;
	int16_t tpX, tpY;
    uint8_t ucTouch;		/* 触摸事件 */


	/* 设置字体参数 */
	{
		tFont.FontCode = FC_ST_16;		/* 字体代码 16点阵 */
		tFont.FrontColor = CL_WHITE;	/* 字体颜色 */
		tFont.BackColor = CL_BLUE;		/* 文字背景颜色 */
		tFont.Space = 0;				/* 文字间距,单位 = 像素 */
	}	
	
	bsp_Init();		/* 硬件初始化 */
	PrintfLogo();	/* 打印例程名称和版本等信息 */
	PrintfHelp();	/* 打印操作提示 */

	/* 延迟200ms再点亮背光,避免瞬间高亮 */
	bsp_DelayMS(200); 
	
	DispFirstPage();	/* 显示第1页 */
	
	/* 界面整体显示完毕后,再打开背光,设置为缺省亮度 */
	bsp_DelayMS(100); 
	ucBright = BRIGHT_DEFAULT;
	LCD_SetBackLight(ucBright);
	
	bsp_StartAutoTimer(0, 200); /* 启动1个200ms的自动重装的定时器,软件定时器0 */
	
	/* 进入主程序循环体 */
	fRefresh = 1;	
	while (1)
	{
       bsp_Idle();
         
		/* 判断软件定时器0是否超时 */
		if(bsp_CheckTimer(0))
		{
			/* 每隔200ms 进来一次 */  
			bsp_LedToggle(2);
		}
		
        if (fRefresh)
		{
			fRefresh = 0;

			/* 实时刷新触摸ADC采样值和转换后的坐标 */
			{
				
				/* 读取并显示当前X轴和Y轴的ADC采样值 */
				usAdcX = TOUCH_ReadAdcX();
				usAdcY = TOUCH_ReadAdcY();
				sprintf(buf, "触摸ADC值 X = %4d, Y = %4d   ", usAdcX, usAdcY);
				LCD_DispStr(5, 40, buf, &tFont);

				/* 读取并显示当前触摸坐标 */
				tpX = TOUCH_GetX();
				tpY = TOUCH_GetY();
				sprintf(buf, "触摸坐标  X = %4d, Y = %4d   ", tpX, tpY);
				LCD_DispStr(5, 60, buf, &tFont);

				/* 在触笔所在位置显示一个小圈 */
				if ((tpX > 0) && (tpY > 0))
				{
					LCD_DrawCircle(tpX, tpY, 2, CL_YELLOW);
				}
			}

			/* 在屏幕边沿绘制2个矩形框(用于检测面板边缘像素是否正常) */
			LCD_DrawRect(0, 0, LCD_GetHeight(), LCD_GetWidth(), CL_WHITE);
			LCD_DrawRect(2, 2, LCD_GetHeight() - 4, LCD_GetWidth() - 4, CL_YELLOW);
            
            /* 显示背光值 */
			sprintf(buf, "当前背光亮度: %3d", ucBright);
			LCD_DispStr(5, 80, buf, &tFont);
		}
        
        ucTouch = TOUCH_GetKey(&tpX, &tpY);	/* 读取触摸事件 */
		if (ucTouch != TOUCH_NONE)
		{
			switch (ucTouch)
			{
				case TOUCH_DOWN:		/* 触笔按下事件 */
                  
					/* 在触笔所在位置显示一个小圈 */
					if ((tpX > 0) && (tpY > 0))
					{
						LCD_DrawCircle(tpX, tpY, 3, CL_RED);
					}
					break;

				case TOUCH_MOVE:		/* 触笔移动事件 */
					/* 实时刷新触摸ADC采样值和转换后的坐标 */
					{
						/* 读取并显示当前X轴和Y轴的ADC采样值 */
						usAdcX = TOUCH_ReadAdcX();
						usAdcY = TOUCH_ReadAdcY();
						sprintf(buf, "触摸ADC值 X = %4d, Y = %4d   ", usAdcX, usAdcY);
						LCD_DispStr(5, 40, buf, &tFont);

						/* 读取并显示当前触摸坐标 */
						//tpX = TOUCH_GetX();
						//tpY = TOUCH_GetY();
						sprintf(buf, "触摸坐标  X = %4d, Y = %4d   ", tpX, tpY);
						LCD_DispStr(5, 60, buf, &tFont);

						/* 在触笔所在位置显示一个小圈 */
						if ((tpX > 0) && (tpY > 0))
						{
							LCD_DrawCircle(tpX, tpY, 2, CL_YELLOW);
						}
					}
					break;

				case TOUCH_RELEASE:		/* 触笔释放事件 */
					/* 在触笔所在位置显示一个小圈 */
					if ((tpX > 0) && (tpY > 0))
					{
						LCD_DrawCircle(tpX, tpY, 4, CL_WHITE);
					}
					break;
			}
		}

		ucKeyCode = bsp_GetKey();	/* 读取键值, 无键按下时返回 KEY_NONE = 0 */
		if (ucKeyCode != KEY_NONE)
		{
			/* 有键按下 */
			switch (ucKeyCode)
			{
				case KEY_DOWN_K2:		/* K1按键按下 */
					g_JumpInit = 0x11112222;
					NVIC_SystemReset();	/* 复位CPU */
					break;
				
				case JOY_DOWN_L:		/* 摇杆LEFT键按下, 2点触摸校准 */
					TOUCH_Calibration(2);
					DispFirstPage();				
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case  JOY_DOWN_OK:		/* 摇杆OK键,清屏 */
					DispFirstPage();				
					fRefresh = 1;		/* 请求刷新LCD */
					break;

				case JOY_DOWN_U:		/* 摇杆UP键按下 */
					ucBright += BRIGHT_STEP;
					if (ucBright > BRIGHT_MAX)
					{
						ucBright = BRIGHT_MAX;
					}
					LCD_SetBackLight(ucBright);
                    fRefresh = 1;		/* 请求刷新LCD */
					break;

				case JOY_DOWN_D:		/* 摇杆DOWN键按下 */
					if (ucBright < BRIGHT_STEP)
					{
						ucBright = 0;
					}
					else
					{
						ucBright -= BRIGHT_STEP;
					}
					LCD_SetBackLight(ucBright);
                    fRefresh = 1;		/* 请求刷新LCD */
					break;

				default:
					break;
			}
		}
	}
}

/*
*********************************************************************************************************
*	函 数 名: DispFirstPage
*	功能说明: 显示操作提示
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
static void DispFirstPage(void)
{
	FONT_T tFont;		/* 定义一个字体结构体变量,用于设置字体参数 */
	uint16_t y;			/* Y坐标 */
	uint16_t usLineCap;	/* 行高 */
	char buf[50];

	LCD_ClrScr(CL_BLUE);  		/* 清屏,背景蓝色 */
	
	
	/* 设置字体属性 */
	tFont.FontCode = FC_ST_16;		/* 字体选择宋体16点阵,高16x宽15) */
	tFont.FrontColor = CL_WHITE;	/* 字体颜色设置为白色 */
	tFont.BackColor = CL_MASK;	 	/* 文字背景颜色,透明 */
	tFont.Space = 0;				/* 字符水平间距, 单位 = 像素 */

	y = 4;
	usLineCap = 18; /* 行间距 */
	LCD_DispStr(5, y, "安富莱STM32-V7开发板  www.armfly.com", &tFont);
	y += usLineCap;
	LCD_DispStr(5, y, "电阻屏和电容屏实验,电容屏无需校准,电阻需要校准", &tFont);
	
	y += 5 * usLineCap;
	LCD_DispStr(30, y, "操作提示:", &tFont);
	
	y += usLineCap;
	LCD_DispStr(50, y, "摇杆上键 = 增加背光亮度", &tFont);
	
	y += usLineCap;
	LCD_DispStr(50, y, "摇杆下键 = 降低背光亮度", &tFont);
	
	y += usLineCap;
	LCD_DispStr(50, y, "摇杆左键 = 电阻屏触摸校准", &tFont);
	
	y += usLineCap;
	LCD_DispStr(50, y, "摇杆OK键 = 清屏", &tFont);

	y += 2 * usLineCap;	
	
    
    /* 显示TFT控制器型号和屏幕分辨率 */
    //LCD_GetChipDescribe(buf);	/* 读取TFT驱动芯片型号 */
    if (g_TouchType == CT_GT811)
    {	
        strcpy(buf, "STM32H743 + GT811");
    }
    else if (g_TouchType == CT_GT911)
    {	
        strcpy(buf, "STM32H743 + GT911");
    }
    else if (g_TouchType == CT_FT5X06)
    {
        strcpy(buf, "STM32H743 + FT5X06");
    }
    else if (g_TouchType == CT_STMPE811)
    {
        strcpy(buf, "STM32H743 + STMPE811");
    }
    else
    {					
        strcpy(buf, "STM32H743 + NoTouch");				
    }	
    sprintf(&buf[strlen(buf)], "   %d x %d", LCD_GetWidth(), LCD_GetHeight());
    LCD_DispStr(5, y, (char *)buf, &tFont);
}

/*
*********************************************************************************************************
*	函 数 名: PrintfHelp
*	功能说明: 打印操作提示
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfHelp(void)
{
	printf("操作提示:\r\n");
	printf("1. 摇杆上键,增加LCD背景光亮度\r\n");
	printf("2. 摇杆下键,降低LCD背景光亮度\r\n");
	printf("3. 摇杆左键,电阻触摸屏校准\r\n");
	printf("4. 摇杆OK键,清屏\r\n");
}

https://www.bilibili.com/read/cv14046778/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值