【蓝桥杯嵌入式】9届程序题刷题记录及反思

一、题目内容分析

 

二、LCD单字符高亮显示实现 

本次要求显示两个字符,此函数高亮pos及它后面一个字符

void highlight(uint8_t *str,uint8_t pos)
{
	int i = 0;
	for(i = 0; i <= 20; i++)
	{
		if(i != pos && i!= (pos+1))
			LCD_DisplayChar(Line3,(320 - (16 * i)),str[i]);
	}
	LCD_SetBackColor(Yellow);
	LCD_DisplayChar(Line3,(320 - (16 * pos)),str[pos]);
    LCD_SetBackColor(Yellow);
    LCD_DisplayChar(Line3,(320 - (16 * (pos+1))),str[pos+1]);
	LCD_SetBackColor(Black);	
}

 

 三、EEPROM

我们主要编写这两个函数

//字节写函数
void at24c02_Byte_Write(unsigned char addr,unsigned char cSendByte);
//随机读
unsigned char at24c02_Byte_read(unsigned char addr);

 找到竞赛平台里的资料

字节写: 

  •  起始信号
  • 器件地址————读为低电平 -> 0xa0
  • 等待应答
  • 发送字节地址
  • 等待应答
  • 发送数据
  • 等待应答
  • 结束信号
//字节写函数
void at24c02_Byte_Write(unsigned char addr,unsigned char cSendByte)
{
    I2CStart();
    I2CSendByte(0xa0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CSendByte(cSendByte);
    I2CWaitAck();
    I2CStop();
}

随机读时序 

  • 开始信号
  • 器件地址写——0xa0
  • 等待应答
  • 发送字节地址
  • 等待应答
  • 器件地址读——0xa1
  • 等待应答
  • 接收字节
  • 发送无应答
  • 结束信号
//随机读
unsigned char at24c02_Byte_read(unsigned char addr)
{
    unsigned char dat;
    I2CStart();
    I2CSendByte(0xa0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CStart();
    I2CSendByte(0xa1);
    I2CWaitAck();
    dat = I2CReceiveByte();
    I2CSendNotAck();
    I2CStop();
    return dat;
}

四、usr.c

#include "usr.h"
/* values ------------------------------------------------------------------*/
char time_state = Runing;
struct keys key[4] = {0,0,0,0};
uint8_t storage_location = 1;
uint8_t hour = 1,min = 2,sec = 10;
char timer_run_flag = 0;
int hightlight_sel = -1;
unsigned char read_data = 0;
void read_initial_data(void){
    hour = at24c02_Byte_read(1);
    min  = at24c02_Byte_read(2);
    sec  = at24c02_Byte_read(3);
}
//led
void led_set(uint8_t display)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,display<<8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

//lcd
void display_init(void)
{
    LCD_Init();
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
    led_set(0x00);
}
void highlight(uint8_t *str,uint8_t pos)
{
	int i = 0;
	for(i = 0; i <= 20; i++)
	{
		if(i != pos && i!= (pos+1))
			LCD_DisplayChar(Line3,(320 - (16 * i)),str[i]);
	}
	LCD_SetBackColor(Yellow);
	LCD_DisplayChar(Line3,(320 - (16 * pos)),str[pos]);
    LCD_SetBackColor(Yellow);
    LCD_DisplayChar(Line3,(320 - (16 * (pos+1))),str[pos+1]);
	LCD_SetBackColor(Black);	
}

//pwm开始输出
void pwm_out_start(void)
{
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
}
//pwm停止输出
void pwm_out_off(void)
{
    HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);
}

void menu_display(void)
{
    if(time_state!=Runing){
        led_set(0x00);
        pwm_out_off();
    }
    if(timer_run_flag == 1){
        time_state = Runing;
        pwm_out_start();
        
    }else if(timer_run_flag == 0){
        time_state = Pause;

    }else if(timer_run_flag == 2){
        time_state = Standby;
    }else{
        time_state = Setting;
    }
    char text[30];
    sprintf(text,"  No %d              ",storage_location);
    LCD_DisplayStringLine(Line1,(u8*)text);
    
    if(min < 10 && hour <10 && sec<10){                                // 0 0 0
        sprintf(text,"       0%d:0%d:0%d           ",hour,min,sec);
    }else if(hour <10 && min < 10 && sec >= 10){                       // 0 0 1
        sprintf(text,"       0%d:0%d:%2d           ",hour,min,sec);
    }else if(hour <10 && min >= 10 && sec < 10){                       // 0 1 0
        sprintf(text,"       0%d:%2d:0%d           ",hour,min,sec);
    }else if(hour <10 && min >= 10 && sec >= 10){                      // 0 1 1
        sprintf(text,"       0%d:%2d:%2d           ",hour,min,sec);
    }else if(hour >= 10 && min < 10 && sec < 10){                      // 1 0 0
        sprintf(text,"       %2d:0%d:0%d           ",hour,min,sec);
    }else if(hour >= 10 && min < 10 && sec >= 10){                     // 1 0 1
        sprintf(text,"       %2d:0%d:%2d           ",hour,min,sec);
    }else if(hour >= 10 && min >= 10 && sec < 10){                     // 1 1 0
        sprintf(text,"       %2d:%2d:0%d           ",hour,min,sec);
    }else if(hour >= 10 && min >= 10 && sec >= 10){                    // 1 1 1
        sprintf(text,"       %2d:%2d:%2d           ",hour,min,sec);
    }
 
    if(time_state == Setting){
        if(hightlight_sel == hightlight_sel_1){
            highlight((u8*)text,Hightlight_location1);
        }else if(hightlight_sel == hightlight_sel_2){
            highlight((u8*)text,Hightlight_location2);
        }else if(hightlight_sel == hightlight_sel_3){
            highlight((u8*)text,Hightlight_location3);
        }
    }else{
        LCD_DisplayStringLine(Line3,(u8*)text);  
    }
    

    if(time_state == Runing){
        sprintf(text,"       Running          ");
    }else if(time_state == Standby){
        sprintf(text,"       Standby          ");
    }else if(time_state == Setting){
        sprintf(text,"       Setting          ");
    }else if(time_state == Pause){
        sprintf(text,"       Pause          ");
    }
    LCD_DisplayStringLine(Line6,(u8*)text);

}

void timer_cnt(void){
    if(sec == 0){
        sec = 60;
        min --;
        if(min == 0){
            min = 59;
            hour --;
            if(hour == 0){
                hour = 0;
            }
        }
    }
}

void key_control(void){
    //短按
    if(key[0].key_short_flag == 1){        
        //read_data = at24c02_Byte_read(1);
        key[0].key_short_flag = 0;
        storage_location ++;
        if(storage_location > No_5){storage_location = No_1;}
    }else if(key[1].key_short_flag == 1){
        key[1].key_short_flag = 0;
        timer_run_flag = 3;
        time_state = Setting;
        if(time_state == Setting){
            hightlight_sel++;
            hightlight_sel %= 3;
           
        }
    }else if(key[2].key_short_flag == 1){
        key[2].key_short_flag = 0;
        //数字增加
        if(time_state == Setting){
            if(hightlight_sel == hightlight_sel_1){
                hour ++;
                hour %= 60;
            }else if(hightlight_sel == hightlight_sel_2){
                min ++;
                min %= 60;
            }else {
                sec ++;
                sec %= 60;
            }
        }
    }else if(key[3].key_short_flag == 1){
        key[3].key_short_flag = 0;
//        at24c02_Byte_Write(1,2);
//        HAL_Delay(5);
//        at24c02_Byte_Write(2,39);
//        HAL_Delay(5);
//        at24c02_Byte_Write(3,11);
        if(time_state == Setting){
            HAL_TIM_Base_Start_IT(&htim7);
            timer_run_flag = 1;
        }else if(time_state == Standby){            //取消定时器运行
                HAL_TIM_Base_Stop_IT(&htim7);
                timer_run_flag = 0;
        }else{
            //定时器启动
            if(timer_run_flag == 0){
                HAL_TIM_Base_Start_IT(&htim7);
                timer_run_flag = 1;
            }else if(timer_run_flag == 1){
            //定时器暂停   
                HAL_TIM_Base_Stop_IT(&htim7);
                timer_run_flag = 0;
            }
        }
    }
    //长按
    if(key[0].key_long_flag == 1){
        key[0].key_long_flag = 0;
        
    }else if(key[1].key_long_flag == 1){
        key[1].key_long_flag = 0;
        if(time_state == Setting){
            at24c02_Byte_Write(storage_location*3-2,hour);
            HAL_Delay(5);
            at24c02_Byte_Write(storage_location*3-1,min);
            HAL_Delay(5);
            at24c02_Byte_Write(storage_location*3  ,sec);
            HAL_Delay(5);
        }
    }else if(key[2].key_long_flag == 1){
       // key[2].key_long_flag = 0;
        if(time_state == Setting){
            if(hightlight_sel == hightlight_sel_1){
                hour ++;
                hour %= 60;
            }else if(hightlight_sel == hightlight_sel_2){
                min ++;
                min %= 60;
            }else {
                sec ++;
                sec %= 60;
            }
            if(key[2].key_sta == 1){
                key[2].key_long_flag = 0;
            }
        }
    }else if(key[3].key_long_flag == 1){
        key[3].key_long_flag = 0;
        //长按取消定时器运行,回到Standby状态
       // if(timer_run_flag == 1){
            timer_run_flag = 2; 
       // }
    }

}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim -> Instance == TIM6){
        key[0].key_sta = HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);
        key[1].key_sta = HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin);
        key[2].key_sta = HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin);
        key[3].key_sta = HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin);
        for(uint8_t i = 0;i < 4;i++){
            switch(key[i].key_judge){
                case 0:{
                    if(key[i].key_sta ==  0){
                        key[i].key_judge = 1;
                    }else{
                        key[i].key_judge = 0;
                    }
                }break;
                case 1:{
                    if(key[i].key_sta ==  0){
                        key[i].key_judge = 2;
                    }else{
                        key[i].key_judge = 0;
                    }
                }break;
                case 2:{
                    if(key[i].key_sta ==  1){
                        if(key[i].key_time <= Key_shorttime){
                            key[i].key_short_flag = 1;
                            key[i].key_time = 0;
                            key[i].key_judge = 0;
                        }
                    }else{
                        if(key[i].key_time >= Key_longtime){
                            key[i].key_time = 0;
                            key[i].key_long_flag = 1;
                            key[i].key_judge = 0;
                        }
                        key[i].key_time ++;
                    }
                }break;
            } 
        }
    }
    if(htim -> Instance == TIM7){               //倒计时计时器
        if(timer_run_flag == 1){
            timer_cnt();
            sec --;
        }
    }
    if(htim -> Instance == TIM17){              //led闪烁定时器
        static uint8_t cnt = 0;
        if(timer_run_flag == 1){
            if(cnt<5){
                led_set(0x01);
            }else{
                led_set(0x00);
            }
            cnt++;
            cnt %= 10;        
        }
        else{
             cnt = 0;
        }                                                          

    }
}

五、usr.h

#ifndef __USR_H
#define __USR_H

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "lcd.h"
#include "tim.h"
#include "stdio.h"
#include "i2c_hal.h"
/* defines -------------------------------------------------------------------*/
#define Runing  0 
#define Setting 1
#define Standby 2
#define Pause   3

#define No_1    1     //1-3
#define No_2    2     //4-6
#define No_3    3     //7-9
#define No_4    4     //10-12
#define No_5    5     //13-15

#define Key_longtime  80
#define Key_shorttime 30

#define Hightlight_location1 7
#define Hightlight_location2 10
#define Hightlight_location3 13

#define hightlight_sel_1     0
#define hightlight_sel_2     1
#define hightlight_sel_3     2
/* structs -------------------------------------------------------------------*/
struct keys{
    uint8_t key_sta;
    uint8_t key_judge;
    uint8_t key_short_flag;
    uint8_t key_long_flag;
    uint16_t key_time;
};


void display_init(void);
void menu_display(void);
void key_control(void);
void timer_cnt(void);
void read_initial_data(void);
#endif 

六、总结

 I2C的两个引脚不需要额外配置(在cubemx配置)

记得调用"i2c_hal.c"里提供的I2CInit()

cubemx在配置定时器的时候记得开启中断,在while前启动

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python输出不了中文怎么解决

在文件头加上#encoding&#xff1a;utf-8即可。 # encoding: utf-8 print helloworld print u"学习" print (unicode("学习", encoding"utf-8")) shell输出&#xff1a; helloworld 学习 学习 还可以用#-*- coding: UTF-8 -*- 来指定。

LangChain学习笔记—RAG(检索增强生成)

LangChain LangChain是一个软件开发框架&#xff0c;可以更轻松地使用大型语言模型&#xff08;LLM&#xff09;创建应用程序。它是一个具有 Python 和 JavaScript 代码库的开源工具。LangChain 允许开发人员将 GPT-4 等 LLM 与外部数据相结合&#xff0c;为聊天机器人、代码理…

C++ | Leetcode C++题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isMatch(string s, string p) {int m s.size();int n p.size();auto matches [&](int i, int j) {if (i 0) {return false;}if (p[j - 1] .) {return true;}return s[i - 1] p[j - 1];};vector<…

WGCAT工单系统使用指南 - 工单有哪几种状态

WGCAT工单管理系统设计的工单生命周期比较简单易懂 1、待接收 2、处理中 3、已拒绝 4、已完成 5、已关闭

CYP450综述-20年-地表最强系列-文献精读-4

Discovery and modification of cytochrome P450 for plant natural products biosynthesis 发现与改造细胞色素P450以合成植物天然产品 一篇关于植物CYP450的综述&#xff0c;地表最强&#xff0c;总结的最全面的版本之一&#xff0c;各位看官有推荐请留言评论区~ Discovery…

App.vue触发axios报错及解决方案

App.vue触发axios报错及解决方案 修改根目录下vue.config.js文件 module.exports {publicPath: ./,assetsDir: assets,configureWebpack: {devServer: {client: {overlay: false}}} }重新npm run dev 搞定

python作业

1.找出10000以内能被5或6整除&#xff0c;但不能被两者同时整除的数(函数) 2.写一个方法&#xff0c;计算列表所有偶数下标元素的和(注意返回值) 3.根据完整的路径从路径中分离文件路径、文件名及扩展名。 4.根据标点符号对字符串进行分行 5.去掉字符串数组中每个字符串的空格 …

波奇学Linux:

面向数据报&#xff1a;udp没有发送缓冲区&#xff0c;发送几次数据报&#xff0c;读取几次数据报&#xff0c;write和read一一对应 tcp通信时只管识别数据&#xff0c;在应用层才对字节进行拼接分析&#xff0c;得到完整请求 简单来说&#xff1a;udp之间传递的是报文&#x…

【打印SQL执行日志】⭐️Mybatis-Plus通过配置在控制台打印执行日志

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好&#xff0c;相信大家平时在处理问题时都有各自的方式&#xff0c;最常用以及最好用的感觉还是断点调试&#xff0c;但是涉及到操作数据库的执行时&#xff0c;默认的话在控制台…

Excel、PowerQuery 和 ChatGPT 终极手册(上)

原文&#xff1a;Ultimate ChatGPT Handbook for Enterprises 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 在不断发展的数据管理和分析领域中&#xff0c;掌握 Excel 的查找功能不仅是一种技能&#xff0c;更是高效数据处理的基石。《使用 Power Query 和 Ch…

kex_exchange_identification: read: Connection reset by peer

换一台机器&#xff0c;登录到远程ip地址&#xff0c;查看ssh的日志。 sudo grep ssh /var/log/auth.log | grep 8.22(登录失败的ip) 可以看到&#xff0c;刚开始是因为登录密码不对&#xff0c;后边是直接拒绝了。应该是sshd的一种保护机制.超过多少次失败&#xff0c;后…

【热门话题】计算机视觉入门:探索数字世界中的“视觉智能”

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 计算机视觉入门&#xff1a;探索数字世界中的“视觉智能”摘要正文一、计算机视…

@RequstBody,IOC,DI,@Autowired,@Resource,lombok,

要使用Jason数据格式必须用post方法&#xff0c;因为是通过请求体传送的&#xff0c;get没有请求体 Data不包括有参构造和无参构造方法

在project模式下使用Implementation Runs窗口

要在“Implementation Runs”窗口中启动active implementation run&#xff0c;请执行以下任一操作&#xff1a; • 在Flow Navigator中选择“Run Implementation”。 • 在主菜单中选择“Flow > Run Implementation”。 • 从工具栏菜单中选择“Run Implementation”。 • …

【剑指offr--C/C++】JZ55 二叉树的深度

一、题目 求二叉树深度两个思路&#xff1a;递归、层次遍历。 二、递归思路及代码 每一个节点的深度都max{左子树深度&#xff0c;右子树深度}1。所以可以使用递归 /* struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left…

基于springboot大学生兼职平台管理系统(完整源码+数据库)

一、项目简介 本项目是一套基于springboot大学生兼职平台管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

智慧农业新篇章:数字乡村引领农业现代化

随着信息技术的飞速发展&#xff0c;数字乡村正成为引领农业现代化的重要力量。智慧农业作为数字乡村的核心内容&#xff0c;以其高效、精准、可持续的特点&#xff0c;为农业现代化开辟了新篇章。本文将从智慧农业的内涵与特点、数字乡村在农业现代化中的引领作用、智慧农业发…

C++数据结构——顺序表

C数据结构——顺序表 以下代码可以作为一个顺序表的模板&#xff0c;从顺序表的初始化创建到增删改查&#xff0c;都有详细的过程&#xff0c;供学习参考。 #include<iostream> #include<stdio.h>using namespace std;#define elemType intstruct SequentialList…

如何实现小程序滑动删除组件+全选批量删除组件

如何实现小程序滑动删除组件全选批量删除组件 一、简介 如何实现小程序滑动删除组件全选批量删除组件 采用 uni-app 实现&#xff0c;可以适用微信小程序、其他各种小程序以及 APP、Web等多个平台 具体实现步骤如下&#xff1a; 下载开发者工具 HbuilderX进入 【Dcloud 插…

项目管理与经济决策(项目管理概论)

1项目的涵义 临时性、一次性的活动&#xff0c;人们称之为“项目”连续不断、周而复始的活动&#xff0c;人们称之为“运 作&#xff08;Operations&#xff09;”或“流程&#xff08;Processes&#xff09;” 项目是为创造独特的产品、服务或成果而进行 的 临 时 性 工 作 …