期末大作业-增加了显示时间、设置时间的功能,已基本完成功能。
设置时间的功能使用Cursor生成。 为了减少误差,专门调整了时钟周期。
This commit is contained in:
parent
324328bd25
commit
2fb33e955c
File diff suppressed because it is too large
Load Diff
@ -11,6 +11,8 @@ typedef struct {
|
|||||||
uint8_t bTenMilSecOk; // 10毫秒标志位
|
uint8_t bTenMilSecOk; // 10毫秒标志位
|
||||||
uint8_t mTimeCount; // 秒计数
|
uint8_t mTimeCount; // 秒计数
|
||||||
uint8_t bTimeOk; // 秒标志位
|
uint8_t bTimeOk; // 秒标志位
|
||||||
|
uint8_t mHundredMilSecCount; // 百微秒计数
|
||||||
|
uint8_t bHundredMilSecOk; // 百微秒标志位
|
||||||
} stSysTickTimer;
|
} stSysTickTimer;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -23,6 +25,16 @@ typedef struct {
|
|||||||
uint8_t bTenMilIsOk;
|
uint8_t bTenMilIsOk;
|
||||||
} structTime;
|
} structTime;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SET_HOUR_TENS, // 小时十位
|
||||||
|
SET_HOUR_ONES, // 小时个位
|
||||||
|
SET_MIN_TENS, // 分钟十位
|
||||||
|
SET_MIN_ONES, // 分钟个位
|
||||||
|
SET_SEC_TENS, // 秒十位
|
||||||
|
SET_SEC_ONES, // 秒个位
|
||||||
|
SET_DONE // 设置完成
|
||||||
|
} TIME_STATE;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "variable.h"
|
#include "variable.h"
|
||||||
|
|
||||||
|
extern uint8_t is_setting_time;
|
||||||
|
extern TIME_STATE set_time_state;
|
||||||
|
extern uint8_t show_digit;
|
||||||
|
|
||||||
uint16_t display_tab[] = {
|
uint16_t display_tab[] = {
|
||||||
0x3f,
|
0x3f,
|
||||||
@ -20,7 +22,8 @@ uint16_t display_tab[] = {
|
|||||||
0x5e,
|
0x5e,
|
||||||
0x79,
|
0x79,
|
||||||
0x71,
|
0x71,
|
||||||
0x40
|
0x40,
|
||||||
|
0x00
|
||||||
};
|
};
|
||||||
uint8_t DispBuff[8];
|
uint8_t DispBuff[8];
|
||||||
uint16_t PosSel = 0;
|
uint16_t PosSel = 0;
|
||||||
@ -28,6 +31,31 @@ uint16_t PosSel = 0;
|
|||||||
static void DisplayOneLed(uint8_t dat, uint8_t pos, uint8_t dot) {
|
static void DisplayOneLed(uint8_t dat, uint8_t pos, uint8_t dot) {
|
||||||
uint16_t temp;
|
uint16_t temp;
|
||||||
|
|
||||||
|
if (is_setting_time && !show_digit) {
|
||||||
|
switch (set_time_state) {
|
||||||
|
case SET_HOUR_TENS:
|
||||||
|
if (pos == 0) dat = 17;
|
||||||
|
break;
|
||||||
|
case SET_HOUR_ONES:
|
||||||
|
if (pos == 1) dat = 17;
|
||||||
|
break;
|
||||||
|
case SET_MIN_TENS:
|
||||||
|
if (pos == 3) dat = 17;
|
||||||
|
break;
|
||||||
|
case SET_MIN_ONES:
|
||||||
|
if (pos == 4) dat = 17;
|
||||||
|
break;
|
||||||
|
case SET_SEC_TENS:
|
||||||
|
if (pos == 6) dat = 17;
|
||||||
|
break;
|
||||||
|
case SET_SEC_ONES:
|
||||||
|
if (pos == 7) dat = 17;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
temp = display_tab[dat];
|
temp = display_tab[dat];
|
||||||
if (dot)
|
if (dot)
|
||||||
temp |= 0x80;
|
temp |= 0x80;
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "SegLed.h"
|
#include "SegLed.h"
|
||||||
#include "MatrixKey.h"
|
#include "MatrixKey.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
#include <stdio.h>
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@ -57,7 +58,7 @@ uint16_t mNum=15;
|
|||||||
stSysTickTimer sSysTickTimer = {
|
stSysTickTimer sSysTickTimer = {
|
||||||
0, 0, 0, 0
|
0, 0, 0, 0
|
||||||
};
|
};
|
||||||
uint8_t tempValue;
|
uint8_t tempValue = 255;
|
||||||
structTime stTime = {
|
structTime stTime = {
|
||||||
.mSecond = 50,
|
.mSecond = 50,
|
||||||
.mMinute = 45,
|
.mMinute = 45,
|
||||||
@ -69,8 +70,20 @@ structTime stTime = {
|
|||||||
};
|
};
|
||||||
uint8_t KeyValue = 0;
|
uint8_t KeyValue = 0;
|
||||||
|
|
||||||
|
extern uint8_t is_setting_time;
|
||||||
|
extern TIME_STATE set_time_state;
|
||||||
|
extern uint32_t blink_counter;
|
||||||
|
extern uint8_t show_digit;
|
||||||
|
|
||||||
|
enum picture_index {
|
||||||
|
NEURO_SAMA_SMALL,
|
||||||
|
EVIL_NEURO_SMALL
|
||||||
|
} pic_index = 0;
|
||||||
|
|
||||||
extern const unsigned char gImage_qq[3200];
|
extern const unsigned char gImage_qq[3200];
|
||||||
extern const unsigned char gImage_Neuro_Sama[40704];
|
extern const unsigned char gImage_Neuro_Sama[40704];
|
||||||
|
extern const unsigned char gImage_Neuro_Sama_small[10112];
|
||||||
|
extern const unsigned char gImage_Evil_Neuro_small[10240];
|
||||||
/* USER CODE END PV */
|
/* USER CODE END PV */
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
@ -81,30 +94,57 @@ void SystemClock_Config(void);
|
|||||||
|
|
||||||
/* Private user code ---------------------------------------------------------*/
|
/* Private user code ---------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN 0 */
|
/* USER CODE BEGIN 0 */
|
||||||
void Gui_Drawbmp_full(uint16_t x,uint16_t y,const unsigned char *p) //显示159*128 图片
|
void Gui_Drawbmp_full(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const unsigned char *p)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char picH,picL;
|
unsigned char picH,picL;
|
||||||
LCD_SetWindows(x,y,x+159-1,y+128-1);//窗口设置
|
LCD_SetWindows(x,y,x+width-1,y+height-1);
|
||||||
for(i=0;i<159*128;i++)
|
for(i=0;i<width*height;i++)
|
||||||
{
|
{
|
||||||
picL=*(p+i*2); //数据低位在前
|
picL=*(p+i*2);
|
||||||
picH=*(p+i*2+1);
|
picH=*(p+i*2+1);
|
||||||
Lcd_WriteData_16Bit(picH<<8|picL);
|
Lcd_WriteData_16Bit(picH<<8|picL);
|
||||||
}
|
}
|
||||||
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复显示窗口为全屏
|
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
|
||||||
}
|
}
|
||||||
void my_test(void)
|
void my_init(void) {
|
||||||
{
|
|
||||||
LCD_direction(1);
|
LCD_direction(1);
|
||||||
// LCD_Clear(WHITE);
|
Gui_Drawbmp_full(0,0,159,128,gImage_Neuro_Sama);
|
||||||
// DrawTestPage("图片显示测试");
|
|
||||||
//LCD_Fill(0,20,lcddev.width,lcddev.height-20,WHITE);
|
|
||||||
Gui_Drawbmp_full(0,0,gImage_Neuro_Sama);
|
|
||||||
// Show_Str(20+12,75,BLUE,YELLOW,"QQ",16,1);
|
|
||||||
// Gui_Drawbmp16(70,30,gImage_qq);
|
|
||||||
// Show_Str(70+12,75,BLUE,YELLOW,"QQ",16,1);
|
|
||||||
HAL_Delay(1200);
|
HAL_Delay(1200);
|
||||||
|
LCD_Clear(WHITE);
|
||||||
|
}
|
||||||
|
void refresh_picture() {
|
||||||
|
switch (pic_index) {
|
||||||
|
case NEURO_SAMA_SMALL:
|
||||||
|
Gui_Drawbmp_full(40,50,79,64,gImage_Neuro_Sama_small);
|
||||||
|
break;
|
||||||
|
case EVIL_NEURO_SMALL:
|
||||||
|
Gui_Drawbmp_full(40,50,80,64,gImage_Evil_Neuro_small);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pic_index = (pic_index + 1) % 2;
|
||||||
|
}
|
||||||
|
void my_show_time(void) {
|
||||||
|
char timeStr[20];
|
||||||
|
sprintf(timeStr, "%02d:%02d:%02d", stTime.mHour, stTime.mMinute, stTime.mSecond);
|
||||||
|
|
||||||
|
if (is_setting_time && show_digit) {
|
||||||
|
// 在设置模式下,根据当前设置的位置显示闪烁
|
||||||
|
char mask[6] = {':', ':', '\0'}; // 用于保持冒号显示
|
||||||
|
switch (set_time_state) {
|
||||||
|
case SET_HOUR_TENS: timeStr[0] = ' '; break;
|
||||||
|
case SET_HOUR_ONES: timeStr[1] = ' '; break;
|
||||||
|
case SET_MIN_TENS: timeStr[3] = ' '; break;
|
||||||
|
case SET_MIN_ONES: timeStr[4] = ' '; break;
|
||||||
|
case SET_SEC_TENS: timeStr[6] = ' '; break;
|
||||||
|
case SET_SEC_ONES: timeStr[7] = ' '; break;
|
||||||
|
case SET_DONE: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Show_Str(50, 10, BLUE, YELLOW, timeStr, 16, 0);
|
||||||
}
|
}
|
||||||
/* USER CODE END 0 */
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
@ -143,6 +183,8 @@ int main(void)
|
|||||||
HAL_TIM_Base_Start_IT(&htim3);
|
HAL_TIM_Base_Start_IT(&htim3);
|
||||||
TimeToBuff(&stTime);
|
TimeToBuff(&stTime);
|
||||||
LCD_Init();
|
LCD_Init();
|
||||||
|
my_init();
|
||||||
|
refresh_picture();
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
@ -167,11 +209,18 @@ int main(void)
|
|||||||
// Chinese_Font_test();
|
// Chinese_Font_test();
|
||||||
// Pic_test();
|
// Pic_test();
|
||||||
// Rotate_Test();
|
// Rotate_Test();
|
||||||
|
if (sSysTickTimer.bHundredMilSecOk) {
|
||||||
|
sSysTickTimer.bHundredMilSecOk = 0;
|
||||||
|
my_show_time();
|
||||||
|
}
|
||||||
if (sSysTickTimer.bTimeOk) {
|
if (sSysTickTimer.bTimeOk) {
|
||||||
sSysTickTimer.bTimeOk = 0;
|
sSysTickTimer.bTimeOk = 0;
|
||||||
HAL_GPIO_TogglePin(TickLed_GPIO_Port, TickLed_Pin);
|
HAL_GPIO_TogglePin(TickLed_GPIO_Port, TickLed_Pin);
|
||||||
my_test();
|
|
||||||
}
|
}
|
||||||
|
if (tempValue == 10) {
|
||||||
|
refresh_picture();
|
||||||
|
tempValue = 255;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* USER CODE END 3 */
|
/* USER CODE END 3 */
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,14 @@
|
|||||||
/* Private variables ---------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN PV */
|
/* USER CODE BEGIN PV */
|
||||||
|
|
||||||
|
TIME_STATE set_time_state = SET_DONE;
|
||||||
|
|
||||||
|
uint8_t is_setting_time = 0; // 是否在设置时间模式
|
||||||
|
uint32_t blink_counter = 0; // 用于闪烁效果的计数器
|
||||||
|
uint8_t show_digit = 1; // 用于闪烁效果
|
||||||
|
|
||||||
|
extern uint8_t tempValue;
|
||||||
|
extern structTime stTime;
|
||||||
/* USER CODE END PV */
|
/* USER CODE END PV */
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
@ -56,6 +64,63 @@
|
|||||||
/* Private user code ---------------------------------------------------------*/
|
/* Private user code ---------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN 0 */
|
/* USER CODE BEGIN 0 */
|
||||||
|
|
||||||
|
void process_time_setting() {
|
||||||
|
if (tempValue == 11) { // 按键11用于进入/退出设置模式
|
||||||
|
if (!is_setting_time) {
|
||||||
|
is_setting_time = 1;
|
||||||
|
set_time_state = SET_HOUR_TENS;
|
||||||
|
show_digit = 1;
|
||||||
|
blink_counter = 0;
|
||||||
|
} else {
|
||||||
|
is_setting_time = 0;
|
||||||
|
set_time_state = SET_DONE;
|
||||||
|
}
|
||||||
|
tempValue = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_setting_time || tempValue > 9) return; // 只处理0-9的按键输入
|
||||||
|
|
||||||
|
switch (set_time_state) {
|
||||||
|
case SET_HOUR_TENS:
|
||||||
|
if (tempValue > 2) tempValue = 2; // 限制小时十位最大为2
|
||||||
|
stTime.mHour = tempValue * 10;
|
||||||
|
set_time_state = SET_HOUR_ONES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_HOUR_ONES:
|
||||||
|
if (stTime.mHour == 20 && tempValue > 3) tempValue = 3; // 如果十位是2,个位最大为3
|
||||||
|
stTime.mHour = (stTime.mHour / 10) * 10 + tempValue;
|
||||||
|
set_time_state = SET_MIN_TENS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_MIN_TENS:
|
||||||
|
if (tempValue > 5) tempValue = 5; // 限制分钟十位最大为5
|
||||||
|
stTime.mMinute = tempValue * 10;
|
||||||
|
set_time_state = SET_MIN_ONES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_MIN_ONES:
|
||||||
|
stTime.mMinute = (stTime.mMinute / 10) * 10 + tempValue;
|
||||||
|
set_time_state = SET_SEC_TENS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_SEC_TENS:
|
||||||
|
if (tempValue > 5) tempValue = 5; // 限制秒十位最大为5
|
||||||
|
stTime.mSecond = tempValue * 10;
|
||||||
|
set_time_state = SET_SEC_ONES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_SEC_ONES:
|
||||||
|
stTime.mSecond = (stTime.mSecond / 10) * 10 + tempValue;
|
||||||
|
is_setting_time = 0;
|
||||||
|
set_time_state = SET_DONE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_DONE:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* USER CODE END 0 */
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
/* External variables --------------------------------------------------------*/
|
/* External variables --------------------------------------------------------*/
|
||||||
@ -207,15 +272,24 @@ void SysTick_Handler(void)
|
|||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
if (KeyValue == KeyTable[i]) {
|
if (KeyValue == KeyTable[i]) {
|
||||||
tempValue = i;
|
tempValue = i;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DispToBuff(tempValue);
|
process_time_setting();
|
||||||
|
// DispToBuff(tempValue);
|
||||||
}
|
}
|
||||||
if (++sSysTickTimer.mTimeCount >= 100) {
|
if (++sSysTickTimer.mHundredMilSecCount >= 10) {
|
||||||
sSysTickTimer.mTimeCount = 0;
|
sSysTickTimer.mHundredMilSecCount = 0;
|
||||||
sSysTickTimer.bTimeOk = 1;
|
sSysTickTimer.bHundredMilSecOk = 1;
|
||||||
if(++mNum>=19)
|
if (is_setting_time) {
|
||||||
mNum=15;
|
show_digit = !show_digit;
|
||||||
|
}
|
||||||
|
if (++sSysTickTimer.mTimeCount >= 10) {
|
||||||
|
sSysTickTimer.mTimeCount = 0;
|
||||||
|
sSysTickTimer.bTimeOk = 1;
|
||||||
|
if(++mNum>=19)
|
||||||
|
mNum=15;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* USER CODE END SysTick_IRQn 1 */
|
/* USER CODE END SysTick_IRQn 1 */
|
||||||
|
@ -43,7 +43,7 @@ void MX_TIM3_Init(void)
|
|||||||
htim3.Instance = TIM3;
|
htim3.Instance = TIM3;
|
||||||
htim3.Init.Prescaler = 170-1;
|
htim3.Init.Prescaler = 170-1;
|
||||||
htim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
|
htim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
|
||||||
htim3.Init.Period = 999;
|
htim3.Init.Period = 1015;
|
||||||
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||||
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||||
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
||||||
|
@ -315,7 +315,7 @@ SPI2.Mode=SPI_MODE_MASTER
|
|||||||
SPI2.VirtualType=VM_MASTER
|
SPI2.VirtualType=VM_MASTER
|
||||||
TIM3.CounterMode=TIM_COUNTERMODE_CENTERALIGNED1
|
TIM3.CounterMode=TIM_COUNTERMODE_CENTERALIGNED1
|
||||||
TIM3.IPParameters=Prescaler,CounterMode,PeriodNoDither
|
TIM3.IPParameters=Prescaler,CounterMode,PeriodNoDither
|
||||||
TIM3.PeriodNoDither=1000-1
|
TIM3.PeriodNoDither=1016-1
|
||||||
TIM3.Prescaler=170-1
|
TIM3.Prescaler=170-1
|
||||||
VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals
|
VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals
|
||||||
VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals
|
VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals
|
||||||
|
Loading…
Reference in New Issue
Block a user