From 9b5fc13c0c0b0ea8188ed9216d0aa688d8411e2d Mon Sep 17 00:00:00 2001 From: RB Date: Thu, 10 Apr 2025 17:17:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=B7=E7=A0=81=E8=83=BD=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- MDK-ARM/mini_croe.uvoptx | 76 +- MDK-ARM/mini_croe.uvprojx | 20 + MDK-ARM/mini_croe/mini_croe.axf | Bin 987156 -> 1003208 bytes MDK-ARM/mini_croe/mini_croe.hex | 1851 +++++++++++++++++-------------- User/bsp/buzzer.c | 36 + User/bsp/buzzer.h | 22 + User/bsp/spi.h | 2 +- User/device/lcd.c | 169 +++ User/device/lcd.h | 36 + User/device/lcd_font.h | 104 ++ User/task/mointor.c | 8 +- 12 files changed, 1470 insertions(+), 857 deletions(-) create mode 100644 User/bsp/buzzer.c create mode 100644 User/bsp/buzzer.h create mode 100644 User/device/lcd.c create mode 100644 User/device/lcd.h create mode 100644 User/device/lcd_font.h diff --git a/.vscode/settings.json b/.vscode/settings.json index 13f77f2..4556b1b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.associations": { - "spi.h": "c" + "spi.h": "c", + "lcd.h": "c" } } \ No newline at end of file diff --git a/MDK-ARM/mini_croe.uvoptx b/MDK-ARM/mini_croe.uvoptx index 724f8cd..24af30b 100644 --- a/MDK-ARM/mini_croe.uvoptx +++ b/MDK-ARM/mini_croe.uvoptx @@ -778,6 +778,30 @@ 0 0 + + 6 + 43 + 1 + 0 + 0 + 0 + ..\User\bsp\buzzer.c + buzzer.c + 0 + 0 + + + 6 + 44 + 5 + 0 + 0 + 0 + ..\User\bsp\buzzer.h + buzzer.h + 0 + 0 + @@ -796,7 +820,7 @@ 0 8 - 43 + 45 1 0 0 @@ -808,7 +832,7 @@ 8 - 44 + 46 1 0 0 @@ -820,7 +844,7 @@ 8 - 45 + 47 1 0 0 @@ -832,7 +856,7 @@ 8 - 46 + 48 1 0 0 @@ -844,7 +868,7 @@ 8 - 47 + 49 1 0 0 @@ -856,7 +880,7 @@ 8 - 48 + 50 1 0 0 @@ -868,7 +892,7 @@ 8 - 49 + 51 5 0 0 @@ -888,7 +912,7 @@ 0 9 - 50 + 52 1 0 0 @@ -900,7 +924,7 @@ 9 - 51 + 53 5 0 0 @@ -920,7 +944,7 @@ 0 10 - 52 + 54 1 0 0 @@ -932,7 +956,7 @@ 10 - 53 + 55 5 0 0 @@ -944,7 +968,7 @@ 10 - 54 + 56 1 0 0 @@ -956,7 +980,7 @@ 10 - 55 + 57 5 0 0 @@ -968,7 +992,7 @@ 10 - 56 + 58 5 0 0 @@ -978,6 +1002,30 @@ 0 0 + + 10 + 59 + 1 + 0 + 0 + 0 + ..\User\device\lcd.c + lcd.c + 0 + 0 + + + 10 + 60 + 5 + 0 + 0 + 0 + ..\User\device\lcd.h + lcd.h + 0 + 0 + diff --git a/MDK-ARM/mini_croe.uvprojx b/MDK-ARM/mini_croe.uvprojx index e49afa8..a9b6482 100644 --- a/MDK-ARM/mini_croe.uvprojx +++ b/MDK-ARM/mini_croe.uvprojx @@ -1452,6 +1452,16 @@ 5 ..\User\bsp\spi.h + + buzzer.c + 1 + ..\User\bsp\buzzer.c + + + buzzer.h + 5 + ..\User\bsp\buzzer.h + @@ -1540,6 +1550,16 @@ 5 ..\User\device\device.h + + lcd.c + 1 + ..\User\device\lcd.c + + + lcd.h + 5 + ..\User\device\lcd.h + diff --git a/MDK-ARM/mini_croe/mini_croe.axf b/MDK-ARM/mini_croe/mini_croe.axf index 8617ef0fe474f1a3155e12a8f1c57c4d0c120442..f4ad731be1ce6e2c986f06294fac4e479ed47363 100644 GIT binary patch delta 43246 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 delta 33500 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¨`-$69GVo2VUDcKWYKOO%+13?>VBA8*-Q>u#v|HR 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 +#include + +/* Private define ----------------------------------------------------------- */ +/* Private macro ------------------------------------------------------------ */ +/* Private typedef ---------------------------------------------------------- */ +/* Private variables -------------------------------------------------------- */ +/* Private function -------------------------------------------------------- */ +/* Exported functions ------------------------------------------------------- */ +int8_t BSP_Buzzer_Start(void) { + if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4) == HAL_OK) return BSP_OK; + return BSP_ERR; +} + +/** + * @brief 设置蜂鸣器频率和占空比 + * @param freq + * @param duty_cycle + * @return + */ +int8_t BSP_Buzzer_Set(float freq, float duty_cycle) { + uint16_t pulse = (uint16_t)(duty_cycle * (float)UINT16_MAX); + __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, pulse); + + pulse = (uint16_t)freq; + __HAL_TIM_PRESCALER(&htim3, pulse); + return BSP_OK; +} + +int8_t BSP_Buzzer_Stop(void) { + if (HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_4) == HAL_OK) return BSP_OK; + return BSP_ERR; +} diff --git a/User/bsp/buzzer.h b/User/bsp/buzzer.h new file mode 100644 index 0000000..385aa05 --- /dev/null +++ b/User/bsp/buzzer.h @@ -0,0 +1,22 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ----------------------------------------------------------------- */ +#include + +#include "bsp/bsp.h" + +/* Exported constants ------------------------------------------------------- */ +/* Exported macro ----------------------------------------------------------- */ +/* Exported types ----------------------------------------------------------- */ +/* Exported functions prototypes -------------------------------------------- */ +int8_t BSP_Buzzer_Start(void); +int8_t BSP_Buzzer_Set(float freq, float duty_cycle); +int8_t BSP_Buzzer_Stop(void); + +#ifdef __cplusplus +} +#endif diff --git a/User/bsp/spi.h b/User/bsp/spi.h index 464ec70..1a83371 100644 --- a/User/bsp/spi.h +++ b/User/bsp/spi.h @@ -14,7 +14,7 @@ // /* SPI实体枚举,与设备对应 */ // typedef enum { -// BSP_SPI_ADC, +// BSP_SPI_LCD, // } BSP_SPI_t; // /* Exported functions prototypes -------------------------------------------- */ diff --git a/User/device/lcd.c b/User/device/lcd.c new file mode 100644 index 0000000..3eb7e47 --- /dev/null +++ b/User/device/lcd.c @@ -0,0 +1,169 @@ +#include "lcd.h" +#include "lcd_font.h" + + +// 写命令 +static void LCD_WriteCommand(uint8_t cmd) { + LCD_DC_LOW(); + LCD_CS_LOW(); + HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); + LCD_CS_HIGH(); +} + +// 写数据 +static void LCD_WriteData(uint8_t data) { + LCD_DC_HIGH(); + LCD_CS_LOW(); + HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY); + LCD_CS_HIGH(); +} + +// 写16位数据 +static void LCD_WriteData16(uint16_t data) { + uint8_t buf[2] = {data >> 8, data & 0xFF}; + LCD_DC_HIGH(); + LCD_CS_LOW(); + HAL_SPI_Transmit(&hspi1, buf, 2, HAL_MAX_DELAY); + LCD_CS_HIGH(); +} + +// 初始化LCD +void LCD_Init(void) { + // 复位屏幕 + LCD_RST_LOW(); + HAL_Delay(10); + LCD_RST_HIGH(); + HAL_Delay(10); + + // 初始化命令序列(以ST7789为例) + LCD_WriteCommand(0x36); // Memory Data Access Control + LCD_WriteData(0xC0); // RGB Color Order + + LCD_WriteCommand(0x3A); // Interface Pixel Format + LCD_WriteData(0x05); // 16-bit/pixel + + LCD_WriteCommand(0xB2); // Porch Setting + LCD_WriteData(0x0C); + LCD_WriteData(0x0C); + LCD_WriteData(0x00); + LCD_WriteData(0x33); + LCD_WriteData(0x33); + + LCD_WriteCommand(0xB7); // Gate Control + LCD_WriteData(0x35); + + LCD_WriteCommand(0xBB); // VCOM Setting + LCD_WriteData(0x19); + + LCD_WriteCommand(0xC0); // LCM Control + LCD_WriteData(0x2C); + + LCD_WriteCommand(0xC2); // VDV and VRH Command Enable + LCD_WriteData(0x01); + LCD_WriteCommand(0xC3); // VRH Set + LCD_WriteData(0x12); + LCD_WriteCommand(0xC4); // VDV Set + LCD_WriteData(0x20); + + LCD_WriteCommand(0xC6); // Frame Rate Control + LCD_WriteData(0x0F); + + LCD_WriteCommand(0xD0); // Power Control 1 + LCD_WriteData(0xA4); + LCD_WriteData(0xA1); + + LCD_WriteCommand(0xE0); // Positive Voltage Gamma Control + LCD_WriteData(0xD0); + LCD_WriteData(0x04); + LCD_WriteData(0x0D); + LCD_WriteData(0x11); + LCD_WriteData(0x13); + LCD_WriteData(0x2B); + LCD_WriteData(0x3F); + LCD_WriteData(0x54); + LCD_WriteData(0x4C); + LCD_WriteData(0x18); + LCD_WriteData(0x0D); + LCD_WriteData(0x0B); + LCD_WriteData(0x1F); + LCD_WriteData(0x23); + + LCD_WriteCommand(0xE1); // Negative Voltage Gamma Control + LCD_WriteData(0xD0); + LCD_WriteData(0x04); + LCD_WriteData(0x0C); + LCD_WriteData(0x11); + LCD_WriteData(0x13); + LCD_WriteData(0x2C); + LCD_WriteData(0x3F); + LCD_WriteData(0x44); + LCD_WriteData(0x51); + LCD_WriteData(0x2F); + LCD_WriteData(0x1F); + LCD_WriteData(0x1F); + LCD_WriteData(0x20); + LCD_WriteData(0x23); + + LCD_WriteCommand(0x21); // Inversion On + LCD_WriteCommand(0x11); // Sleep Out + HAL_Delay(120); + LCD_WriteCommand(0x29); // Display On +} + +// 清屏 +void LCD_Clear(uint16_t color) { + LCD_WriteCommand(0x2A); // Column Address Set + LCD_WriteData16(X_OFFSET); // 起始列地址 + LCD_WriteData16(X_OFFSET + LCD_WIDTH - 1); // 结束列地址 + + LCD_WriteCommand(0x2B); // Row Address Set + LCD_WriteData16(Y_OFFSET); // 起始行地址 + LCD_WriteData16(Y_OFFSET + LCD_HEIGHT - 1); // 结束行地址 + + LCD_WriteCommand(0x2C); // Memory Write + for (uint32_t i = 0; i < LCD_WIDTH * LCD_HEIGHT; i++) { + LCD_WriteData16(color); + } +} + +// 绘制单个像素 +void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color) { + if (x >= LCD_WIDTH || y >= LCD_HEIGHT) return; // 超出屏幕范围则返回 + + LCD_WriteCommand(0x2A); // 设置列地址 + LCD_WriteData16(X_OFFSET + x); + LCD_WriteData16(X_OFFSET + x); + + LCD_WriteCommand(0x2B); // 设置行地址 + LCD_WriteData16(Y_OFFSET + y); + LCD_WriteData16(Y_OFFSET + y); + + LCD_WriteCommand(0x2C); // 写入内存 + LCD_WriteData16(color); +} + +// 在指定位置显示一个字符 +void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bgColor) { + if (ch < 32 || ch > 126) return; // 字符范围检查 (ASCII 32-126) + + const uint8_t *charData = ascii_1206[ch - 32]; // 获取字符点阵数据 + for (uint8_t i = 0; i < FONT_HEIGHT; i++) { // 遍历字符的高度 + uint8_t line = charData[i]; // 获取字符的每一行数据 + for (uint8_t j = 0; j < FONT_WIDTH; j++) { // 遍历字符的宽度 + if (line & (1 << j)) { // 判断当前像素是否为1 + LCD_DrawPixel(x + j, y + i, color); // 绘制前景色 + } else { + LCD_DrawPixel(x + j, y + i, bgColor); // 绘制背景色 + } + } + } +} + +// 在指定位置显示字符串 +void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bgColor) { + while (*str) { + LCD_DrawChar(x, y, *str, color, bgColor); // 显示单个字符 + x += FONT_WIDTH; // 移动到下一个字符位置 + str++; + } +} \ No newline at end of file diff --git a/User/device/lcd.h b/User/device/lcd.h new file mode 100644 index 0000000..d37ab1b --- /dev/null +++ b/User/device/lcd.h @@ -0,0 +1,36 @@ +#ifndef __LCD_H +#define __LCD_H + +#include "spi.h" +#include "gpio.h" + +// 屏幕分辨率 +#define LCD_WIDTH 135 +#define LCD_HEIGHT 240 + +#define X_OFFSET 52 +#define Y_OFFSET 40 + + +// 常用颜色定义 +#define BLACK 0x0000 +#define WHITE 0xFFFF +#define RED 0xF800 +#define GREEN 0x07E0 +#define BLUE 0x001F + +// 控制引脚 +#define LCD_CS_LOW() HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_RESET) +#define LCD_CS_HIGH() HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_SET) +#define LCD_DC_LOW() HAL_GPIO_WritePin(TFT_RS_GPIO_Port, TFT_RS_Pin, GPIO_PIN_RESET) +#define LCD_DC_HIGH() HAL_GPIO_WritePin(TFT_RS_GPIO_Port, TFT_RS_Pin, GPIO_PIN_SET) +#define LCD_RST_LOW() HAL_GPIO_WritePin(TFT_RES_GPIO_Port, TFT_RES_Pin, GPIO_PIN_RESET) +#define LCD_RST_HIGH() HAL_GPIO_WritePin(TFT_RES_GPIO_Port, TFT_RES_Pin, GPIO_PIN_SET) + +// 函数声明 +void LCD_Init(void); +void LCD_Clear(uint16_t color); +void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color); +void LCD_DrawChar(uint16_t x, uint16_t y, char ch, uint16_t color, uint16_t bgColor); +void LCD_DrawString(uint16_t x, uint16_t y, const char *str, uint16_t color, uint16_t bgColor); +#endif // __LCD_H diff --git a/User/device/lcd_font.h b/User/device/lcd_font.h new file mode 100644 index 0000000..b9660fd --- /dev/null +++ b/User/device/lcd_font.h @@ -0,0 +1,104 @@ +#pragma once + +#include + +#define FONT_WIDTH 6 +#define FONT_HEIGHT 12 + +const unsigned char ascii_1206[][12]={ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ + {0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00},/*"!",1*/ + {0x14,0x14,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ + {0x00,0x00,0x0A,0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x00,0x00},/*"#",3*/ + {0x00,0x04,0x0E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0E,0x04,0x00},/*"$",4*/ + {0x00,0x00,0x12,0x15,0x0D,0x15,0x2E,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/ + {0x00,0x00,0x04,0x0A,0x0A,0x36,0x15,0x15,0x29,0x16,0x00,0x00},/*"&",6*/ + {0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ + {0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x00},/*"(",8*/ + {0x02,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x02,0x00},/*")",9*/ + {0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/ + {0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00,0x00,0x00},/*"+",11*/ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00},/*",",12*/ + {0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/ + {0x00,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x00},/*"/",15*/ + {0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/ + {0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/ + {0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/ + {0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/ + {0x00,0x00,0x08,0x0C,0x0C,0x0A,0x09,0x1F,0x08,0x1C,0x00,0x00},/*"4",20*/ + {0x00,0x00,0x1F,0x01,0x01,0x0F,0x11,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/ + {0x00,0x00,0x0C,0x12,0x01,0x0D,0x13,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/ + {0x00,0x00,0x1E,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/ + {0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/ + {0x00,0x00,0x0E,0x11,0x11,0x19,0x16,0x10,0x09,0x06,0x00,0x00},/*"9",25*/ + {0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/ + {0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/ + {0x00,0x00,0x10,0x08,0x04,0x02,0x02,0x04,0x08,0x10,0x00,0x00},/*"<",28*/ + {0x00,0x00,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ + {0x00,0x00,0x02,0x04,0x08,0x10,0x10,0x08,0x04,0x02,0x00,0x00},/*">",30*/ + {0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/ + {0x00,0x00,0x1C,0x22,0x29,0x2D,0x2D,0x1D,0x22,0x1C,0x00,0x00},/*"@",32*/ + {0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/ + {0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/ + {0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/ + {0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/ + {0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/ + {0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/ + {0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/ + {0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/ + {0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/ + {0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07},/*"J",42*/ + {0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x12,0x12,0x37,0x00,0x00},/*"K",43*/ + {0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/ + {0x00,0x00,0x3B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x35,0x00,0x00},/*"M",45*/ + {0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/ + {0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/ + {0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/ + {0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/ + {0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/ + {0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/ + {0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/ + {0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/ + {0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/ + {0x00,0x00,0x15,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/ + {0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/ + {0x00,0x00,0x1B,0x0A,0x0A,0x0A,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/ + {0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/ + {0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/ + {0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x00},/*"\",60*/ + {0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/ + {0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/ + {0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ + {0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/ + {0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/ + {0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x12,0x0C,0x00,0x00},/*"c",67*/ + {0x00,0x18,0x10,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/ + {0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/ + {0x00,0x18,0x24,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/ + {0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1C,0x22,0x1C},/*"g",71*/ + {0x00,0x03,0x02,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/ + {0x00,0x04,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/ + {0x00,0x08,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/ + {0x00,0x03,0x02,0x02,0x02,0x1A,0x0A,0x06,0x0A,0x13,0x00,0x00},/*"k",75*/ + {0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/ + {0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/ + {0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/ + {0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/ + {0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/ + {0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/ + {0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/ + {0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/ + {0x00,0x00,0x00,0x04,0x04,0x1E,0x04,0x04,0x04,0x1C,0x00,0x00},/*"t",84*/ + {0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/ + {0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x00,0x00},/*"v",86*/ + {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/ + {0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/ + {0x00,0x00,0x00,0x00,0x00,0x33,0x12,0x12,0x0C,0x08,0x04,0x03},/*"y",89*/ + {0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/ + {0x18,0x08,0x08,0x08,0x08,0x0C,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/ + {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/ + {0x06,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/ + {0x16,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ +}; \ No newline at end of file diff --git a/User/task/mointor.c b/User/task/mointor.c index f78ecfd..9d43680 100644 --- a/User/task/mointor.c +++ b/User/task/mointor.c @@ -1,6 +1,8 @@ /* Includes ----------------------------------------------------------------- */ #include "task\user_task.h" #include "bsp\led.h" +#include "bsp\buzzer.h" +#include "device\lcd.h" /* Private typedef ---------------------------------------------------------- */ /* Private define ----------------------------------------------------------- */ @@ -12,7 +14,11 @@ void Task_Monitor(void *argument) { (void)argument; // 消除未使用参数的警告 const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_MONITOR; // 100Hz uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */ - + LCD_Init(); + LCD_Clear(BLACK); + LCD_Clear(RED); + LCD_DrawChar(0, 0, '0', WHITE, BLACK); // 在屏幕上显示字符 + LCD_DrawString(0, 20, "Hello", WHITE, BLACK); // 在屏幕上显示字符串 BSP_LED_Set(BSP_LED_RED, BSP_LED_ON, 0); BSP_LED_Set(BSP_LED_BLUE, BSP_LED_ON, 0); while (1) {