STM32CUBEIDE的使用【三】RTC

于正点原子潘多拉开发板,使用stm32官方免费软件进行开发

CubeMx 配置

使用CubeMx 配置RTC
勾选RTC 设置日期和时间
在这里插入图片描述
配置LCD的引脚用来显示
在这里插入图片描述

STM32CUBEIDE

在usbd_cdc_if.c中重定向printf函数用于打印

#include <stdarg.h>void usb_printf(const char *format, ...)
{va_list args;uint32_t length;va_start(args, format);length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);va_end(args);CDC_Transmit_FS(UserTxBufferFS, length);
}

编写lcd函数用来显示

#include "app_lcd.h"
#include "app_font.h"
#include "spi.h"extern SPI_HandleTypeDef hspi3;#define LCD_SPI hspi3
#define delay_ms(x) HAL_Delay(x)//LCD缓存大小设置,修改此值时请注意!!!!修改这两个值时可能会影响以下函数	LCD_Clear/LCD_Fill/LCD_DrawLine
#define LCD_TOTAL_BUF_SIZE	(240*240*2)
#define LCD_Buf_Size 1152
static uint8_t lcd_buf[LCD_Buf_Size];uint16_t	POINT_COLOR = BLACK;	//画笔颜色	默认为黑色
uint16_t	BACK_COLOR 	= WHITE;	//背景颜色	默认为白色/*** @brief	LCD控制接口初始化** @param   void** @return  void*/
static void LCD_Gpio_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOB_CLK_ENABLE();/*LCD_PWR:	PB7LCD_RST:	PB6LCD_DC:		PB4LCD_CS:		PD7*/GPIO_InitStruct.Pin = GPIO_PIN_4 ;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
//
//    GPIO_InitStruct.Pin = GPIO_PIN_7;
//    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
//    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);LCD_CS(0);LCD_PWR(0);LCD_RST(0);delay_ms(120);LCD_RST(1);//    SPI3_Init();	//初始化SPI3接口
}/*** @brief	LCD底层SPI发送数据函数** @param   data	数据的起始地址* @param   size	发送数据大小** @return  void*/
static void LCD_SPI_Send(uint8_t *data, uint32_t size)
{uint32_t i;uint32_t delta;delta = size/0xFFFF;for(i = 0; i<=delta; i++){if( i==delta )  /* 发送最后一帧数据 */HAL_SPI_Transmit(&LCD_SPI,&data[i*0xFFFF], size%0xFFFF,1000);else    /* 超长数据一次发送0xFFFF字节数据 */HAL_SPI_Transmit(&LCD_SPI,&data[i*0xFFFF], 0xFFFF,1000);}
}/*** @brief	写命令到LCD** @param   cmd		需要发送的命令** @return  void*/
static void LCD_Write_Cmd(uint8_t cmd)
{LCD_DC(0);LCD_SPI_Send(&cmd, 1);
}/*** @brief	写数据到LCD** @param   cmd		需要发送的数据** @return  void*/
static void LCD_Write_Data(uint8_t data)
{LCD_DC(1);LCD_SPI_Send(&data, 1);
}/*** @brief	写半个字的数据到LCD** @param   cmd		需要发送的数据** @return  void*/
void LCD_Write_HalfWord(const uint16_t da)
{uint8_t data[2] = {0};data[0] = da >> 8;data[1] = da;LCD_DC(1);LCD_SPI_Send(data, 2);
}/*** 设置数据写入LCD缓存区域** @param   x1,y1	起点坐标* @param   x2,y2	终点坐标** @return  void*/
void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{LCD_Write_Cmd(0x2a);LCD_Write_Data(x1 >> 8);LCD_Write_Data(x1);LCD_Write_Data(x2 >> 8);LCD_Write_Data(x2);LCD_Write_Cmd(0x2b);LCD_Write_Data(y1 >> 8);LCD_Write_Data(y1);LCD_Write_Data(y2 >> 8);LCD_Write_Data(y2);LCD_Write_Cmd(0x2C);
}/*** 打开LCD显示** @param   void** @return  void*/
void LCD_DisplayOn(void)
{LCD_PWR(1);
}
/*** 关闭LCD显示** @param   void** @return  void*/
void LCD_DisplayOff(void)
{LCD_PWR(0);
}/*** 以一种颜色清空LCD屏** @param   color	清屏颜色** @return  void*/
void LCD_Clear(uint16_t color)
{uint16_t i, j;uint8_t data[2] = {0};data[0] = color >> 8;data[1] = color;LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1);for(j = 0; j < LCD_Buf_Size / 2; j++){lcd_buf[j * 2] =  data[0];lcd_buf[j * 2 + 1] =  data[1];}LCD_DC(1);for(i = 0; i < (LCD_TOTAL_BUF_SIZE / LCD_Buf_Size); i++){LCD_SPI_Send(lcd_buf, LCD_Buf_Size);}
}/*** 用一个颜色填充整个区域** @param   x_start,y_start     起点坐标* @param   x_end,y_end			终点坐标* @param   color       		填充颜色** @return  void*/
void LCD_Fill(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t color)
{uint16_t i = 0;uint32_t size = 0, size_remain = 0;size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;if(size > LCD_Buf_Size){size_remain = size - LCD_Buf_Size;size = LCD_Buf_Size;}LCD_Address_Set(x_start, y_start, x_end, y_end);while(1){for(i = 0; i < size / 2; i++){lcd_buf[2 * i] = color >> 8;lcd_buf[2 * i + 1] = color;}LCD_DC(1);LCD_SPI_Send(lcd_buf, size);if(size_remain == 0)break;if(size_remain > LCD_Buf_Size){size_remain = size_remain - LCD_Buf_Size;}else{size = size_remain;size_remain = 0;}}
}/*** 用颜色缓冲区填充区域** @param   x_start,y_start     起点坐标* @param   x_end,y_end			终点坐标* @param   clr_buf       		颜色缓冲区** @return  void*/
void LCD_Fill_Buf(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t* clr_buf)
{uint16_t i = 0;uint32_t size = 0, size_remain = 0;size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;if(size > LCD_Buf_Size){size_remain = size - LCD_Buf_Size;size = LCD_Buf_Size;}LCD_Address_Set(x_start, y_start, x_end, y_end);while(1){for(i = 0; i < size / 2; i++){lcd_buf[2 * i] = clr_buf[i] >> 8;lcd_buf[2 * i + 1] = clr_buf[i];}LCD_DC(1);LCD_SPI_Send(lcd_buf, size);if(size_remain == 0)break;if(size_remain > LCD_Buf_Size){size_remain = size_remain - LCD_Buf_Size;}else{size = size_remain;size_remain = 0;}}
}/*** 画点函数** @param   x,y		画点坐标** @return  void*/
void LCD_Draw_Point(uint16_t x, uint16_t y)
{LCD_Address_Set(x, y, x, y);LCD_Write_HalfWord(POINT_COLOR);
}/*** 画点带颜色函数** @param   x,y		画点坐标** @return  void*/
void LCD_Draw_ColorPoint(uint16_t x, uint16_t y,uint16_t color)
{LCD_Address_Set(x, y, x, y);LCD_Write_HalfWord(color);
}/*** @brief	画线函数(直线、斜线)** @param   x1,y1	起点坐标* @param   x2,y2	终点坐标** @return  void*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{uint16_t t;int xerr = 0, yerr = 0, delta_x, delta_y, distance;int incx, incy, row, col;uint32_t i = 0;if(y1 == y2){/*快速画水平线*/LCD_Address_Set(x1, y1, x2, y2);for(i = 0; i < x2 - x1; i++){lcd_buf[2 * i] = POINT_COLOR >> 8;lcd_buf[2 * i + 1] = POINT_COLOR;}LCD_DC(1);LCD_SPI_Send(lcd_buf, (x2 - x1) * 2);return;}delta_x = x2 - x1;delta_y = y2 - y1;row = x1;col = y1;if(delta_x > 0)incx = 1;else if(delta_x == 0)incx = 0;else{incx = -1;delta_x = -delta_x;}if(delta_y > 0)incy = 1;else if(delta_y == 0)incy = 0;else{incy = -1;delta_y = -delta_y;}if(delta_x > delta_y)distance = delta_x;else distance = delta_y;for(t = 0; t <= distance + 1; t++){LCD_Draw_Point(row, col);xerr += delta_x ;yerr += delta_y ;if(xerr > distance){xerr -= distance;row += incx;}if(yerr > distance){yerr -= distance;col += incy;}}
}/*** @brief	画一个矩形** @param   x1,y1	起点坐标* @param   x2,y2	终点坐标** @return  void*/
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{LCD_DrawLine(x1, y1, x2, y1);LCD_DrawLine(x1, y1, x1, y2);LCD_DrawLine(x1, y2, x2, y2);LCD_DrawLine(x2, y1, x2, y2);
}/*** @brief	画一个圆** @param   x0,y0	圆心坐标* @param   r       圆半径** @return  void*/
void LCD_Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r)
{int a, b;int di;a = 0;b = r;di = 3 - (r << 1);while(a <= b){LCD_Draw_Point(x0 - b, y0 - a);LCD_Draw_Point(x0 + b, y0 - a);LCD_Draw_Point(x0 - a, y0 + b);LCD_Draw_Point(x0 - b, y0 - a);LCD_Draw_Point(x0 - a, y0 - b);LCD_Draw_Point(x0 + b, y0 + a);LCD_Draw_Point(x0 + a, y0 - b);LCD_Draw_Point(x0 + a, y0 + b);LCD_Draw_Point(x0 - b, y0 + a);a++;if(di < 0)di += 4 * a + 6;else{di += 10 + 4 * (a - b);b--;}LCD_Draw_Point(x0 + a, y0 + b);}
}/*** @brief	显示一个ASCII码字符** @param   x,y		显示起始坐标* @param   chr		需要显示的字符* @param   size	字体大小(支持16/24/32号字体)** @return  void*/
void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t chr, uint8_t size)
{uint8_t temp, t1, t;uint8_t csize;		//得到字体一个字符对应点阵集所占的字节数uint16_t colortemp;uint8_t sta;chr = chr - ' '; //得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)if((x > (LCD_Width - size / 2)) || (y > (LCD_Height - size)))	return;LCD_Address_Set(x, y, x + size / 2 - 1, y + size - 1);//(x,y,x+8-1,y+16-1)if((size == 16) || (size == 32) )	//16和32号字体{csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);for(t = 0; t < csize; t++){if(size == 16)temp = asc2_1608[chr][t];	//调用1608字体else if(size == 32)temp = asc2_3216[chr][t];	//调用3216字体else return;			//没有的字库for(t1 = 0; t1 < 8; t1++){if(temp & 0x80) colortemp = POINT_COLOR;else colortemp = BACK_COLOR;LCD_Write_HalfWord(colortemp);temp <<= 1;}}}else if  (size == 12)	//12号字体{csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2);for(t = 0; t < csize; t++){temp = asc2_1206[chr][t];for(t1 = 0; t1 < 6; t1++){if(temp & 0x80) colortemp = POINT_COLOR;else colortemp = BACK_COLOR;LCD_Write_HalfWord(colortemp);temp <<= 1;}}}else if(size == 24)		//24号字体{csize = (size * 16) / 8;for(t = 0; t < csize; t++){temp = asc2_2412[chr][t];if(t % 2 == 0)sta = 8;else sta = 4;for(t1 = 0; t1 < sta; t1++){if(temp & 0x80) colortemp = POINT_COLOR;else colortemp = BACK_COLOR;LCD_Write_HalfWord(colortemp);temp <<= 1;}}}
}/*** @brief	m^n函数** @param   m,n		输入参数** @return  m^n次方*/
static uint32_t LCD_Pow(uint8_t m, uint8_t n)
{uint32_t result = 1;while(n--)result *= m;return result;
}/*** @brief	显示数字,高位为0不显示** @param   x,y		起点坐标* @param   num		需要显示的数字,数字范围(0~4294967295)* @param   len		需要显示的位数* @param   size	字体大小** @return  void*/
void LCD_ShowNum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size)
{uint8_t t, temp;uint8_t enshow = 0;for(t = 0; t < len; t++){temp = (num / LCD_Pow(10, len - t - 1)) % 10;if(enshow == 0 && t < (len - 1)){if(temp == 0){LCD_ShowChar(x + (size / 2)*t, y, ' ', size);continue;}else enshow = 1;}LCD_ShowChar(x + (size / 2)*t, y, temp + '0', size);}
}/*** @brief	显示数字,高位为0,可以控制显示为0还是不显示** @param   x,y		起点坐标* @param   num		需要显示的数字,数字范围(0~999999999)* @param   len		需要显示的位数* @param   size	字体大小* @param   mode	1:高位显示0		0:高位不显示** @return  void*/
void LCD_ShowxNum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode)
{uint8_t t, temp;uint8_t enshow = 0;for(t = 0; t < len; t++){temp = (num / LCD_Pow(10, len - t - 1)) % 10;if(enshow == 0 && t < (len - 1)){if(temp == 0){if(mode)LCD_ShowChar(x + (size / 2)*t, y, '0', size);elseLCD_ShowChar(x + (size / 2)*t, y, ' ', size);continue;}else enshow = 1;}LCD_ShowChar(x + (size / 2)*t, y, temp + '0', size);}
}/*** @brief	显示字符串** @param   x,y		起点坐标* @param   width	字符显示区域宽度* @param   height	字符显示区域高度* @param   size	字体大小* @param   p		字符串起始地址** @return  void*/
void LCD_ShowString(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p)
{uint8_t x0 = x;width += x;height += y;while((*p <= '~') && (*p >= ' ')) //判断是不是非法字符!{if(x >= width){x = x0;y += size;}if(y >= height)break; //退出LCD_ShowChar(x, y, *p, size);x += size / 2;p++;}
}/*** @brief	显示图片** @remark	Image2Lcd取模方式:	C语言数据/水平扫描/16位真彩色(RGB565)/高位在前		其他的不要选** @param   x,y		起点坐标* @param   width	图片宽度* @param   height	图片高度* @param   p		图片缓存数据起始地址** @return  void*/
void LCD_Show_Image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *p)
{if(x + width > LCD_Width || y + height > LCD_Height){return;}LCD_Address_Set(x, y, x + width - 1, y + height - 1);LCD_DC(1);LCD_SPI_Send((uint8_t *)p, width * height * 2);
}/*** @brief	LCD初始化** @param   x,y		显示坐标** @return  void*/
void Display_ALIENTEK_LOGO(uint16_t x, uint16_t y)
{LCD_Show_Image(x, y, 240, 82, ALIENTEK_LOGO);
}/*** @brief	LCD初始化** @param   void** @return  void*/
void LCD_Init(void)
{LCD_Gpio_Init();	//硬件接口初始化delay_ms(120);/* Sleep Out */LCD_Write_Cmd(0x11);/* wait for power stability */delay_ms(120);/* Memory Data Access Control */LCD_Write_Cmd(0x36);LCD_Write_Data(0x00);/* RGB 5-6-5-bit  */LCD_Write_Cmd(0x3A);LCD_Write_Data(0x65);/* Porch Setting */LCD_Write_Cmd(0xB2);LCD_Write_Data(0x0C);LCD_Write_Data(0x0C);LCD_Write_Data(0x00);LCD_Write_Data(0x33);LCD_Write_Data(0x33);/*  Gate Control */LCD_Write_Cmd(0xB7);LCD_Write_Data(0x72);/* VCOM Setting */LCD_Write_Cmd(0xBB);LCD_Write_Data(0x3D);   //Vcom=1.625V/* LCM Control */LCD_Write_Cmd(0xC0);LCD_Write_Data(0x2C);/* VDV and VRH Command Enable */LCD_Write_Cmd(0xC2);LCD_Write_Data(0x01);/* VRH Set */LCD_Write_Cmd(0xC3);LCD_Write_Data(0x19);/* VDV Set */LCD_Write_Cmd(0xC4);LCD_Write_Data(0x20);/* Frame Rate Control in Normal Mode */LCD_Write_Cmd(0xC6);LCD_Write_Data(0x0F);	//60MHZ/* Power Control 1 */LCD_Write_Cmd(0xD0);LCD_Write_Data(0xA4);LCD_Write_Data(0xA1);/* Positive Voltage Gamma Control */LCD_Write_Cmd(0xE0);LCD_Write_Data(0xD0);LCD_Write_Data(0x04);LCD_Write_Data(0x0D);LCD_Write_Data(0x11);LCD_Write_Data(0x13);LCD_Write_Data(0x2B);LCD_Write_Data(0x3F);LCD_Write_Data(0x54);LCD_Write_Data(0x4C);LCD_Write_Data(0x18);LCD_Write_Data(0x0D);LCD_Write_Data(0x0B);LCD_Write_Data(0x1F);LCD_Write_Data(0x23);/* Negative Voltage Gamma Control */LCD_Write_Cmd(0xE1);LCD_Write_Data(0xD0);LCD_Write_Data(0x04);LCD_Write_Data(0x0C);LCD_Write_Data(0x11);LCD_Write_Data(0x13);LCD_Write_Data(0x2C);LCD_Write_Data(0x3F);LCD_Write_Data(0x44);LCD_Write_Data(0x51);LCD_Write_Data(0x2F);LCD_Write_Data(0x1F);LCD_Write_Data(0x1F);LCD_Write_Data(0x20);LCD_Write_Data(0x23);/* Display Inversion On */LCD_Write_Cmd(0x21);LCD_Write_Cmd(0x29);LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1);LCD_Clear(WHITE);/*打开显示*/LCD_PWR(1);
}

app_lcd.h

#ifndef __APP_LCD_H__
#define __APP_LCD_H__
#include "main.h"#include "stdint.h"
#include "stdio.h"
extern uint16_t	POINT_COLOR;		//默认画笔颜色
extern uint16_t	BACK_COLOR;		//默认背景颜色//LCD的宽和高定义
#define LCD_Width 	240
#define LCD_Height 	240//画笔颜色
#define WHITE         	 0xFFFF
#define BLACK         	 0x0000
#define BLUE         	 0x001F
#define BRED             0XF81F
#define GRED 			 0XFFE0
#define GBLUE			 0X07FF
#define RED           	 0xF800
#define MAGENTA       	 0xF81F
#define GREEN         	 0x07E0
#define CYAN          	 0x7FFF
#define YELLOW        	 0xFFE0
#define BROWN 			 0XBC40 //棕色
#define BRRED 			 0XFC07 //棕红色
#define GRAY  			 0X8430 //灰色
//GUI颜色#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色
#define GRAYBLUE       	 0X5458 //灰蓝色
//以上三色为PANEL的颜色#define LIGHTGREEN     	 0X841F //浅绿色
//#define LIGHTGRAY        0XEF5B //浅灰色(PANNEL)
#define LGRAY 			 0XC618 //浅灰色(PANNEL),窗体背景色#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)/*LCD_PWR:	PB7LCD_RST:	PB6LCD_DC:		PB4LCD_CS:		PD7
*/
#define	LCD_PWR(n)		(n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET))
#define	LCD_RST(n)		(n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET))
#define	LCD_DC(n)		(n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET))
#define	LCD_CS(n)		(n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_RESET))void LCD_Init(void);																	//初始化
void LCD_DisplayOn(void);																//开显示
void LCD_DisplayOff(void);																//关显示
void LCD_Write_HalfWord(const uint16_t da);													//写半个字节数据到LCD
void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);									//设置数据显示区域
void LCD_Clear(uint16_t color);																//清屏
void LCD_Fill(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t color);				//填充单色
void LCD_Fill_Buf(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end, uint16_t* clr_buf);		//填充BUF
void LCD_Draw_Point(uint16_t x, uint16_t y);														//画点
void LCD_Draw_ColorPoint(uint16_t x, uint16_t y,uint16_t color);										//画带颜色点
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);										//画线
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);									//画矩形
void LCD_Draw_Circle(uint16_t x0, uint16_t y0, uint8_t r);												//画圆
void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t chr, uint8_t size);										//显示一个字符
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size);									//显示一个数字
void LCD_ShowxNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size,uint8_t mode);							//显示数字
void LCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,char *p);					//显示字符串
void LCD_Show_Image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *p);					//显示图片
void Display_ALIENTEK_LOGO(uint16_t x,uint16_t y);												//显示ALIENTEK LOGO#endif

编写用户应用程序

#include "app_user_task.h"
#include "rtc.h"extern RTC_HandleTypeDef hrtc;RTC_TimeTypeDef time_data;
RTC_DateTypeDef date_data;/* @brief 用户程序初始化***/
void app_user_task_init(void)
{app_led_init();  /* LED初始化  */app_elog_init(); /* Easylogger初始化 */app_motor_init(); /*电机初始化 s*/LCD_Init();				//初始化LCD
}/* @brief 用户程序1*/
void app_user_task_demo1(void)
{app_led_control(LED_G,1);HAL_Delay(500);app_led_control(LED_G,0);HAL_Delay(500);HAL_RTC_GetTime(&hrtc,&time_data,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&date_data,RTC_FORMAT_BIN);usb_printf("%02d /%02d /%02d  %01d ",2000+date_data.Year,date_data.Month,date_data.Date,date_data.WeekDay); /* 打印日期 */usb_printf("%02d :%02d :%02d ",time_data.Hours,time_data.Minutes,time_data.Seconds);Display_ALIENTEK_LOGO(0, 0); /* 显示图片 */POINT_COLOR = RED; /*字色*/BACK_COLOR = WHITE; /*底色*/LCD_ShowString(0,100,240,24,24,"Date");LCD_ShowNum(0, 124, 2000+date_data.Year, 4, 24);LCD_ShowNum(24*2+24, 124, date_data.Month, 2, 24);LCD_ShowNum(24*3+48, 124, date_data.Date, 2, 24);LCD_ShowNum(24*4+72, 124, date_data.WeekDay, 1, 24);POINT_COLOR = BLUE; /*字色*/BACK_COLOR = WHITE; /*底色*/LCD_ShowString(0, 172,240,24,24,"Time");LCD_ShowNum(0, 196, time_data.Hours, 2, 24);LCD_ShowChar(24*1,196,':',24);LCD_ShowNum(24*1+24, 196, time_data.Minutes, 2, 24);LCD_ShowChar(24*2+24,196,':',24);LCD_ShowNum(24*3+24, 196, time_data.Seconds, 2, 24);}

实验效果

打开助手可以看到输出的日期和时间
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API项目5:申请签名 在线调用接口

开发申请签名 现在用户已经能看到这个接口了&#xff0c;也能看到这个接口文档&#xff0c;接下来就要在线调用 现在我们可以给每个新注册的用户自动分配一个签名和密钥&#xff0c;去修改一下注册流程&#xff1a; backend 项目&#xff0c;找到 UserServiceImpl.java 中的…

Miniconda管理虚拟环境【Python环境配置】

Miniconda管理虚拟环境【Python环境配置】 1. 下载并安装Miniconda2. 管理虚拟环境3. 管理虚拟环境中的包 1. 下载并安装Miniconda 1. 下载 从清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载Miniconda&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda…

go压缩的使用

基础&#xff1a;使用go创建一个zip func base(path string) {// 创建 zip 文件zipFile, err : os.Create("test.zip")if err ! nil {panic(err)}defer zipFile.Close()// 创建一个新的 *Writer 对象zipWriter : zip.NewWriter(zipFile)defer zipWriter.Close()// 创…

使用开源的 Vue 移动端表单设计器创建表单

FcDesigner Vant 版是一款基于 Vue3.0 的移动端低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 源码下载 | 演示地址 | 帮助文档 本项目采用 Vue3.0 和 …

HCIP open-Euler学习文档

第一期 操作系统基础&#xff0c;web基础 OpenEuler 目录 学习系统常用应用(Apache Nginx DNS MySQL)服务器集群架构(HAProxy, Nginx, LVS,keepalived)存储管理(GlusterFS,NAS,SAN)自动化基础(Ansible,SaltStack)Shell脚本基础(变量&#xff0c;语法&#xff0c;函数&…

使用fpm工具制作Vim.rpm包

背景&#xff1a;生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出&#xff08;CVE-2024-45306&#xff09;等漏洞。根据漏洞说明&#xff0c;需要升级到最新版。 奈何CentOS 7已经停止维护了&#xff0c;所以&#xff0c;想在网上找一个最新版的vim.rpm相当不容易…

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…

跨境业务收款难?Zoho Books来帮忙

外贸跨境企业应收账款管理繁琐&#xff0c;ZohoBooks财务管理软件提供自动化解决方案&#xff0c;简化开票、跟进、收款和账户更新流程&#xff0c;提升效率和准确性&#xff0c;助力企业优化现金流和财务健康。 什么是应收账款&#xff1f; 应收账款指的是企业在提供商品或服…

王爽汇编语言第三版实验1

前言 本系列的文章是对王爽老师的汇编语言中的实验的解答记录&#xff0c;原书一共有17个实验&#xff0c;由于学校的教学流程只做到了第14个实验&#xff0c;因此本文章只会有前十四个实验的解答记录,还有个比较重要的是&#xff0c;文章中会有原书实验中没有的题目&#xff…

汇总10个AI免费一键生成PPT的网站

一、前言 PPT幻灯片是现代办公和学习中的重要组成部分。它在工作、研究或培训中扮演着重要角色&#xff0c;并能够让观众更好地理解信息。随着当今人工智能技术的快速发展&#xff0c;现在有很多免费的AI PPT生成器可供选择&#xff0c;帮助用户更加便捷地制作出高效且具有较强…

rhce:列行性(at和cron)

配置 at练习 设置时间提醒 定义一分钟后显示命令&#xff0c;使用atq查看 cron练习 配置 systemctl status crond 查看文件所在位置 ll /var/spool/cron/ 主要功能 开始操作 进入界面操作每天早上9点说hello crontab -e 五个星号分别代表分时日月周&#xff0c;其次是执…

光通信——前传基本架构

一、前传基本架构 第三代移动通信技术引入了分布式射频接入网络&#xff08;Distributed Radio Access Network &#xff0c; D-RAN&#xff09;架构。在此架构中的的基带处理单元&#xff08; Baseband Unit &#xff0c; BBU&#xff09; 和 射频拉远单元&#xff08; Remot…

Kafka-初识

一、Kafka是什么&#xff1f; Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台&#xff0c;由服务器和客户端组成&#xff0c;通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上&#xff0c;也可以部署在本…

springboot034在线商城系统设计与开发-代码(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;ONLY在线商城系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本ONLY在线商城系统…

Wordpress—一个神奇的个人博客搭建框架

wordpress简介 在当今数字化的时代&#xff0c;拥有一个属于自己的个人博客&#xff0c;不仅可以记录生活点滴、分享专业知识&#xff0c;还能展示个人风采。而在众多的博客搭建框架中&#xff0c;Wordpress 以其强大的功能和灵活性脱颖而出。今天&#xff0c;就让我们一起深入…

大数据研究实训室建设方案

一、概述 本方案旨在提出一套全面的大数据研究实训室建设策略&#xff0c;旨在为学生打造一个集理论学习与实践操作于一体的高端教育环境。实训室将专注于培养学生在大数据处理、分析及应用领域的专业技能&#xff0c;通过先进的设施配置、科学的课程体系和实用的实训模式&…

红黑树的底层讲解

一、红黑树的介绍 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是红&#xff08;red&#xff09;或黑&#xff08;black&#xff09;。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红…

linux环境下的程序设计与git操作

目录 前言&#xff1a; 进度条小程序&#xff1a; 先介绍几个背景知识 代码实现 Git操作 总结 其他指令 前言&#xff1a; 本文将重点介绍1. linux下的程序设计&#xff0c;并使用linux下的几个函数接口。实现一个简单的小程序 2.本着开源精神&#xff0c;进行git操作。…

Vue详细入门(语法【三】)

今天滴的学习目标&#xff01;&#xff01;&#xff01; Vue组件是什么&#xff1f;组件的特性和优势Vue3计算属性Vue3监听属性 在前面Vue详细入门&#xff08;语法【一】——【二】&#xff09;当中我们学习了Vue有哪些指令&#xff0c;它的核心语法有哪些&#xff1f;今天我们…

(AtCoder Beginner Contest 375) 题解(下)

一、题解 第 E 题 3 Team Division 一眼看像背包&#xff0c;观察数据范围&#xff0c;合法的总能力值 ≤ 500 \le 500 ≤500&#xff0c;那么我们可以设计一个背包DP&#xff1a; int dp[110][510][510]; //dp[i][j][k] 表示前 i 个人&#xff0c;分给第一组的能力值是 j&…