first commit

This commit is contained in:
2026-01-24 20:03:14 +08:00
commit a2224908e3
318 changed files with 278538 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,787 @@
#ifndef __160160D_H__
#define __160160D_H__
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#define LCD_EXT extern
#define DISPLAY_BLANK 0x00
#define PROTEC_ON 0x01
#define PROTEC_EXIT 0x02
#define PROTEC_START 0x03
#define PROTECT_TRIP 0x04
#define HEART_ACCUM 0x05
#define HEART_REDUCE 0x06
#define NEXT_MENU 0x07
#define UP_DOWN 0x08
#define LEFT_RIGHT 0x09
#define DERECTION_KEY 0x0a
#define ENTER_KEY 0x0b
#define ESC_KEY 0x0c
#define ADD_DEC 0x0d
#define DI_CLOSE 0x0e
#define DI_OPEN 0x0f
#define DI_UNCERT 0x10
#define DELET_MESS 0x11
#define HAVE_MESS 0x12
#define CODE_PASS 0x13
#define CODE_ERROR 0x14
LCD_EXT void display_datas(unsigned char datas); //R-G-B=4-4-4
LCD_EXT void display_line(unsigned char datas);
LCD_EXT void ReverseShow88(uint8_t column ,uint8_t lin,uint8_t const *address);
LCD_EXT void ReverseShow916(uint8_t column ,uint8_t lin,uint8_t const *address);
LCD_EXT void DisplayOneByteS(uint8_t ox, uint8_t oy, uint8_t byte1);
LCD_EXT void DisplayOneText(uint8_t ox,uint8_t oy,uint8_t ascii_code);
LCD_EXT void Clear_Line(uint8_t ox1,uint8_t ox2,uint8_t oy,uint8_t number1,uint8_t number2,uint8_t language);
LCD_EXT void DisplayBrokenLine(uint8_t ox,uint8_t oy,uint8_t num);
LCD_EXT void DisplaySolidLine(uint8_t ox,uint8_t oy,uint8_t num);
LCD_EXT void DisplayLineText2(uint8_t ox,uint8_t oy,uint8_t number,uint8_t const *ptr);
LCD_EXT void DisplayOneChinesetest(uint8_t column,uint8_t lin);
LCD_EXT void REDisplayOneChinesetest(uint8_t column,uint8_t lin);
LCD_EXT void ReverseDispOne(uint8_t ox,uint8_t oy,uint8_t ascii_code);
LCD_EXT void ReverseLineText(uint8_t ox,uint8_t oy,uint8_t number,uint8_t const *ptr);
LCD_EXT void ReverseDispLine(uint8_t ox,uint8_t oy,uint8_t number,uint8_t const *ptr);
LCD_EXT void ReverseOneGraphics(uint8_t column,uint8_t lin,uint16_t hzcode,uint8_t tb_index);
LCD_EXT void display_pic(unsigned char *p);
LCD_EXT void display_pic1(unsigned char *p);
LCD_EXT void DisplayOneGraphics(uint8_t column,uint8_t lin, uint16_t hzcode,uint8_t tb_index);
LCD_EXT void DisplayConnectGraphics(uint8_t column,uint8_t lin,uint16_t hzcode);
LCD_EXT void DisplayOneChinese(uint8_t column,uint8_t lin,uint8_t const *HzCode);
LCD_EXT void DisplayLineChinese(uint8_t ox1,uint8_t oy1,uint8_t number1,uint8_t const *ptr1,uint8_t ox2,uint8_t oy2,uint8_t number2,uint8_t const *ptr2,uint8_t language);
LCD_EXT void DeleteMenuCursor(uint8_t x1,uint8_t y1,uint8_t const *ptr1,uint8_t x2,uint8_t y2,uint8_t const *ptr2,uint8_t num,uint8_t num2,uint8_t language);
LCD_EXT void DisplayMenuCursor(uint8_t x1,uint8_t y1,uint8_t const *ptr1,uint8_t x2,uint8_t y2,uint8_t const *ptr2,uint8_t num,uint8_t num2,uint8_t language);
LCD_EXT void ClearScreen(void);
void ReverseScreen(void);
LCD_EXT void CloseDataCursor(void);
LCD_EXT void DisplayDataCursor2(void);
LCD_EXT void DisplayDataCursor(void);
LCD_EXT void DisplayOneInt(uint8_t ox,uint8_t oy, uint16_t int_value);
LCD_EXT void DisplayOneText2(uint8_t ox,uint8_t oy,uint8_t ascii_code);
LCD_EXT void DisplayHoriLine(uint8_t column,uint8_t lin,uint8_t num);
LCD_EXT void DisplayOneByte(uint8_t ox, uint8_t oy, uint8_t byte1);
LCD_EXT void DisplayGraphicsScreen(void);
LCD_EXT void DisplayLineText(uint8_t ox,uint8_t oy,uint8_t number,uint8_t const *ptr);
LCD_EXT void DisplayOneInt2(uint8_t ox,uint8_t oy, uint16_t int_value);
LCD_EXT void DisplayLongInt(uint8_t ox,uint8_t oy, uint32_t value,uint8_t redixs_point);
LCD_EXT void DisplayOneByte2(uint8_t ox, uint8_t oy, uint8_t byte1);
LCD_EXT void LcdInit(void);
LCD_EXT void ReverseDispNum2(uint8_t ox,uint8_t oy,uint8_t ascii_code);
LCD_EXT void DisplayCount(uint8_t ox, uint8_t oy, uint8_t byte1);
LCD_EXT void DisplayHex(uint8_t ox,uint8_t oy,uint16_t number);
LCD_EXT void ReverseDispOne2(uint8_t ox,uint8_t oy,uint8_t ascii_code);
void Fault_Disp(void);
void KeyRun_Disp(uint32_t Flag);
void IP_Sprintf(uint8_t *buf, uint32_t IPdata);
void IP_Printf(uint8_t x, uint32_t y, uint32_t IPdata, FlagStatus SetFlag, uint32_t cursor);
void HZ12AndChar_Printf(uint8_t x, uint8_t y, const uint8_t *ptr, FlagStatus Flag);
void HZ12AndChar_SignPrintf(uint8_t x, uint8_t y, const uint8_t *ptr, uint32_t SignNUM );
void DisplayNL_LOGO(void);
void DisplayNANRUI_LOGO(void);
void DisplayNANRUI_BMP(void);
void Display_BMP(uint32_t Width, uint32_t Height, const uint8_t* picture);
void DisplayQQ_BMP(void);
void ASCII_Printf(uint8_t x, uint32_t y, uint32_t data, FlagStatus Flag);
void ASCII_SignPrintf(uint8_t x, uint32_t y, uint32_t data, uint32_t SignNUM);
void IntValue_Printf(uint8_t x, uint32_t y, int32_t data, FlagStatus Flag);
void FloatValue_Printf(uint8_t x, uint32_t y, float data, FlagStatus Flag);
void FixLenIToF_Printf(uint32_t x, uint32_t y, int32_t data, uint32_t len, uint32_t dot, FlagStatus Flag, uint32_t cursor);
void FixLenIToF_Sprintf(uint8_t* str, int32_t data, uint32_t len, uint32_t dot);
void DisplayHorizontalLine(uint8_t x,uint8_t y,uint8_t len);
void DisplayVerticalLine(uint8_t x,uint8_t y,uint8_t high, uint8_t value);
void ClearMenuScreen(void);
void ScreenPrintf(uint8_t* ptr);
void Char6_Write(uint8_t x,uint8_t y, uint8_t CharCode, FlagStatus Flag);
void MessageBox(void);
void ClrMessageBox(void);
void ClrMessageBoxContent(void);
void MeunItem_Printf(uint8_t x, uint32_t y, int32_t data, FlagStatus Flag);
void MessageSetBox(const uint8_t *title);
void MessageSetBox_NoClear(const uint8_t *title);
void ClrMessageSetBox(void);
void DeleteMessageSetBox(void);
void ProgramableMessageBox(uint8_t x, uint8_t y, uint8_t size);
void DrawMenuComboBox(uint8_t x, uint8_t y, uint8_t len, uint8_t items);
void DrawRecordBox(uint8_t x, uint8_t y, uint8_t len, uint8_t items);
void BackLight_Close(void);
void BackLight_ON(void);
static const uint8_t ASCII6x12[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00,/*"!",1*/
0x00,0x28,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/
0x00,0x00,0x28,0x28,0xFC,0x28,0x50,0xFC,0x50,0x50,0x00,0x00,/*"#",3*/
0x00,0x20,0x78,0xA8,0xA0,0x60,0x30,0x28,0xA8,0xF0,0x20,0x00,/*"$",4*/
0x00,0x00,0x48,0xA8,0xB0,0x50,0x28,0x34,0x54,0x48,0x00,0x00,/*"%",5*/
0x00,0x00,0x20,0x50,0x50,0x78,0xA8,0xA8,0x90,0x6C,0x00,0x00,/*"&",6*/
0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/
0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x00,/*"(",8*/
0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00,/*")",9*/
0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00,0x00,0x00,/*"*",10*/
0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00,0x00,/*"+",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,/*",",12*/
0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,/*".",14*/
0x00,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00,/*"/",15*/
0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,/*"0",16*/
0x00,0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,/*"1",17*/
0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00,/*"2",18*/
0x00,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00,/*"3",19*/
0x00,0x00,0x10,0x30,0x50,0x50,0x90,0x78,0x10,0x18,0x00,0x00,/*"4",20*/
0x00,0x00,0xF8,0x80,0x80,0xF0,0x08,0x08,0x88,0x70,0x00,0x00,/*"5",21*/
0x00,0x00,0x70,0x90,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00,/*"6",22*/
0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x20,0x20,0x20,0x00,0x00,/*"7",23*/
0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00,/*"8",24*/
0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x48,0x70,0x00,0x00,/*"9",25*/
0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x60,0x60,0x00,/*":",26*/
0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00,/*";",27*/
0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,/*"<",28*/
0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,/*"=",29*/
0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00,/*">",30*/
0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00,/*"?",31*/
0x00,0x00,0x70,0x88,0x98,0xA8,0xA8,0xB8,0x80,0x78,0x00,0x00,/*"@",32*/
0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00,/*"A",33*/
0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00,/*"B",34*/
0x00,0x00,0x78,0x88,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00,/*"C",35*/
0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00,/*"D",36*/
0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x48,0xF8,0x00,0x00,/*"E",37*/
0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x40,0xE0,0x00,0x00,/*"F",38*/
0x00,0x00,0x38,0x48,0x80,0x80,0x9C,0x88,0x48,0x30,0x00,0x00,/*"G",39*/
0x00,0x00,0xCC,0x48,0x48,0x78,0x48,0x48,0x48,0xCC,0x00,0x00,/*"H",40*/
0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,/*"I",41*/
0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0xE0,0x00,/*"J",42*/
0x00,0x00,0xEC,0x48,0x50,0x60,0x50,0x50,0x48,0xEC,0x00,0x00,/*"K",43*/
0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x44,0xFC,0x00,0x00,/*"L",44*/
0x00,0x00,0xD8,0xD8,0xD8,0xD8,0xA8,0xA8,0xA8,0xA8,0x00,0x00,/*"M",45*/
0x00,0x00,0xDC,0x48,0x68,0x68,0x58,0x58,0x48,0xE8,0x00,0x00,/*"N",46*/
0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,/*"O",47*/
0x00,0x00,0xF0,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00,/*"P",48*/
0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xE8,0x98,0x70,0x18,0x00,/*"Q",49*/
0x00,0x00,0xF0,0x48,0x48,0x70,0x50,0x48,0x48,0xEC,0x00,0x00,/*"R",50*/
0x00,0x00,0x78,0x88,0x80,0x60,0x10,0x08,0x88,0xF0,0x00,0x00,/*"S",51*/
0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,/*"T",52*/
0x00,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00,/*"U",53*/
0x00,0x00,0xCC,0x48,0x48,0x50,0x50,0x30,0x20,0x20,0x00,0x00,/*"V",54*/
0x00,0x00,0xA8,0xA8,0xA8,0x70,0x50,0x50,0x50,0x50,0x00,0x00,/*"W",55*/
0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x50,0x50,0xD8,0x00,0x00,/*"X",56*/
0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x20,0x20,0x70,0x00,0x00,/*"Y",57*/
0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x40,0x48,0xF8,0x00,0x00,/*"Z",58*/
0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,/*"[",59*/
0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x00,0x00,/*"\",60*/
0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00,/*"]",61*/
0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,/*"_",63*/
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00,/*"a",65*/
0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00,/*"b",66*/
0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x40,0x40,0x38,0x00,0x00,/*"c",67*/
0x00,0x00,0x18,0x08,0x08,0x38,0x48,0x48,0x48,0x3C,0x00,0x00,/*"d",68*/
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00,/*"e",69*/
0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x78,0x00,0x00,/*"f",70*/
0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x30,0x40,0x78,0x44,0x38,/*"g",71*/
0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0xEC,0x00,0x00,/*"h",72*/
0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00,/*"i",73*/
0x00,0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0,/*"j",74*/
0x00,0x00,0xC0,0x40,0x40,0x5C,0x50,0x70,0x48,0xEC,0x00,0x00,/*"k",75*/
0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,/*"l",76*/
0x00,0x00,0x00,0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0x00,0x00,/*"m",77*/
0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0xEC,0x00,0x00,/*"n",78*/
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00,/*"o",79*/
0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x40,0xE0,/*"p",80*/
0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x1C,/*"q",81*/
0x00,0x00,0x00,0x00,0x00,0xD8,0x60,0x40,0x40,0xE0,0x00,0x00,/*"r",82*/
0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x30,0x08,0x78,0x00,0x00,/*"s",83*/
0x00,0x00,0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x18,0x00,0x00,/*"t",84*/
0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00,/*"u",85*/
0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x00,0x00,/*"v",86*/
0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x50,0x50,0x00,0x00,/*"w",87*/
0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x20,0x50,0xD8,0x00,0x00,/*"x",88*/
0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x20,0xC0,/*"y",89*/
0x00,0x00,0x00,0x00,0x00,0x78,0x10,0x20,0x20,0x78,0x00,0x00,/*"z",90*/
0x00,0x18,0x10,0x10,0x10,0x20,0x10,0x10,0x10,0x10,0x18,0x00,/*"{",91*/
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,/*"|",92*/
0x00,0x60,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x60,0x00,/*"}",93*/
0x40,0xA4,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/
};
static const uint8_t ASCII8x12[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x18,0x00,0x00,/*"!",1*/
0x00,0x12,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/
0x00,0x00,0x24,0x24,0xFE,0x48,0x48,0xFE,0x48,0x48,0x00,0x00,/*"#",3*/
0x00,0x10,0x3C,0x54,0x50,0x30,0x18,0x14,0x54,0x78,0x10,0x00,/*"$",4*/
0x00,0x00,0xE4,0xA4,0xA8,0xF0,0x1E,0x2A,0x2A,0x4E,0x00,0x00,/*"%",5*/
0x00,0x00,0x30,0x48,0x48,0x7E,0xA4,0x94,0x88,0x77,0x00,0x00,/*"&",6*/
0x00,0x60,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/
0x00,0x02,0x0C,0x08,0x10,0x10,0x10,0x10,0x08,0x08,0x06,0x00,/*"(",8*/
0x00,0x40,0x20,0x10,0x08,0x08,0x08,0x08,0x10,0x20,0x40,0x00,/*")",9*/
0x00,0x00,0x00,0x10,0x92,0x7C,0x7C,0x92,0x10,0x00,0x00,0x00,/*"*",10*/
0x00,0x00,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x00,0x00,0x00,/*"+",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x40,/*",",12*/
0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,/*".",14*/
0x00,0x01,0x02,0x06,0x04,0x08,0x08,0x10,0x20,0x20,0x40,0x00,/*"/",15*/
0x00,0x00,0x3C,0x24,0x42,0x42,0x42,0x42,0x24,0x3C,0x00,0x00,/*"0",16*/
0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"1",17*/
0x00,0x00,0x3C,0x42,0x42,0x04,0x08,0x10,0x62,0x7E,0x00,0x00,/*"2",18*/
0x00,0x00,0x3C,0x42,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00,/*"3",19*/
0x00,0x00,0x0C,0x14,0x24,0x44,0x44,0x3C,0x04,0x0C,0x00,0x00,/*"4",20*/
0x00,0x00,0x7E,0x40,0x40,0x7C,0x02,0x02,0x42,0x3C,0x00,0x00,/*"5",21*/
0x00,0x00,0x1C,0x24,0x40,0x5C,0x62,0x42,0x62,0x3C,0x00,0x00,/*"6",22*/
0x00,0x00,0x7E,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x00,0x00,/*"7",23*/
0x00,0x00,0x3C,0x42,0x42,0x34,0x2C,0x42,0x42,0x3C,0x00,0x00,/*"8",24*/
0x00,0x00,0x18,0x64,0x42,0x46,0x3A,0x02,0x24,0x3C,0x00,0x00,/*"9",25*/
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,/*":",26*/
0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x10,0x00,/*";",27*/
0x00,0x02,0x04,0x18,0x20,0x40,0x20,0x10,0x0C,0x02,0x00,0x00,/*"<",28*/
0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,/*"=",29*/
0x00,0x40,0x20,0x18,0x04,0x02,0x04,0x08,0x30,0x40,0x00,0x00,/*">",30*/
0x00,0x00,0x3C,0x42,0x62,0x02,0x0C,0x08,0x00,0x18,0x00,0x00,/*"?",31*/
0x00,0x00,0x3C,0x46,0x9A,0xAA,0xAA,0xBC,0x40,0x3E,0x00,0x00,/*"@",32*/
0x00,0x00,0x10,0x18,0x28,0x24,0x24,0x7C,0x42,0xE7,0x00,0x00,/*"A",33*/
0x00,0x00,0xF8,0x44,0x44,0x78,0x46,0x42,0x42,0xFC,0x00,0x00,/*"B",34*/
0x00,0x00,0x3E,0x42,0x80,0x80,0x80,0x80,0x42,0x3C,0x00,0x00,/*"C",35*/
0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,/*"D",36*/
0x00,0x00,0xFC,0x42,0x48,0x78,0x48,0x40,0x42,0xFC,0x00,0x00,/*"E",37*/
0x00,0x00,0xFC,0x42,0x48,0x78,0x48,0x40,0x40,0xE0,0x00,0x00,/*"F",38*/
0x00,0x00,0x3C,0x44,0x80,0x80,0x8E,0x84,0x44,0x38,0x00,0x00,/*"G",39*/
0x00,0x00,0xE7,0x42,0x42,0x7E,0x42,0x42,0x42,0xE7,0x00,0x00,/*"H",40*/
0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"I",41*/
0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF0,0x00,/*"J",42*/
0x00,0x00,0xEE,0x44,0x48,0x70,0x50,0x48,0x44,0xEE,0x00,0x00,/*"K",43*/
0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x42,0xFE,0x00,0x00,/*"L",44*/
0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x54,0x54,0x54,0xD6,0x00,0x00,/*"M",45*/
0x00,0x00,0xC7,0x62,0x52,0x52,0x4A,0x46,0x46,0xE2,0x00,0x00,/*"N",46*/
0x00,0x00,0x3C,0x44,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,/*"O",47*/
0x00,0x00,0xFC,0x42,0x42,0x7C,0x40,0x40,0x40,0xE0,0x00,0x00,/*"P",48*/
0x00,0x00,0x38,0x44,0x82,0x82,0x82,0xB2,0x4C,0x38,0x06,0x00,/*"Q",49*/
0x00,0x00,0xFC,0x42,0x42,0x7C,0x48,0x44,0x46,0xE3,0x00,0x00,/*"R",50*/
0x00,0x00,0x3E,0x42,0x40,0x38,0x04,0x02,0x42,0x7C,0x00,0x00,/*"S",51*/
0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,/*"T",52*/
0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"U",53*/
0x00,0x00,0xE7,0x42,0x44,0x24,0x2C,0x28,0x18,0x10,0x00,0x00,/*"V",54*/
0x00,0x00,0xD6,0x92,0x92,0x92,0x9A,0x6C,0x64,0x44,0x00,0x00,/*"W",55*/
0x00,0x00,0xE7,0x66,0x24,0x18,0x18,0x24,0x66,0xE7,0x00,0x00,/*"X",56*/
0x00,0x00,0xEE,0x44,0x28,0x38,0x10,0x10,0x10,0x38,0x00,0x00,/*"Y",57*/
0x00,0x00,0x7E,0x84,0x08,0x10,0x10,0x20,0x42,0xFC,0x00,0x00,/*"Z",58*/
0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00,/*"[",59*/
0x00,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x00,/*"\",60*/
0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00,/*"]",61*/
0x00,0x1C,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,/*"_",63*/
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/
0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x3E,0x42,0x3F,0x00,0x00,/*"a",65*/
0x00,0x00,0xC0,0x40,0x40,0x5C,0x62,0x42,0x42,0x7C,0x00,0x00,/*"b",66*/
0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x40,0x42,0x3C,0x00,0x00,/*"c",67*/
0x00,0x00,0x06,0x02,0x02,0x1E,0x62,0x42,0x42,0x3F,0x00,0x00,/*"d",68*/
0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x3E,0x00,0x00,/*"e",69*/
0x00,0x00,0x0F,0x10,0x10,0x7E,0x10,0x10,0x10,0x7C,0x00,0x00,/*"f",70*/
0x00,0x00,0x00,0x00,0x00,0x3E,0x44,0x38,0x40,0x7C,0x42,0x3C,/*"g",71*/
0x00,0x00,0xC0,0x40,0x40,0x5C,0x62,0x42,0x42,0xE7,0x00,0x00,/*"h",72*/
0x00,0x00,0x30,0x00,0x00,0x70,0x10,0x10,0x10,0x7C,0x00,0x00,/*"i",73*/
0x00,0x00,0x0C,0x00,0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x78,/*"j",74*/
0x00,0x00,0xC0,0x40,0x40,0x4E,0x58,0x70,0x48,0xEE,0x00,0x00,/*"k",75*/
0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"l",76*/
0x00,0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0xED,0x00,0x00,/*"m",77*/
0x00,0x00,0x00,0x00,0x00,0xD8,0x66,0x42,0x42,0xE7,0x00,0x00,/*"n",78*/
0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,/*"o",79*/
0x00,0x00,0x00,0x00,0x00,0xF8,0x46,0x42,0x42,0x7C,0x40,0xE0,/*"p",80*/
0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x3E,0x02,0x07,/*"q",81*/
0x00,0x00,0x00,0x00,0x00,0xEE,0x30,0x20,0x20,0xF8,0x00,0x00,/*"r",82*/
0x00,0x00,0x00,0x00,0x00,0x3E,0x40,0x3C,0x42,0x7C,0x00,0x00,/*"s",83*/
0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x10,0x0C,0x00,0x00,/*"t",84*/
0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x3F,0x00,0x00,/*"u",85*/
0x00,0x00,0x00,0x00,0x00,0xE7,0x46,0x24,0x28,0x10,0x00,0x00,/*"v",86*/
0x00,0x00,0x00,0x00,0x00,0xD7,0x92,0x9A,0x6A,0x44,0x00,0x00,/*"w",87*/
0x00,0x00,0x00,0x00,0x00,0x6E,0x3C,0x18,0x3C,0x76,0x00,0x00,/*"x",88*/
0x00,0x00,0x00,0x00,0x00,0xE7,0x46,0x24,0x18,0x18,0x10,0xE0,/*"y",89*/
0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x18,0x32,0x7E,0x00,0x00,/*"z",90*/
0x00,0x07,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x03,0x00,/*"{",91*/
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,/*"|",92*/
0x00,0x70,0x10,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x60,0x00,/*"}",93*/
0x30,0x4C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/
};
static const uint8_t ASCII12x12[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x02,0x00,0x02,0x00,0x02,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,/*"!",1*/
0x00,0x00,0x06,0x60,0x0C,0xC0,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/
0x00,0x00,0x00,0x00,0x10,0x40,0x10,0x40,0x7F,0xE0,0x10,0x40,0x20,0x80,0x7F,0xE0,
0x20,0x80,0x20,0x80,0x00,0x00,0x00,0x00,/*"#",3*/
0x00,0x00,0x02,0x00,0x1F,0x80,0x32,0xC0,0x32,0x00,0x0E,0x00,0x03,0x80,0x02,0xC0,
0x32,0xC0,0x1F,0x80,0x02,0x00,0x00,0x00,/*"$",4*/
0x00,0x00,0x00,0x00,0x70,0x80,0x89,0x80,0x89,0x00,0x72,0x00,0x05,0xC0,0x0A,0x20,
0x12,0x20,0x21,0xC0,0x00,0x00,0x00,0x00,/*"%",5*/
0x00,0x00,0x00,0x00,0x1C,0x00,0x26,0x00,0x24,0x00,0x19,0xC0,0x78,0x80,0xCD,0x00,
0xC6,0x00,0x7D,0xE0,0x00,0x00,0x00,0x00,/*"&",6*/
0x00,0x00,0x38,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/
0x00,0x00,0x00,0x40,0x00,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x03,0x00,0x01,0x80,0x00,0x40,0x00,0x00,/*"(",8*/
0x00,0x00,0x20,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x0C,0x00,0x18,0x00,0x20,0x00,0x00,0x00,/*")",9*/
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x62,0x30,0x1A,0xC0,0x1F,0xC0,0x62,0x30,
0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"*",10*/
0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF0,0x02,0x00,0x02,0x00,
0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"+",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x00,0x08,0x00,0x30,0x00,/*",",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,/*".",14*/
0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,
0x10,0x00,0x20,0x00,0x40,0x00,0x00,0x00,/*"/",15*/
0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,/*"0",16*/
0x00,0x00,0x00,0x00,0x02,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"1",17*/
0x00,0x00,0x00,0x00,0x1F,0x80,0x61,0xC0,0x60,0xC0,0x01,0x80,0x02,0x00,0x0C,0x00,
0x30,0x40,0x7F,0xC0,0x00,0x00,0x00,0x00,/*"2",18*/
0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x01,0x80,0x0E,0x00,0x01,0x80,0x00,0xC0,
0x61,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,/*"3",19*/
0x00,0x00,0x00,0x00,0x01,0x80,0x07,0x80,0x09,0x80,0x11,0x80,0x61,0x80,0x1F,0xC0,
0x01,0x80,0x03,0xC0,0x00,0x00,0x00,0x00,/*"4",20*/
0x00,0x00,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x2F,0x80,0x10,0xC0,0x00,0xC0,
0x61,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,/*"5",21*/
0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x60,0x00,0x6F,0xC0,0x70,0x60,0x60,0x60,
0x30,0x60,0x1F,0x80,0x00,0x00,0x00,0x00,/*"6",22*/
0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x02,0x00,
0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,/*"7",23*/
0x00,0x00,0x00,0x00,0x3F,0xC0,0x60,0xE0,0x60,0x60,0x1F,0x80,0x31,0xC0,0x60,0x60,
0x70,0x60,0x1F,0x80,0x00,0x00,0x00,0x00,/*"8",24*/
0x00,0x00,0x00,0x00,0x1F,0x80,0x70,0xC0,0x60,0x60,0x70,0xE0,0x3F,0x60,0x00,0xE0,
0x31,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,/*"9",25*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,/*":",26*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,/*";",27*/
0x00,0x00,0x00,0x60,0x00,0x80,0x03,0x00,0x0C,0x00,0x30,0x00,0x08,0x00,0x06,0x00,
0x01,0x80,0x00,0x60,0x00,0x00,0x00,0x00,/*"<",28*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x7F,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"=",29*/
0x00,0x00,0x30,0x00,0x08,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x80,0x03,0x00,
0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,/*">",30*/
0x00,0x00,0x00,0x00,0x1F,0x80,0x60,0xE0,0x60,0x60,0x00,0xC0,0x07,0x00,0x04,0x00,
0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,/*"?",31*/
0x00,0x00,0x00,0x00,0x0F,0xC0,0x38,0x20,0x63,0xD0,0x64,0x90,0x69,0x90,0x6F,0xE0,
0x38,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,/*"@",32*/
0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x0B,0x00,0x11,0x80,0x11,0x80,0x3F,0xC0,
0x60,0xC0,0xF1,0xF0,0x00,0x00,0x00,0x00,/*"A",33*/
0x00,0x00,0x00,0x00,0xFF,0x80,0x60,0xC0,0x60,0xC0,0x7F,0x00,0x60,0xC0,0x60,0x60,
0x60,0xE0,0xFF,0x80,0x00,0x00,0x00,0x00,/*"B",34*/
0x00,0x00,0x00,0x00,0x0F,0xE0,0x38,0x20,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,
0x30,0x20,0x1F,0xC0,0x00,0x00,0x00,0x00,/*"C",35*/
0x00,0x00,0x00,0x00,0xFF,0x00,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
0x60,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,/*"D",36*/
0x00,0x00,0x00,0x00,0xFF,0xC0,0x60,0x20,0x61,0x00,0x7F,0x00,0x61,0x00,0x60,0x00,
0x60,0x20,0xFF,0xC0,0x00,0x00,0x00,0x00,/*"E",37*/
0x00,0x00,0x00,0x00,0xFF,0xC0,0x60,0x20,0x61,0x00,0x7F,0x00,0x61,0x00,0x60,0x00,
0x60,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,/*"F",38*/
0x00,0x00,0x00,0x00,0x07,0xC0,0x38,0x40,0x60,0x00,0x60,0x00,0x63,0xF0,0x60,0xC0,
0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,/*"G",39*/
0x00,0x00,0x00,0x00,0xF0,0xF0,0x60,0x60,0x60,0x60,0x7F,0xE0,0x60,0x60,0x60,0x60,
0x60,0x60,0xF0,0xF0,0x00,0x00,0x00,0x00,/*"H",40*/
0x00,0x00,0x00,0x00,0x3F,0xC0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"I",41*/
0x00,0x00,0x00,0x00,0x0F,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
0x01,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,/*"J",42*/
0x00,0x00,0x00,0x00,0xF1,0xE0,0x60,0x80,0x67,0x00,0x7C,0x00,0x62,0x00,0x61,0x00,
0x60,0xC0,0xF0,0xF0,0x00,0x00,0x00,0x00,/*"K",43*/
0x00,0x00,0x00,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,
0x60,0x20,0xFF,0xC0,0x00,0x00,0x00,0x00,/*"L",44*/
0x00,0x00,0x00,0x00,0xF0,0xF0,0x70,0xE0,0x79,0x60,0x59,0x60,0x5E,0x60,0x4E,0x60,
0x4C,0x60,0xE4,0xF0,0x00,0x00,0x00,0x00,/*"M",45*/
0x00,0x00,0x00,0x00,0xE0,0x70,0x70,0x20,0x58,0x20,0x46,0x20,0x43,0x20,0x41,0xE0,
0x40,0x60,0xE0,0x20,0x00,0x00,0x00,0x00,/*"N",46*/
0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,/*"O",47*/
0x00,0x00,0x00,0x00,0xFF,0xC0,0x60,0x60,0x60,0x60,0x7F,0xC0,0x60,0x00,0x60,0x00,
0x60,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,/*"P",48*/
0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x6E,0x60,
0x31,0xC0,0x1F,0x00,0x00,0xE0,0x00,0x00,/*"Q",49*/
0x00,0x00,0x00,0x00,0xFF,0xC0,0x60,0x60,0x60,0x60,0x7F,0x80,0x63,0x00,0x61,0x80,
0x60,0xC0,0xF0,0x70,0x00,0x00,0x00,0x00,/*"R",50*/
0x00,0x00,0x00,0x00,0x1F,0xE0,0x60,0x20,0x60,0x00,0x1F,0x00,0x01,0xC0,0x00,0x60,
0x40,0xE0,0x7F,0x80,0x00,0x00,0x00,0x00,/*"S",51*/
0x00,0x00,0x00,0x00,0x7F,0xE0,0x86,0x10,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,/*"T",52*/
0x00,0x00,0x00,0x00,0xF0,0x70,0x60,0x20,0x60,0x20,0x60,0x20,0x60,0x20,0x60,0x20,
0x60,0x60,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"U",53*/
0x00,0x00,0x00,0x00,0xF8,0xF0,0x30,0x40,0x30,0x40,0x18,0x80,0x18,0x80,0x0D,0x00,
0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,/*"V",54*/
0x00,0x00,0x00,0x00,0xF7,0x70,0x66,0x20,0x62,0x40,0x33,0x40,0x37,0x80,0x3F,0x80,
0x19,0x80,0x11,0x00,0x00,0x00,0x00,0x00,/*"W",55*/
0x00,0x00,0x00,0x00,0x79,0xE0,0x18,0x80,0x0D,0x00,0x06,0x00,0x07,0x00,0x09,0x80,
0x10,0x40,0x78,0xE0,0x00,0x00,0x00,0x00,/*"X",56*/
0x00,0x00,0x00,0x00,0xF1,0xF0,0x20,0x40,0x10,0x80,0x09,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,/*"Y",57*/
0x00,0x00,0x00,0x00,0x3F,0xC0,0x60,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,
0x10,0x20,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"Z",58*/
0x00,0x00,0x07,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x07,0xE0,0x00,0x00,/*"[",59*/
0x00,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,
0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x00,/*"\",60*/
0x00,0x00,0x3F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x3F,0x00,0x00,0x00,/*"]",61*/
0x00,0x00,0x07,0x00,0x18,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,/*"_",63*/
0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x1F,0xC0,
0x60,0xC0,0x3F,0xF0,0x00,0x00,0x00,0x00,/*"a",65*/
0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x37,0xC0,0x38,0x60,0x30,0x60,
0x30,0x60,0x3F,0x80,0x00,0x00,0x00,0x00,/*"b",66*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x71,0x80,0x60,0x00,
0x70,0x40,0x1F,0x80,0x00,0x00,0x00,0x00,/*"c",67*/
0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x1F,0xC0,0x70,0xC0,0x60,0xC0,
0x60,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,/*"d",68*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x3F,0xE0,
0x30,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,/*"e",69*/
0x00,0x00,0x00,0x00,0x07,0xE0,0x0C,0x00,0x0C,0x00,0x7F,0xC0,0x0C,0x00,0x0C,0x00,
0x0C,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,/*"f",70*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x30,0xC0,0x1F,0x80,
0x30,0x00,0x3F,0x80,0x60,0x60,0x3F,0xC0,/*"g",71*/
0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x37,0x80,0x38,0xC0,0x30,0xC0,
0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,/*"h",72*/
0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"i",73*/
0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x0F,0x80,0x01,0x80,0x01,0x80,
0x01,0x80,0x01,0x80,0x01,0x80,0x3F,0x00,/*"j",74*/
0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x33,0xC0,0x33,0x00,0x3E,0x00,
0x31,0x00,0x79,0xE0,0x00,0x00,0x00,0x00,/*"k",75*/
0x00,0x00,0x00,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"l",76*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x66,0x60,0x66,0x60,
0x66,0x60,0xF7,0x70,0x00,0x00,0x00,0x00,/*"m",77*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x38,0xC0,0x30,0xC0,
0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,/*"n",78*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x70,0xE0,0x60,0x60,
0x70,0xE0,0x1F,0x80,0x00,0x00,0x00,0x00,/*"o",79*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0xC0,0x38,0x60,0x30,0x60,
0x30,0xE0,0x3F,0x80,0x30,0x00,0x7C,0x00,/*"p",80*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x70,0xC0,0x60,0xC0,
0x60,0xC0,0x3F,0xC0,0x00,0xC0,0x03,0xE0,/*"q",81*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF9,0xE0,0x1E,0x00,0x18,0x00,
0x18,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,/*"r",82*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x30,0x00,0x0F,0x80,
0x20,0x60,0x3F,0xC0,0x00,0x00,0x00,0x00,/*"s",83*/
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,
0x0C,0x40,0x03,0x80,0x00,0x00,0x00,0x00,/*"t",84*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0xC0,0x30,0xC0,0x30,0xC0,
0x30,0xC0,0x1F,0xE0,0x00,0x00,0x00,0x00,/*"u",85*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xF0,0x10,0x40,0x08,0x80,
0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,/*"v",86*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0xB0,0x63,0x20,0x37,0xE0,
0x3D,0xC0,0x18,0x80,0x00,0x00,0x00,0x00,/*"w",87*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x1D,0x80,0x06,0x00,
0x19,0x80,0x7F,0xE0,0x00,0x00,0x00,0x00,/*"x",88*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x10,0x80,0x19,0x00,
0x0F,0x00,0x06,0x00,0x04,0x00,0x38,0x00,/*"y",89*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x23,0x00,0x06,0x00,
0x18,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00,/*"z",90*/
0x00,0x00,0x01,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x06,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x00,0xC0,0x00,0x00,/*"{",91*/
0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,
0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,/*"|",92*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x06,0x00,0x08,0x00,0x08,0x00,
0x08,0x00,0x08,0x00,0x30,0x00,0x00,0x00,/*"}",93*/
0x3C,0x00,0x47,0x10,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/
};
#endif

4351
Drivers/BSP/160160D/BMP.C Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,57 @@
/****************************************************************************************
* 文件名FONT5_7.H
* 功能5*7 ASCII码字体显示函数。(头文件)
* 作者:黄绍斌
* 日期2004.02.26
* 备注使用GUI_SetColor()函数设置前景颜色及背景色。
****************************************************************************************/
#ifndef FONT5_7_H
#define FONT5_7_H
/****************************************************************************
* 名称GUI_PutChar()
* 功能显示ASCII码显示值为20H-7FH(若为其它值,则显示' ')。
* 入口参数: x 指定显示位置x坐标
* y 指定显示位置y坐标
* ch 要显示的ASCII码值。
* 出口参数返回值为1时表示操作成功为0时表示操作失败。
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
extern unsigned char GUI_PutChar(unsigned int x, unsigned int y, unsigned char ch);
/****************************************************************************
* 名称GUI_PutString()
* 功能:输出显示字符串(没有自动换行功能)。
* 入口参数: x 指定显示位置x坐标
* y 指定显示位置y坐标
* str 要显示的ASCII码字符串
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
extern void GUI_PutString(unsigned int x, unsigned int y, char *str);
/****************************************************************************
* 名称GUI_PutNoStr()
* 功能:输出显示字符串(没有自动换行功能),若显示的字符个数大于指定个数,则直接退出。
* 入口参数: x 指定显示位置x坐标
* y 指定显示位置y坐标
* str 要显示的ASCII码字符串。
* no 最大显示字符的个数
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
extern void GUI_PutNoStr(unsigned int x, unsigned int y, char *str, unsigned char no);
/****************************************************************************
* 名称GUI_PutHex()
* 功能显示HEX码显示值为00H-FFH(若为其它值,则显示' ')。
* 入口参数: x 指定显示位置x坐标
* y 指定显示位置y坐标
* v 要显示的HEX。
*出口参数:无
****************************************************************************/
extern void GUI_PutHex(unsigned char x, unsigned char y,unsigned char v);
#endif

File diff suppressed because it is too large Load Diff

175
Drivers/BSP/IIC/iic.c Normal file
View File

@@ -0,0 +1,175 @@
/**
******************************************************************************
* @文件 iic.c
* @作者 阜阳师范大学物电学院
* @版本 V0.1
* @日期 2025-03-27
* @简介 软件 IIC 驱动程序
******************************************************************************
**/
#include "iic.h"
/**
* @brief IIC初始化函数
* @note 初始化IIC通信所需的GPIO引脚配置为开漏输出模式
* @retval 无
*/
void iic_init()
{
GPIO_InitTypeDef gpio_init_struct;
IIC_SCL_GPIO_CLK_ENABLE();
IIC_SDA_GPIO_CLK_ENABLE();
gpio_init_struct.Pin = IIC_SCL_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(IIC_SCL_GPIO_PORT,&gpio_init_struct);
gpio_init_struct.Pin = IIC_SDA_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;
HAL_GPIO_Init(IIC_SDA_GPIO_PORT,&gpio_init_struct);
IIC_SDA(1);
IIC_SCL(1);
}
/**
* @brief IIC总线延时函数
* @note 提供固定2微秒的延时满足IIC通信时序要求
* @retval 无
*/
static void iic_delay(void)
{
delay_us(2);
}
/**
* @brief 产生IIC起始信号
* @note 起始信号时序SCL高电平时SDA由高变低
* @retval 无
*/
void iic_start(void)
{
IIC_SCL(1);
IIC_SDA(1);
iic_delay();
IIC_SDA(0);
iic_delay();
IIC_SCL(0);
iic_delay();
}
/**
* @brief 向IIC总线发送一个字节数据
* @param data待发送的8位数据
* @retval 无
*/
void iic_send_byte(uint8_t data)
{
uint8_t t;
for(t = 0;t<8;t++)
{
IIC_SDA((data&0x80)>>7);
iic_delay();
IIC_SCL(1);
iic_delay();
IIC_SCL(0);
data<<=1;
}
IIC_SDA(1);
}
/**
* @brief 产生IIC停止信号
* @note 停止信号时序SCL高电平时SDA由低变高
* @retval 无
*/
void iic_stop(void)
{
IIC_SDA(0);
iic_delay();
IIC_SCL(1);
iic_delay();
IIC_SDA(1);
iic_delay();
}
/**
* @brief 等待IIC从机应答信号
* @note 从机应答信号为SDA低电平超时自动释放总线
* @retval 1未接收到应答0接收到应答
*/
uint8_t iic_wait_ack(void)//返回1失败0成功
{
IIC_SDA(1);
iic_delay();
IIC_SCL(1);
iic_delay();
if(IIC_READ_SDA)
{
iic_stop();
return 1;
}
IIC_SCL(0);
iic_delay();
return 0;
}
/**
* @brief 主机发送应答信号
* @note 应答信号时序SCL高电平时SDA保持低电平
* @retval 无
*/
void iic_ack(void)
{
IIC_SCL(0);
iic_delay();
IIC_SDA(0);
iic_delay();
IIC_SCL(1);
iic_delay();
}
/**
* @brief 主机发送非应答信号
* @note 非应答信号时序SCL高电平时SDA保持高电平
* @retval 无
*/
void iic_nack(void)
{
IIC_SCL(0); /* 产生一个时钟 */
iic_delay();
IIC_SDA(1);
iic_delay();
IIC_SCL(1); /* 主机释放SDA线 */
iic_delay();
}
/**
* @brief 从IIC总线读取一个字节数据
* @param ack应答控制0=发送非应答1=发送应答
* @retval 读取到的8位数据
*/
uint8_t iic_read_byte(uint8_t ack)
{
uint8_t i,receive = 0;
for(i=0;i<8;i++)
{
receive<<=1;
IIC_SCL(1);
iic_delay();
if(IIC_READ_SDA) receive++;
IIC_SCL(0);
iic_delay();
}
if(!ack) iic_nack();
else iic_ack();
return receive;
}

40
Drivers/BSP/IIC/iic.h Normal file
View File

@@ -0,0 +1,40 @@
#ifndef __IIC_H
#define __IIC_H
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#define IIC_SCL_GPIO_PORT GPIOA
#define IIC_SCL_GPIO_PIN GPIO_PIN_5
#define IIC_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define IIC_SDA_GPIO_PORT GPIOA
#define IIC_SDA_GPIO_PIN GPIO_PIN_6
#define IIC_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define IIC_SCL(x) do{ x ? \
HAL_GPIO_WritePin(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN, GPIO_PIN_RESET); \
}while(0) /* SCL */
#define IIC_SDA(x) do{x? \
HAL_GPIO_WritePin(IIC_SDA_GPIO_PORT,IIC_SDA_GPIO_PIN,GPIO_PIN_SET): \
HAL_GPIO_WritePin(IIC_SDA_GPIO_PORT,IIC_SDA_GPIO_PIN,GPIO_PIN_RESET); \
}while(0);
#define IIC_READ_SDA HAL_GPIO_ReadPin(IIC_SDA_GPIO_PORT,IIC_SDA_GPIO_PIN)
void iic_init(void);
void iic_start(void);
uint8_t iic_read_byte(uint8_t ack);
void iic_send_byte(uint8_t data);
void iic_stop(void);
uint8_t iic_wait_ack(void);
void iic_ack(void);
void iic_nack(void);
#endif

View File

@@ -0,0 +1,292 @@
/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
*/
#include "MultiButton.h"
// Macro for callback execution with null check
#define EVENT_CB(ev) do { if(handle->cb[ev]) handle->cb[ev](handle); } while(0)
// Button handle list head
static Button* head_handle = NULL;
// Forward declarations
static void button_handler(Button* handle);
static inline uint8_t button_read_level(Button* handle);
/**
* @brief Initialize the button struct handle
* @param handle: the button handle struct
* @param pin_level: read the HAL GPIO of the connected button level
* @param active_level: pressed GPIO level
* @param button_id: the button id
* @retval None
*/
void button_init(Button* handle, uint8_t(*pin_level)(uint8_t), uint8_t active_level, uint8_t button_id)
{
if (!handle || !pin_level) return; // parameter validation
memset(handle, 0, sizeof(Button));
handle->event = (uint8_t)BTN_NONE_PRESS;
handle->hal_button_level = pin_level;
handle->button_level = !active_level; // initialize to opposite of active level
handle->active_level = active_level;
handle->button_id = button_id;
handle->state = BTN_STATE_IDLE;
}
/**
* @brief Attach the button event callback function
* @param handle: the button handle struct
* @param event: trigger event type
* @param cb: callback function
* @retval None
*/
void button_attach(Button* handle, ButtonEvent event, BtnCallback cb)
{
if (!handle || event >= BTN_EVENT_COUNT) return; // parameter validation
handle->cb[event] = cb;
}
/**
* @brief Detach the button event callback function
* @param handle: the button handle struct
* @param event: trigger event type
* @retval None
*/
void button_detach(Button* handle, ButtonEvent event)
{
if (!handle || event >= BTN_EVENT_COUNT) return; // parameter validation
handle->cb[event] = NULL;
}
/**
* @brief Get the button event that happened
* @param handle: the button handle struct
* @retval button event
*/
ButtonEvent button_get_event(Button* handle)
{
if (!handle) return BTN_NONE_PRESS;
return (ButtonEvent)(handle->event);
}
/**
* @brief Get the repeat count of button presses
* @param handle: the button handle struct
* @retval repeat count
*/
uint8_t button_get_repeat_count(Button* handle)
{
if (!handle) return 0;
return handle->repeat;
}
/**
* @brief Reset button state to idle
* @param handle: the button handle struct
* @retval None
*/
void button_reset(Button* handle)
{
if (!handle) return;
handle->state = BTN_STATE_IDLE;
handle->ticks = 0;
handle->repeat = 0;
handle->event = (uint8_t)BTN_NONE_PRESS;
handle->debounce_cnt = 0;
}
/**
* @brief Check if button is currently pressed
* @param handle: the button handle struct
* @retval 1: pressed, 0: not pressed, -1: error
*/
int button_is_pressed(Button* handle)
{
if (!handle) return -1;
return (handle->button_level == handle->active_level) ? 1 : 0;
}
/**
* @brief Read button level with inline optimization
* @param handle: the button handle struct
* @retval button level
*/
static inline uint8_t button_read_level(Button* handle)
{
return handle->hal_button_level(handle->button_id);
}
/**
* @brief Button driver core function, driver state machine
* @param handle: the button handle struct
* @retval None
*/
static void button_handler(Button* handle)
{
uint8_t read_gpio_level = button_read_level(handle);
// Increment ticks counter when not in idle state
if (handle->state > BTN_STATE_IDLE) {
handle->ticks++;
}
/*------------Button debounce handling---------------*/
if (read_gpio_level != handle->button_level) {
// Continue reading same new level for debounce
if (++(handle->debounce_cnt) >= DEBOUNCE_TICKS) {
handle->button_level = read_gpio_level;
handle->debounce_cnt = 0;
}
} else {
// Level not changed, reset counter
handle->debounce_cnt = 0;
}
/*-----------------State machine-------------------*/
switch (handle->state) {
case BTN_STATE_IDLE:
if (handle->button_level == handle->active_level) {
// Button press detected
handle->event = (uint8_t)BTN_PRESS_DOWN;
EVENT_CB(BTN_PRESS_DOWN);
handle->ticks = 0;
handle->repeat = 1;
handle->state = BTN_STATE_PRESS;
} else {
handle->event = (uint8_t)BTN_NONE_PRESS;
}
break;
case BTN_STATE_PRESS:
if (handle->button_level != handle->active_level) {
// Button released
handle->event = (uint8_t)BTN_PRESS_UP;
EVENT_CB(BTN_PRESS_UP);
handle->ticks = 0;
handle->state = BTN_STATE_RELEASE;
} else if (handle->ticks > LONG_TICKS) {
// Long press detected
handle->event = (uint8_t)BTN_LONG_PRESS_START;
EVENT_CB(BTN_LONG_PRESS_START);
handle->state = BTN_STATE_LONG_HOLD;
}
break;
case BTN_STATE_RELEASE:
if (handle->button_level == handle->active_level) {
// Button pressed again
handle->event = (uint8_t)BTN_PRESS_DOWN;
EVENT_CB(BTN_PRESS_DOWN);
if (handle->repeat < PRESS_REPEAT_MAX_NUM) {
handle->repeat++;
}
EVENT_CB(BTN_PRESS_REPEAT);
handle->ticks = 0;
handle->state = BTN_STATE_REPEAT;
} else if (handle->ticks > SHORT_TICKS) {
// Timeout reached, determine click type
if (handle->repeat == 1) {
handle->event = (uint8_t)BTN_SINGLE_CLICK;
EVENT_CB(BTN_SINGLE_CLICK);
} else if (handle->repeat == 2) {
handle->event = (uint8_t)BTN_DOUBLE_CLICK;
EVENT_CB(BTN_DOUBLE_CLICK);
}
handle->state = BTN_STATE_IDLE;
}
break;
case BTN_STATE_REPEAT:
if (handle->button_level != handle->active_level) {
// Button released
handle->event = (uint8_t)BTN_PRESS_UP;
EVENT_CB(BTN_PRESS_UP);
if (handle->ticks < SHORT_TICKS) {
handle->ticks = 0;
handle->state = BTN_STATE_RELEASE; // Continue waiting for more presses
} else {
handle->state = BTN_STATE_IDLE; // End of sequence
}
} else if (handle->ticks > SHORT_TICKS) {
// Held down too long, treat as normal press
handle->state = BTN_STATE_PRESS;
}
break;
case BTN_STATE_LONG_HOLD:
if (handle->button_level == handle->active_level) {
// Continue holding
handle->event = (uint8_t)BTN_LONG_PRESS_HOLD;
EVENT_CB(BTN_LONG_PRESS_HOLD);
} else {
// Released from long press
handle->event = (uint8_t)BTN_PRESS_UP;
EVENT_CB(BTN_PRESS_UP);
handle->state = BTN_STATE_IDLE;
}
break;
default:
// Invalid state, reset to idle
handle->state = BTN_STATE_IDLE;
break;
}
}
/**
* @brief Start the button work, add the handle into work list
* @param handle: target handle struct
* @retval 0: succeed, -1: already exist, -2: invalid parameter
*/
int button_start(Button* handle)
{
if (!handle) return -2; // invalid parameter
Button* target = head_handle;
while (target) {
if (target == handle) return -1; // already exist
target = target->next;
}
handle->next = head_handle;
head_handle = handle;
return 0;
}
/**
* @brief Stop the button work, remove the handle from work list
* @param handle: target handle struct
* @retval None
*/
void button_stop(Button* handle)
{
if (!handle) return; // parameter validation
Button** curr;
for (curr = &head_handle; *curr; ) {
Button* entry = *curr;
if (entry == handle) {
*curr = entry->next;
entry->next = NULL; // clear next pointer
return;
} else {
curr = &entry->next;
}
}
}
/**
* @brief Background ticks, timer repeat invoking interval 5ms
* @param None
* @retval None
*/
void button_ticks(void)
{
Button* target;
for (target = head_handle; target; target = target->next) {
button_handler(target);
}
}

View File

@@ -0,0 +1,84 @@
/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
*/
#ifndef _MULTI_BUTTON_H_
#define _MULTI_BUTTON_H_
#include <stdint.h>
#include <string.h>
// Configuration constants - can be modified according to your needs
#define TICKS_INTERVAL 5 // ms - timer interrupt interval
#define DEBOUNCE_TICKS 3 // MAX 7 (0 ~ 7) - debounce filter depth
#define SHORT_TICKS (300 / TICKS_INTERVAL) // short press threshold
#define LONG_TICKS (1000 / TICKS_INTERVAL) // long press threshold
#define PRESS_REPEAT_MAX_NUM 15 // maximum repeat counter value
// Forward declaration
typedef struct _Button Button;
// Button callback function type
typedef void (*BtnCallback)(Button* btn_handle);
// Button event types
typedef enum {
BTN_PRESS_DOWN = 0, // button pressed down
BTN_PRESS_UP, // button released
BTN_PRESS_REPEAT, // repeated press detected
BTN_SINGLE_CLICK, // single click completed
BTN_DOUBLE_CLICK, // double click completed
BTN_LONG_PRESS_START, // long press started
BTN_LONG_PRESS_HOLD, // long press holding
BTN_EVENT_COUNT, // total number of events
BTN_NONE_PRESS // no event
} ButtonEvent;
// Button state machine states
typedef enum {
BTN_STATE_IDLE = 0, // idle state
BTN_STATE_PRESS, // pressed state
BTN_STATE_RELEASE, // released state waiting for timeout
BTN_STATE_REPEAT, // repeat press state
BTN_STATE_LONG_HOLD // long press hold state
} ButtonState;
// Button structure
struct _Button {
uint16_t ticks; // tick counter
uint8_t repeat : 4; // repeat counter (0-15)
uint8_t event : 4; // current event (0-15)
uint8_t state : 3; // state machine state (0-7)
uint8_t debounce_cnt : 3; // debounce counter (0-7)
uint8_t active_level : 1; // active GPIO level (0 or 1)
uint8_t button_level : 1; // current button level
uint8_t button_id; // button identifier
uint8_t (*hal_button_level)(uint8_t button_id); // HAL function to read GPIO
BtnCallback cb[BTN_EVENT_COUNT]; // callback function array
Button* next; // next button in linked list
};
#ifdef __cplusplus
extern "C" {
#endif
// Public API functions
void button_init(Button* handle, uint8_t(*pin_level)(uint8_t), uint8_t active_level, uint8_t button_id);
void button_attach(Button* handle, ButtonEvent event, BtnCallback cb);
void button_detach(Button* handle, ButtonEvent event);
ButtonEvent button_get_event(Button* handle);
int button_start(Button* handle);
void button_stop(Button* handle);
void button_ticks(void);
// Utility functions
uint8_t button_get_repeat_count(Button* handle);
void button_reset(Button* handle);
int button_is_pressed(Button* handle);
#ifdef __cplusplus
}
#endif
#endif

147
Drivers/BSP/KEY/key.c Normal file
View File

@@ -0,0 +1,147 @@
/**
******************************************************************************
* @文件 key.c
* @作者 阜阳师范大学物电学院
* @版本 V0.1
* @日期 2026-01-15
* @简介 按键驱动 - 基于 MultiButton 的高可移植性实现
* @说明
*
****
*/
#include "key.h"
// 按键配置结构体
typedef struct {
uint16_t pin; // GPIO引脚
GPIO_TypeDef* port; // GPIO端口
KEY_TYPE key_type; // 按键ID
} KeyConfig_t;
/*
*******************详细引脚映射*****************************
| 按键名称 | 端口 | 引脚 | 位定义 | 功能说明 |
|---------|------|------|--------|----------|
| KEY_ENTER | GPIOB | PB15 | KEY_ENTER_BIT | 确认键 |
| KEY_UP | GPIOD | PD11 | KEY_UP_BIT | 上键 |
| KEY_DOWN | GPIOD | PD10 | KET_DOWN_BIT | 下键 |
| KEY_LEFT | GPIOD | PD13 | KET_LEFT_BIT | 左键 |
| KEY_RIGHT | GPIOD | PD8 | KET_RIGHT_BIT | 右键 |
| KEY_ESC | GPIOD | PD12 | KET_ESC_BIT | 取消键 |
| KEY_ADD | GPIOD | PD14 | KET_ADD_BIT | 加键 |
| KEY_DEC | GPIOD | PD9 | KET_DEC_BIT | 减键 |
| KEY_RESET | GPIOD | PD15 | KET_RESET_BIT | 复位键 |
***************************************************************
*/
// 按键配置表
static const KeyConfig_t key_configs[] = {
{15, GPIOB, KEY_ENTER},
{11, GPIOD, KEY_UP},
{10, GPIOD, KEY_DOWN},
{13, GPIOD, KEY_LEFT},
{8, GPIOD, KEY_RIGHT},
{12, GPIOD, KEY_ESC},
{14, GPIOD, KEY_ADD},
{9, GPIOD, KEY_DEC},
{15, GPIOD, KEY_RESET},
};
#define KEY_COUNT (sizeof(key_configs) / sizeof(key_configs[0]))
// 按键句柄数组
static Button btn_handles[KEY_COUNT];
// 业务逻辑回调函数指针由main.c注册
static KeyCallback key_callback = NULL;
/**
* @brief 读取按键GPIO电平
* @param button_id 按键ID
* @retval 0:按下, 1:释放
*/
static uint8_t button_read_level(uint8_t button_id)
{
uint16_t pin_bit = HAL_GPIO_ReadPin(key_configs[button_id].port, key_configs[button_id].pin);
return pin_bit;
}
/**
* @brief 统一的按键回调函数(内部使用,调用业务逻辑回调)
* @param btn 按键句柄指针
*/
static void button_callback(Button* btn)
{
if (btn != NULL && key_callback != NULL)
{
// 通过button_id获取对应的按键类型
uint8_t button_id = btn->button_id;
if (button_id < KEY_COUNT)
{
// 调用业务逻辑层注册的回调函数
key_callback(key_configs[button_id].key_type);
}
}
}
/**
* @brief 注册按键回调函数(供业务逻辑层调用)
* @param callback 回调函数指针
*/
void Key_RegisterCallback(KeyCallback callback)
{
key_callback = callback;
}
/**
* @brief 使能GPIO时钟
* @param port: GPIO端口
* @retval 无
* @note 使用switch-case结构代码更简洁清晰支持所有GPIO端口A-G
*/
static void KEY_GPIO_ClockEnable(GPIO_TypeDef *port)
{
switch ((uint32_t)port) {
case (uint32_t)GPIOA: __HAL_RCC_GPIOA_CLK_ENABLE(); break;
case (uint32_t)GPIOB: __HAL_RCC_GPIOB_CLK_ENABLE(); break;
case (uint32_t)GPIOC: __HAL_RCC_GPIOC_CLK_ENABLE(); break;
case (uint32_t)GPIOD: __HAL_RCC_GPIOD_CLK_ENABLE(); break;
case (uint32_t)GPIOE: __HAL_RCC_GPIOE_CLK_ENABLE(); break;
case (uint32_t)GPIOF: __HAL_RCC_GPIOF_CLK_ENABLE(); break;
case (uint32_t)GPIOG: __HAL_RCC_GPIOG_CLK_ENABLE(); break;
default: break;
}
}
/**************************************************************************************
* FunctionName : Key_Init()
* Description : 按键硬件初始化使用MultiButton库
* EntryParameter : none
* ReturnValue : none
**************************************************************************************/
void Key_Init(void)
{
GPIO_InitTypeDef gpio_init_struct;
// 统一配置GPIO参数
gpio_init_struct.Mode = GPIO_MODE_INPUT;
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_HIGH;
// 批量初始化GPIO
for (uint8_t i = 0; i < KEY_COUNT; i++)
{
/* 使能对应GPIO时钟 */
KEY_GPIO_ClockEnable(key_configs[i].port);
// 配置并初始化引脚
gpio_init_struct.Pin = key_configs[i].pin;
HAL_GPIO_Init(key_configs[i].port, &gpio_init_struct);
}
// 批量初始化MultiButton按键active_level=0表示低电平有效
for (uint8_t button_id = 0; button_id < KEY_COUNT; button_id++)
{
button_init(&btn_handles[button_id], button_read_level, 0, button_id);
button_attach(&btn_handles[button_id], BTN_SINGLE_CLICK, button_callback);
button_start(&btn_handles[button_id]);
}
}

35
Drivers/BSP/KEY/key.h Normal file
View File

@@ -0,0 +1,35 @@
#ifndef __KEY_H__
#define __KEY_H__
#include "./SYSTEM/sys/sys.h"
#include "MultiButton.h"
typedef enum
{
KEY_NONE = 0, // 没有按键
KEY_ENTER, // 确认
KEY_UP, // 向上
KEY_DOWN, // 向下
KEY_ESC, //取消
KEY_ADD, //加
KEY_DEC, //减
KEY_LEFT, //左
KEY_RIGHT, //右
KEY_RESET, //复位
KEY_FACTORY, //工厂
} KEY_TYPE;
// 按键回调函数类型定义(业务逻辑层使用)
// 参数: key_type - 按键类型
typedef void (*KeyCallback)(KEY_TYPE key_type);
// 按键驱动函数在key.c中实现使用MultiButton库
void Key_Init(void); // 按键初始化
void Key_RegisterCallback(KeyCallback callback); // 注册按键回调函数(业务逻辑层调用)
#define Button_Ticks() button_ticks()
#endif

261
Drivers/BSP/LED/led.c Normal file
View File

@@ -0,0 +1,261 @@
/**
******************************************************************************
* @文件 led.c
* @作者 阜阳师范大学物电学院
* @版本 V0.3
* @日期 2026-01-15
* @简介 LED 驱动 - 基于结构体的高可移植性实现
* @说明 通过修改LED配置数组即可适配不同的硬件连接无需修改其他代码
* 所有硬件相关参数(端口、引脚、极性、速度、上拉下拉)都集中在配置数组中
****
*/
#include "led.h"
/* ============================================================================
* LED配置数组 - 在此处修改硬件连接配置
* 格式说明:
* {端口, 引脚, 极性, 默认状态, 速度, 上拉下拉}
*
* 示例:
* {GPIOA, GPIO_PIN_0, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP}
* {GPIOB, GPIO_PIN_5, LED_POLARITY_HIGH_ACTIVE, GPIO_PIN_RESET, GPIO_SPEED_FREQ_MEDIUM, GPIO_NOPULL}
* ============================================================================ */
static const LED_Config_t led_config[LED_COUNT] = {
/* LED1: PD6 - 低电平有效 */
{GPIOD, GPIO_PIN_6, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED2: PD5 - 低电平有效 */
{GPIOD, GPIO_PIN_5, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED3: PD4 - 低电平有效 */
{GPIOD, GPIO_PIN_4, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED4: PD3 - 低电平有效 */
{GPIOD, GPIO_PIN_3, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED5: PD2 - 低电平有效 */
{GPIOD, GPIO_PIN_2, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED6: PD1 - 低电平有效 */
{GPIOD, GPIO_PIN_1, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED7: PD0 - 低电平有效 */
{GPIOD, GPIO_PIN_0, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED8: PC12 - 低电平有效 */
{GPIOC, GPIO_PIN_12, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED9: PA12 - 低电平有效 */
{GPIOA, GPIO_PIN_12, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED10: PA11 - 低电平有效 */
{GPIOA, GPIO_PIN_11, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED11: PA10 - 低电平有效 */
{GPIOA, GPIO_PIN_10, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED12: PA9 - 低电平有效 */
{GPIOA, GPIO_PIN_9, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED13: PA8 - 低电平有效 */
{GPIOA, GPIO_PIN_8, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED14: PC9 - 低电平有效 */
{GPIOC, GPIO_PIN_9, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED15: PC8 - 低电平有效 */
{GPIOC, GPIO_PIN_8, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED16: PC7 - 低电平有效 */
{GPIOC, GPIO_PIN_7, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED17: PE3 - 低电平有效 */
{GPIOE, GPIO_PIN_3, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED18: PE4 - 低电平有效 */
{GPIOE, GPIO_PIN_4, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED19: PE2 - 低电平有效 */
{GPIOE, GPIO_PIN_2, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
/* LED20: PE5 - 低电平有效 */
{GPIOE, GPIO_PIN_5, LED_POLARITY_LOW_ACTIVE, GPIO_PIN_SET, GPIO_SPEED_FREQ_HIGH, GPIO_PULLUP},
};
/* LED状态数组 - 使用枚举类型提高类型安全性 */
static LED_State_t led_state[LED_COUNT];
/**
* @brief 使能GPIO时钟
* @param port: GPIO端口
* @retval 无
* @note 使用switch-case结构代码更简洁清晰支持所有GPIO端口A-G
*/
static void LED_GPIO_ClockEnable(GPIO_TypeDef *port)
{
switch ((uint32_t)port) {
case (uint32_t)GPIOA: __HAL_RCC_GPIOA_CLK_ENABLE(); break;
case (uint32_t)GPIOB: __HAL_RCC_GPIOB_CLK_ENABLE(); break;
case (uint32_t)GPIOC: __HAL_RCC_GPIOC_CLK_ENABLE(); break;
case (uint32_t)GPIOD: __HAL_RCC_GPIOD_CLK_ENABLE(); break;
case (uint32_t)GPIOE: __HAL_RCC_GPIOE_CLK_ENABLE(); break;
case (uint32_t)GPIOF: __HAL_RCC_GPIOF_CLK_ENABLE(); break;
case (uint32_t)GPIOG: __HAL_RCC_GPIOG_CLK_ENABLE(); break;
default: break;
}
}
/**
* @brief LED初始化
* @param 无
* @retval 无
* @note 自动初始化所有配置的LED所有硬件参数从配置数组中读取
* 无需手动逐个配置,修改硬件连接只需修改配置数组
*/
void LED_Init(void)
{
GPIO_InitTypeDef gpio_init_struct;
uint8_t i;
/* 遍历配置数组初始化所有LED */
for (i = 0; i < LED_COUNT; i++) {
/* 使能对应GPIO时钟 */
LED_GPIO_ClockEnable(led_config[i].port);
/* 从配置数组中读取GPIO参数 */
gpio_init_struct.Pin = led_config[i].pin;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出模式 */
gpio_init_struct.Speed = led_config[i].speed; /* 速度配置 */
gpio_init_struct.Pull = led_config[i].pull; /* 上拉下拉配置 */
/* 初始化GPIO引脚 */
HAL_GPIO_Init(led_config[i].port, &gpio_init_struct);
/* 设置默认状态 */
HAL_GPIO_WritePin(led_config[i].port, led_config[i].pin, led_config[i].default_state);
/* 初始化状态数组(根据默认状态和极性计算逻辑状态) */
if (led_config[i].polarity == LED_POLARITY_LOW_ACTIVE) {
led_state[i] = (led_config[i].default_state == GPIO_PIN_RESET) ? LED_ON : LED_OFF;
} else {
led_state[i] = (led_config[i].default_state == GPIO_PIN_SET) ? LED_ON : LED_OFF;
}
}
LED_POW(LED_ON); /*上电指示灯亮*/
}
/**
* @brief 点亮LED
* @param led_id: LED ID (0 ~ LED_COUNT-1)
* @retval 无
*/
void LED_On(uint8_t led_id)
{
GPIO_PinState pin_state;
if (led_id >= LED_COUNT) {
return;
}
/* 根据极性设置引脚状态 */
if (led_config[led_id].polarity == LED_POLARITY_LOW_ACTIVE) {
pin_state = GPIO_PIN_RESET; /* 低电平有效,输出低电平点亮 */
} else {
pin_state = GPIO_PIN_SET; /* 高电平有效,输出高电平点亮 */
}
HAL_GPIO_WritePin(led_config[led_id].port, led_config[led_id].pin, pin_state);
led_state[led_id] = LED_ON;
}
/**
* @brief 熄灭LED
* @param led_id: LED ID (0 ~ LED_COUNT-1)
* @retval 无
*/
void LED_Off(uint8_t led_id)
{
GPIO_PinState pin_state;
if (led_id >= LED_COUNT) {
return;
}
/* 根据极性设置引脚状态 */
if (led_config[led_id].polarity == LED_POLARITY_LOW_ACTIVE) {
pin_state = GPIO_PIN_SET; /* 低电平有效,输出高电平熄灭 */
} else {
pin_state = GPIO_PIN_RESET; /* 高电平有效,输出低电平熄灭 */
}
HAL_GPIO_WritePin(led_config[led_id].port, led_config[led_id].pin, pin_state);
led_state[led_id] = LED_OFF;
}
/**
* @brief 翻转LED状态
* @param led_id: LED ID (0 ~ LED_COUNT-1)
* @retval 无
*/
void LED_Toggle(uint8_t led_id)
{
if (led_id >= LED_COUNT) {
return;
}
HAL_GPIO_TogglePin(led_config[led_id].port, led_config[led_id].pin);
/* 翻转LED状态 - 使用显式条件判断,提高类型安全性 */
led_state[led_id] = (led_state[led_id] == LED_ON) ? LED_OFF : LED_ON;
}
/**
* @brief 设置LED状态
* @param led_id: LED ID (0 ~ LED_COUNT-1)
* @param state: LED状态 (LED_ON 或 LED_OFF)
* @retval 无
*/
void LED_Set(uint8_t led_id, LED_State_t state)
{
if (state == LED_ON) {
LED_On(led_id);
} else {
LED_Off(led_id);
}
}
/**
* @brief 获取LED状态
* @param led_id: LED ID (0 ~ LED_COUNT-1)
* @retval LED状态 (LED_ON 或 LED_OFF)
*/
LED_State_t LED_GetState(uint8_t led_id)
{
if (led_id >= LED_COUNT) {
return LED_OFF;
}
return led_state[led_id];
}
/**
* @brief 输出LED状态
* @param ledbuf 状态字节
* @retval 无
*/
void LED_Printf(uint8_t* ledbuf)
{
uint32_t leddata = (ledbuf[3]<<24) |(ledbuf[2]<<16) | (ledbuf[1]<<8) | ledbuf[0];
uint32_t i = 0;
LED_State_t state; /* 使用枚举类型,提高类型安全性 */
LED_POW(LED_ON); /* 默认上电亮灯 */
for(i=1; i<LED_COUNT; i++)
{
/* 将位掩码结果转换为枚举类型非0 -> LED_ON, 0 -> LED_OFF */
state = (leddata & (1UL << i)) ? LED_ON : LED_OFF;
LED_Set((uint8_t)i, state);
}
}

44
Drivers/BSP/LED/led.h Normal file
View File

@@ -0,0 +1,44 @@
#ifndef __LED_H__
#define __LED_H__
#include "./SYSTEM/sys/sys.h"
/* LED状态枚举 - 使用枚举类型提高类型安全性 */
typedef enum {
LED_OFF = 0, /* LED熄灭 */
LED_ON = 1 /* LED点亮 */
} LED_State_t;
/* LED极性定义 */
#define LED_POLARITY_LOW_ACTIVE 0 /* 低电平有效(低电平亮) */
#define LED_POLARITY_HIGH_ACTIVE 1 /* 高电平有效(高电平亮) */
/* LED配置结构体 - 所有硬件相关参数集中在此 */
typedef struct {
GPIO_TypeDef *port; /* GPIO端口 (如: GPIOA, GPIOB, ...) */
uint16_t pin; /* GPIO引脚 (如: GPIO_PIN_0, GPIO_PIN_1, ...) */
uint8_t polarity; /* 极性LED_POLARITY_LOW_ACTIVE 或 LED_POLARITY_HIGH_ACTIVE */
GPIO_PinState default_state; /* 默认状态GPIO_PIN_SET 或 GPIO_PIN_RESET */
uint32_t speed; /* GPIO速度GPIO_SPEED_FREQ_LOW/MEDIUM/HIGH */
uint32_t pull; /* 上拉下拉GPIO_PULLUP/GPIO_PULLDOWN/GPIO_NOPULL */
} LED_Config_t;
/* LED数量定义 - 修改此值以适配不同数量的LED */
#define LED_COUNT 20
/* 函数声明 */
void LED_Init(void);
void LED_On(uint8_t led_id);
void LED_Off(uint8_t led_id);
void LED_Toggle(uint8_t led_id);
void LED_Set(uint8_t led_id, LED_State_t state);
LED_State_t LED_GetState(uint8_t led_id);
void LED_Printf(uint8_t* ledbuf);
/* 向后兼容的宏定义基于新的API实现 */
#define LED_POW(x) LED_Set(0, x) /* 电源指示灯 */
#define LED_RUN 1 /* 运行指示灯 */
#endif

208
Drivers/BSP/RS485/rs485.c Normal file
View File

@@ -0,0 +1,208 @@
/******************************************************************************
* @file rs485.c
* @brief rs485串口配置主要配置两种模式 中断接收模式 和 DMA 接收模式
* @details
* 1. DMA模式是主要工作模式
* 2. 中断模式用于错误恢复和接收第一个短帧
* 3. 中断处理完后自动切换回DMA模式
* 4. 中断接收主要用于异常情况处理
* @author 阜阳师范大学物电学院
* @version V0.01
* @date 2026.1.24
* @note 通信协议Modbus RTU
* 通信接口RS485
* 主站地址0x01
******************************************************************************/
#include "rs485.h"
#define RS485_UX USART2
#define RS485_UX_IRQn USART2_IRQn
#define RS485_UX_IRQHandler USART2_IRQHandler
#define RS485_UX_CLK_ENABLE() do{ __HAL_RCC_USART2_CLK_ENABLE(); }while(0) /* 时钟使能 */
#define RS485_SEND_ENABLE() do{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}while(0)
#define RS485_RECEIVE_ENABLE() do{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);}while(0)
#define RS485_ENABLE_GPIO_PORT GPIOA
#define RS485_ENABLE_GPIO_PIN GPIO_PIN_1
#define RS485_ENABLE_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
#define RS485_TX_GPIO_PORT GPIOA
#define RS485_TX_GPIO_PIN GPIO_PIN_2
#define RS485_TX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
#define RS485_RX_GPIO_PORT GPIOA
#define RS485_RX_GPIO_PIN GPIO_PIN_3
#define RS485_RX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
RS485_REGISTER_TYPE RS485REG = {RESET, {0}, {0}}; /* 零初始化定义 */
// HAL库UART句柄
UART_HandleTypeDef rs485_handle; /* UART句柄 */
// HAL库DMA句柄接收
DMA_HandleTypeDef hdma_rs485_rx;
// HAL库DMA句柄发送
DMA_HandleTypeDef hdma_rs485_tx;
#define BAUDRATE (700000)
/**
* @brief 串口X初始化函数
* @param baudrate: 波特率, 根据自己需要设置波特率值
* @note 注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常.
* 这里的USART的时钟源在sys_stm32_clock_init()函数中已经设置过了.
* @retval 无
*/
void RS485_DMA_init()
{
/* 开启时钟 */
RS485_TX_GPIO_CLK_ENABLE(); /* 使能串口TX脚时钟 */
RS485_RX_GPIO_CLK_ENABLE(); /* 使能串口RX脚时钟 */
RS485_ENABLE_GPIO_CLK_ENABLE(); /* 使能串口RX脚时钟 */
RS485_UX_CLK_ENABLE(); /* 使能串口时钟 */
/*GPIO 初始化设置*/
GPIO_InitTypeDef gpio_init_struct = {0};
gpio_init_struct.Pin = RS485_TX_GPIO_PIN; /* 串口发送引脚号 */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* IO速度设置为高速 */
HAL_GPIO_Init(RS485_TX_GPIO_PORT, &gpio_init_struct);
gpio_init_struct.Pin = RS485_RX_GPIO_PIN; /* 串口RX脚 模式设置 */
gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;
HAL_GPIO_Init(RS485_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX脚 必须设置成输入模式 */
gpio_init_struct.Pin = RS485_ENABLE_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(RS485_ENABLE_GPIO_PORT, &gpio_init_struct);
/* 配置DMA接收句柄 */
hdma_rs485_rx.Instance = DMA1_Channel6;
hdma_rs485_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到内存
hdma_rs485_rx.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址不递增
hdma_rs485_rx.Init.MemInc = DMA_MINC_ENABLE; // 内存地址递增
hdma_rs485_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐:字节
hdma_rs485_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 内存数据对齐:字节
hdma_rs485_rx.Init.Mode = DMA_NORMAL; // 正常模式
hdma_rs485_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; // 最高优先级
HAL_DMA_Init(&hdma_rs485_rx); /*初始化DMA 接收*/
/* 关联 DMA 到 UART重要*/
__HAL_LINKDMA(&rs485_handle, hdmarx, hdma_rs485_rx);
/* 使能DMA传输完成中断 */
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
/* UART 初始化设置 */
rs485_handle.Instance = RS485_UX; /* USART_UX */
rs485_handle.Init.BaudRate = BAUDRATE; /* 波特率 */
rs485_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */
rs485_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */
rs485_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */
rs485_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */
rs485_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */
rs485_handle.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&rs485_handle); /* 初始化UART */
HAL_NVIC_EnableIRQ(RS485_UX_IRQn); /* 使能USART中断通道 */
HAL_NVIC_SetPriority(RS485_UX_IRQn, 1, 0); /* 组2抢占优先级1子优先级0 */
/* 启动DMA接收 */
RS485_RECEIVE_ENABLE();
HAL_UARTEx_ReceiveToIdle_DMA(&rs485_handle, (uint8_t *)RS485REG.DR, UART_RX_LEN);
}
/**
* @brief 串口X初始化函数
* @note 注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常.
*
* @retval 无
*/
void RS485_init()
{
/* 开启时钟 */
RS485_TX_GPIO_CLK_ENABLE(); /* 使能串口TX脚时钟 */
RS485_RX_GPIO_CLK_ENABLE(); /* 使能串口RX脚时钟 */
RS485_ENABLE_GPIO_CLK_ENABLE(); /* 使能串口RX脚时钟 */
RS485_UX_CLK_ENABLE(); /* 使能串口时钟 */
/*GPIO 初始化设置*/
GPIO_InitTypeDef gpio_init_struct;
gpio_init_struct.Pin = RS485_TX_GPIO_PIN; /* 串口发送引脚号 */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* IO速度设置为高速 */
HAL_GPIO_Init(RS485_TX_GPIO_PORT, &gpio_init_struct);
gpio_init_struct.Pin = RS485_RX_GPIO_PIN; /* 串口RX脚 模式设置 */
gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;
HAL_GPIO_Init(RS485_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX脚 必须设置成输入模式 */
gpio_init_struct.Pin = RS485_ENABLE_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(RS485_ENABLE_GPIO_PORT, &gpio_init_struct);
/*UART 初始化设置*/
rs485_handle.Instance = RS485_UX; /* USART_UX */
rs485_handle.Init.BaudRate = BAUDRATE; /* 波特率 */
rs485_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */
rs485_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */
rs485_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */
rs485_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */
rs485_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */
HAL_UART_Init(&rs485_handle); /* 使能UART */
/* 该函数会开启接收中断标志位UART_IT_RXNE并且设置接收缓冲以及接收缓冲接收最大数据量 */
__HAL_UART_ENABLE_IT(&rs485_handle, UART_IT_RXNE);
HAL_NVIC_EnableIRQ(RS485_UX_IRQn); /* 使能USART中断通道 */
HAL_NVIC_SetPriority(RS485_UX_IRQn, 1, 0); /* 组2抢占优先级1子优先级0 */
RS485_RECEIVE_ENABLE();
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance == RS485_UX)
{
RS485REG.NewMessageFlag = SET;
HAL_UARTEx_ReceiveToIdle_DMA(&rs485_handle, (uint8_t *)RS485REG.DR, UART_RX_LEN);
}
}
/**
* @brief 485串口中断服务函数
* @param 无
* @retval 无
*/
void RS485_UX_IRQHandler(void)
{
HAL_UART_IRQHandler(&rs485_handle);
}
/*******************************************************************************
* FunctionName : DMA1_Channel6_IRQHandler()
* Description : 串口接收中断
* EntryParameter : none
* ReturnValue : none
********************************************************************************/
void DMA1_Channel6_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_rs485_rx);
}
/***********************************************************************
* FunctionName : RS485_SendBuff()
* Description : 485发送数组
* EntryParameter : *ptr:待发送的字符串, len:待发送的数据个数
* ReturnValue : ptrLen:发送的数据个数
**************************************************************************/
void RS485_SendBuff(uint8_t *ptr, uint32_t len)
{
RS485_SEND_ENABLE();
HAL_UART_Transmit(&rs485_handle, ptr,len, 1000);
RS485_RECEIVE_ENABLE();
}

29
Drivers/BSP/RS485/rs485.h Normal file
View File

@@ -0,0 +1,29 @@
#ifndef __RS485_H__
#define __RS485_H__
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#define UART_RX_LEN (3208)
#define UART_TX_LEN (8)
typedef struct
{
volatile FlagStatus NewMessageFlag; //一帧数据接收完整
volatile uint8_t DR[UART_RX_LEN]; //接收缓存
volatile uint8_t TDR[UART_TX_LEN]; //发送缓存
} RS485_REGISTER_TYPE;
extern RS485_REGISTER_TYPE RS485REG;
void USART2_Init(void);
void RS485_DMA_init(void);
void RS485_SendBuff(uint8_t *ptr, uint32_t len);
#endif

128
Drivers/BSP/SPI/spi.c Normal file
View File

@@ -0,0 +1,128 @@
/**
******************************************************************************
* @文件 spi.c
* @作者 阜阳师范大学物电学院
* @版本 V0.1
* @日期 2025-03-28
* @简介 硬件 SPI 驱动程序
*******
**/
#include "spi.h"
// 定义一个SPI句柄结构体变量用于存储SPI的初始化参数和状态信息
SPI_HandleTypeDef SPI2_Handle;
/**
* @brief 初始化SPI2外设
*
* 该函数用于初始化SPI2外设配置SPI的工作模式、数据大小、时钟极性等参数
* 并使能SPI2外设。
*/
void SPI_Init(void)
{
// 使能SPI2的时钟确保SPI2外设能够正常工作
SPI2_SPI_CLK_ENABLE();
// 指定SPI实例为SPI2
SPI2_Handle.Instance = SPI2;
// 设置SPI工作模式为主机模式由该SPI设备控制通信过程
SPI2_Handle.Init.Mode = SPI_MODE_MASTER;
// 设置SPI通信方向为单线模式即只使用一条数据线进行通信
SPI2_Handle.Init.Direction = SPI_DIRECTION_1LINE;
// 设置SPI数据大小为8位每次传输8位数据
SPI2_Handle.Init.DataSize = SPI_DATASIZE_8BIT;
// 设置SPI时钟极性为高电平即空闲状态下时钟信号为高电平
SPI2_Handle.Init.CLKPolarity = SPI_POLARITY_HIGH;
// 设置SPI时钟相位为第二个边沿采样数据
SPI2_Handle.Init.CLKPhase = SPI_PHASE_2EDGE; /*上升沿采样数据*/
// 设置SPI片选信号为软件控制
SPI2_Handle.Init.NSS = SPI_NSS_SOFT;
// 设置SPI波特率预分频器为256降低SPI通信速率
SPI2_Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
// 设置SPI数据传输的起始位为高位在前
SPI2_Handle.Init.FirstBit = SPI_FIRSTBIT_MSB;
// 禁用SPI的TI模式
SPI2_Handle.Init.TIMode = SPI_TIMODE_DISABLE;
// 禁用SPI的CRC计算功能
SPI2_Handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
// 设置CRC多项式为7虽然已禁用CRC计算但仍需设置该参数
SPI2_Handle.Init.CRCPolynomial = 7;
// 根据上述配置初始化SPI2外设
HAL_SPI_Init(&SPI2_Handle);
// 使能SPI2外设开始工作
__HAL_SPI_ENABLE(&SPI2_Handle);
}
/**
* @brief SPI外设的底层硬件初始化函数
*
* 该函数用于初始化SPI外设所使用的GPIO引脚包括时钟线、数据线等。
*
* @param hspi 指向SPI句柄结构体的指针用于指定要初始化的SPI实例
*/
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
// 定义一个GPIO初始化结构体变量用于配置GPIO引脚的参数
GPIO_InitTypeDef gpio_init_struct;
// 判断要初始化的SPI实例是否为SPI2
if (hspi->Instance == SPI2)
{
// 使能SPI2的MOSI引脚的时钟
SPI_MOSI_GPIO_CLK_ENABLE();
// 注释掉的代码原本可能用于使能SPI2的MISO引脚的时钟
// SPI_MISO_GPIO_CLK_ENABLE();
// 使能SPI2的时钟线引脚的时钟
SPI_CLK_GPIO_CLK_ENABLE();
// 配置SPI2的时钟线引脚
gpio_init_struct.Pin = SPI_CLK_GPIO_PIN;
// 设置引脚模式为复用推挽输出用于连接SPI时钟信号
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
// 设置引脚速度为高频
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
// 根据上述配置初始化SPI2的时钟线引脚
HAL_GPIO_Init(SPI_CLK_GPIO_PORT, &gpio_init_struct);
// 注释掉的代码原本可能用于配置SPI2的MISO引脚
// MISO引脚模式设置(复用输出)
// gpio_init_struct.Pin = SPI_MISO_GPIO_PIN;
// HAL_GPIO_Init(SPI_MISO_GPIO_PORT, &gpio_init_struct);
// 配置SPI2的MOSI引脚
gpio_init_struct.Pin = SPI_MOSI_GPIO_PIN;
// 设置引脚模式为复用推挽输出用于连接SPI数据输出信号
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
// 设置引脚速度为高频
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
// 根据上述配置初始化SPI2的MOSI引脚
HAL_GPIO_Init(SPI_MOSI_GPIO_PORT, &gpio_init_struct);
}
}
/**
* @简介 SPI 写入一个字节8位
* @输入参数 pData要写入的数据指针
* @输入参数 Size要写入的数据大小
* @输入参数 dir1 数据从后面往前发送 0数据从前往后发送
* @注意事项 此函数是高位优先写入
* @返回值 无
*/
void Hard_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint8_t dir)
{
uint16_t i = 0;
dir ? pData += (Size-1): pData;
for(i =0; i < Size; i++)
{
HAL_SPI_Transmit(hspi, pData, 1, 1000);
dir ? pData--: pData++;
}
}

29
Drivers/BSP/SPI/spi.h Normal file
View File

@@ -0,0 +1,29 @@
#ifndef __SPI_H
#define __SPI_H
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#define SPI2_SPI_CLK_ENABLE() do{__HAL_RCC_SPI2_CLK_ENABLE();}while(0)
#define SPI_MOSI_GPIO_PIN GPIO_PIN_15
#define SPI_MOSI_GPIO_PORT GPIOB
#define SPI_MOSI_GPIO_CLK_ENABLE() do{__HAL_RCC_GPIOB_CLK_ENABLE();}while(0)
//#define SPI_MISO_GPIO_PIN GPIO_PIN_14
//#define SPI_MISO_GPIO_PORT GPIOB
//#define SPI_MISO_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE();}while(0)
#define SPI_CLK_GPIO_PIN GPIO_PIN_13
#define SPI_CLK_GPIO_PORT GPIOB
#define SPI_CLK_GPIO_CLK_ENABLE() do{__HAL_RCC_GPIOB_CLK_ENABLE();}while(0)
void SPI_Init(void);
void Hard_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint8_t dir);
extern SPI_HandleTypeDef SPI2_Handle;
#endif

49
Drivers/BSP/TIM/gtim.c Normal file
View File

@@ -0,0 +1,49 @@
/**
******************************************************************************
* @文件 gtim.c
* @作者 阜阳师范大学物电学院
* @版本 V0.1
* @日期 2025-04-1
* @简介 通用定时器模板程序
****
*/
#include "gtim.h"
#include "key.h"
TIM_HandleTypeDef g_timx_handle = {0}; /* 定时器句柄 */
/**
* @brief 通用定时器 TIMx 定时中断初始化函数
* @note
* 定时器溢出时间计算方法: Tout = ((arr+1) * (psc + 1)) / Ft us
* Ft=晶振工作频率:Mhz
*
* @param arr: 自动重装载值
* @param psc: 时钟预分频数
* @retval 无
*/
void gtim_timx_int_init(uint16_t arr, uint16_t psc)
{
GTIM_TIMX_INT_CLK_ENABLE(); /* 使能 TIMx 时钟 */
g_timx_handle.Instance = GTIM_TIMX_INT; /* 通用定时器x */
g_timx_handle.Init.Prescaler = psc; /* 预分频系数 */
g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_timx_handle.Init.Period = arr; /* 自动装载值 */
HAL_TIM_Base_Init(&g_timx_handle);
/*数字越小,优先级越高*/
HAL_NVIC_SetPriority(GTIM_TIMX_INT_IRQn, 2, 0); /* 设置中断优先级抢占优先级2子优先级0 */
HAL_NVIC_EnableIRQ(GTIM_TIMX_INT_IRQn); /* 开启 TIMx 中断 */
HAL_TIM_Base_Start_IT(&g_timx_handle); /* 使能定时器 x 和定时器 x 更新中断 */
}

19
Drivers/BSP/TIM/gtim.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef __GTIM_H__
#define __GTIM_H__
#include "./SYSTEM/sys/sys.h"
#define GTIM_TIMX_INT TIM2
#define GTIM_TIMX_INT_IRQn TIM2_IRQn
#define GTIM_TIMX_INT_IRQHandler TIM2_IRQHandler
#define GTIM_TIMX_INT_CLK_ENABLE() do{__HAL_RCC_TIM2_CLK_ENABLE();}while(0) /* TIM2 时钟使能 */
void gtim_timx_int_init(uint16_t arr, uint16_t psc);
extern TIM_HandleTypeDef g_timx_handle; /* 定时器句柄 */
#endif

37
Drivers/BSP/WDOG/wdog.c Normal file
View File

@@ -0,0 +1,37 @@
/**
******************************************************************************
* @文件 wdog.c
* @作者 阜阳师范大学物电学院
* @版本 V0.1
* @日期 2026-01-15
* @简介 外部看门狗驱动程序
* @说明 在 1.6s 内是 IO 口引脚产生电平反转就可以喂狗成功
****
*/
#include "wdog.h"
/**
* @brief 外部看门狗初始化
* @param 无
* @retval 无
* @note
*/
void WDog_Init(void){
GPIO_InitTypeDef gpio_init_struct;
WDOG_GPIO_CLK_ENABLE(); // 时钟初始化
// 配置LED引脚
gpio_init_struct.Pin = WDOG_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /*推挽输出模式*/
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_HIGH;
// 初始LED选引脚
HAL_GPIO_Init(WDOG_GPIO_PORT, &gpio_init_struct);
}

18
Drivers/BSP/WDOG/wdog.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef __WDOG_H__
#define __WDOG_H__
#include "./SYSTEM/sys/sys.h"
/* WDOG */
#define WDOG_PIN GPIO_PIN_0
#define WDOG_GPIO_PORT GPIOA
#define WDOG_GPIO_CLK_ENABLE() do{__HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
/*看门狗引脚翻转进行喂狗*/
#define Clear_Watchdog() do{ HAL_GPIO_TogglePin(WDOG_GPIO_PORT, WDOG_PIN); }while(0)
void WDog_Init(void);
#endif