内容介绍
内容介绍
自我介绍:我是来自山东的陈海,目前是嵌入式工程师。主做单片机类。
一、实现的功能:
本设计大体上完成了两个功能,一个是时钟系统,采用DS3231实时时钟芯 片,第二个是计步系统,采用MPU6050计算步数。oled把两个系统分成两个界面, 通过按键自由切换。
按键切换界面,一个界面是日期时间界面,另一个是步数界面
显示采用OLED12864单色屏
计时采用DS3231芯片
计步采用MPU6050
-
日期时间界面
void time_mode_init(void) { OLED_Clear(); OLED_DisplayChineseInit(0, 1); OLED_ShowString(64+8, 0, (uint8_t *)"(UTC+8)", 16); OLED_DisplayChineseInit(48, 2); OLED_ShowChar_3216(32, 16, ':'); OLED_ShowChar_3216(32+16+32, 16, ':'); OLED_ShowChar(8*4, 48, '/', 16); OLED_ShowChar(8*7, 48, '/', 16); OLED_RefreshGram(); }
例一、日期时间界面初始化
void refresh_date_time(void)
{
DateTime dt = DS3231_GetNowTime();
OLED_ShowNum_3216(0, 16, dt.hour, 2);
OLED_ShowNum_3216(16*3, 16, dt.minute, 2);
OLED_ShowNum_3216(16*6, 16, dt.second, 2);
OLED_ShowNumDateTime(0, 48, dt.year, 4, 16);
OLED_ShowNumDateTime(8*5, 48, dt.month, 2, 16);
OLED_ShowNumDateTime(8*8, 48, dt.day, 2, 16);
OLED_DisplayChinese(128-16, 48, week_str[dt.week - 1]);
OLED_RefreshGram();
}
例二、日期时间界面刷新
-
计步界面
void step_mode_init(void) { int16_t gx, gy, gz; OLED_Clear(); OLED_DisplayChineseInit(0, 3); OLED_RefreshGram(); MPU6050_GetGyroscope(&gx, &gy, &gz); MPU6050_GetGyroscope(&gx, &gy, &gz); MPU6050_GetGyroscope(&gx, &gy, &gz); mpu6050_init_data = GET_ABS(gx) + GET_ABS(gy) + GET_ABS(gz); }
例三、计步界面初始化
void refresh_step(void)
{
static uint32_t step_cnt = 0;
static uint32_t step_ok = 0;
int16_t gx, gy, gz;
MPU6050_GetGyroscope(&gx, &gy, &gz);
uint32_t tmp = GET_ABS(gx) + GET_ABS(gy) + GET_ABS(gz);
if (mpu6050_init_data * 4 < tmp)
{
step_ok = 1;
}
else if (step_ok == 1)
{
step_cnt++;
step_ok = 0;
}
OLED_ShowNum_3216(16, 24, step_cnt, 6);
OLED_RefreshGram();
}
例四、计步界面刷新
-
主函数初始化与按键检测
int main(void) { static uint8_t mode = 0, key_down = 0, key_cnt = 0; printf("uart ok ?\r\n"); OLED_Init(); SIM_I2C_Init(); // DS3231_Init(); MPU6050_I2C_Init(); uint8_t rel = MPU6050_Init(); time_mode_init(); GPIO_Config(&key_pin); DelayMs(1000);
例五、主函数初始化
while (1)
{
if (!mode)
refresh_date_time();
else
refresh_step();
if (GPIO_InGet(&key_pin) == 0) {
key_down = 1;
} else {
key_down = 0;
key_cnt = 0;
}
LCD_SET_BLK(0);
for (__IO uint32_t i = 0; i < 200000; i++) {} //500ms
LCD_SET_BLK(1);
for (__IO uint32_t i = 0; i < 200000; i++) {}
if (key_down == 1)
{
if (key_cnt >= 1)
{
mode = mode ? 0 : 1;
if (mode)
step_mode_init();
else
time_mode_init();
key_down = 0;
key_cnt = 0;
printf("%u\r\n", (uint32_t)mode);
}
else
{
key_cnt++;
}
}
}
例六、主函数按键检测及循环
二、对本活动的心得体会。
1、第一次接触这种小封装的单片机,试用了下发现性能超乎预料,通过这次活动, 我对小体积高性能的解决方案有了新的认知
2、美信写的函数库非常清晰易懂,对自己封装底层有重要参考价值。
建议:
和上次一样,感觉活动如果可以多出些直播外教程就更好了。
团队介绍
评论
0 / 100
查看更多
猜你喜欢