文章目录

  • 一、应用模块
  • 二、各点突破
    • 1.响应刷新时间
    • 2.E2PRON
    • 3.三行按键
  • 总结

#题目





一、应用模块

通过按键实现不同界面的切换,通过E2PRON实现数据的保存,通过串口实现PC端数据传输,通过定时器产生PWM。

二、各点突破

1.响应刷新时间

代码如下(示例):定时器刷新响应时间快,可以同时刷新多个事件,编程简单。

u8  Timers[4];//储存事件的数组
int main(void)
{TIM4_Int_Init(50000,72);//定时器初始化while(1){if(xDelay(0,1)==1)//0号事件每1*50ms=50ms刷新一次{         //执行的事件。}if(xDelay(1,2)==1)//1号事件每2*50ms=100ms刷新一次{          //执行的事件。}if(xDelay(2,1)==1)//2号事件每3*50ms=150ms刷新一次{          //执行的事件。}if(xDelay(3,1)==1)//3号事件每4*50ms=200ms刷新一次{          //执行的事件。}}
}
void TIM4_Int_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能//定时器TIM4初始化TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断//中断优先级NVIC设置NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器TIM_Cmd(TIM4, ENABLE); //使能TIMx}uint8_t xDelay(uint8_t xIndex,uint8_t xTime)// 响应事件:xIndex,响应时间:xTime
{uint8_t RetValue=0;if(Timers[xIndex]==0)//判断指定软件定时器的计数器是否为 0{Timers[xIndex]=xTime;//得装计数器的值RetValue=1;    //时间到到标志位 }return(RetValue);
}void TIM4_IRQHandler(void)
{static uint8_t Index;if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); for(Index=0;Index<RefreshEvent;Index++)if(Timers[Index]>0)Timers[Index]--;//进入定时器中断每一个响应事件都会减少一个50ms}}

2.E2PRON

代码如下(示例):题目上电显示初始化。如果一上电就读取E2PRON,我们无法知道官方板子储存数据是什么,读出数据还有进行判断,在给他赋值。于是我换了一个思路,利用E2PRON其他位来判断,E2PRON0到3位是否是我储存的数据。
解决方法:上电判断第一次判断第6位和第7位是否储存6和7。是读取E2PRON0到3位并显示。否,将初始数据保存到E2PRON0到3位,并在第6位和第7位储存6和7。

int main(void)
{if(i2c_read(0x05)==6&&i2c_read(0x06)==7){Xkuce=i2c_read(0x00);Ykuce=i2c_read(0x01);Xjiage=(float)i2c_read(0x02)/10; Yjiage=(float)i2c_read(0x03)/10;} while(1){ if(xDelay(2,1)==1){if(Xkuce!=Xkuce_temp){             i2c_write(0x00,Xkuce);Xkuce_temp=Xkuce;}if(Ykuce!=Ykuce_temp){i2c_write(0x01,Ykuce);Ykuce_temp=Ykuce;}if(Xjiage!=Xjiage_temp){Xjiage_temp1=Xjiage*10;i2c_write(0x02,Xjiage_temp1);Xjiage_temp=Xjiage;}if(Yjiage!=Yjiage_temp){Yjiage_temp1=Yjiage*10;i2c_write(0x03,Yjiage_temp1);Yjiage_temp=Yjiage;      }  i2c_write(0x05,6); i2c_write(0x06,7);}  }
}

3.三行按键

代码如下(示例):三行按键是通过异或实现的按键,无阻塞延时。方便又好用。

#ifndef _KEY_H
#define _KEY_H#include "stm32f10x.h"#define               B1                              0x01
#define             B2                              0x02
#define             B3                              0x04
#define             B4                              0x08#define             KEY_STATE_GET           GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) << 0 | \GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) << 1 | \GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) << 2 | \GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) << 3;extern uint8_t key_state;
extern uint8_t key_falling;
extern uint8_t key_rising;void Key_Init(void);
void Key_refresh(void);#endif
#include "key.h"uint8_t key_state = 0;
uint8_t key_falling = 0;
uint8_t key_rising = 0;void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_Init(GPIOB, &GPIO_InitStructure);
}void Key_refresh(void)
{uint8_t key_temp = 0xF0;key_temp |= KEY_STATE_GET;key_temp ^= 0xFF;
//  key_falling = key_temp & (key_state ^ key_temp);key_rising = (!key_state) * (key_temp ^key_state);key_state = key_temp;
}

总结

链接:https://pan.baidu.com/s/1YFieWqTmYNh52e-3I_NqvQ?pwd=abds
提取码:abds
复制这段内容后打开百度网盘手机App,操作更方便哦

第十三届——蓝桥杯嵌入式第二场相关推荐

  1. 【蓝桥杯】第十三届蓝桥杯单片机第二次省赛 代码程序

    第十三届蓝桥杯单片机第二次省赛 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...

  2. 第十三届蓝桥杯嵌入式备赛-STM32G431-基础模块调试①LED/LCD调试

    目录 0.前言 时钟设置 项目设置 1.功能要求 电路原理图 2.STM32Cubemx初始化 3.程序实现 LCD LED 编写LED灯亮灭的相关函数 LED关闭函数 LEDx开启函数 LEDx关闭 ...

  3. 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

    文章目录 原题展示 原题分析 详细题解 LED模块 按键模块 串口 LCD模块 模拟电压读取(ADC) 脉冲输入输出 文章福利 原题展示 原题分析   本届国赛试题主要包含LCD.LED.按键.EEP ...

  4. 第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑦RTC时钟

    目录 0.前言 1.功能要求 2.STM32Cubemx初始化 3.程序实现 main.c相关初始化 RTC函数 RTC_CalendarGet()日期时间获取函数 设置日期RTC_SetDate和时 ...

  5. 蓝桥杯嵌入式|第十三届蓝桥杯嵌入式省赛程序设计试题及其题解

    题目     十三届省赛是要制作一个可由串口设置密码的密码锁.在本场比赛中,我们将用到LED模块.按键模块.串口模块.定时器的PWM模块以及官方会提供源码的LCD模块.下面就请看原题: 题解      ...

  6. 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解

    原题展示

  7. 第十三届蓝桥杯嵌入式省赛真题演练——密码锁

    题目分析 接下来站在博主的视角来完成这次模拟题.首先,通读题目后我大致能大致能获取到如下信息:要完成一个密码锁的项目,用户通过串口通讯来设置三位密码,使用按键来输入密码.那我的思路先根据硬件框图搭出程 ...

  8. 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛客观题以及详细题解

    题1 概念题. USRAT:异步串口通信,常用于数据传输: SW-DP:SWD 的全称应该是 The Serial Wire Debug Port (SW-DP),也就是串行调试端口,是 ARM 目前 ...

  9. 十三届蓝桥杯嵌入式输出比较(频率和占空比可变)

    目录 原理说明: CUBMAX初始化: 代码实现: 问题和注意事项: 引用的文章: 原理说明:​​​​​​​ 输出比较模式下: CCR = CNT 时,翻转输出电平. PWM模式下: CNT < ...

最新文章

  1. 【原】Linux find 命令整理
  2. python编程界面怎么打开-为Python程序添加图形化界面的教程
  3. 软件项目开发流程及配置人员
  4. android中使用jni对字符串加解密实现分析
  5. 在Linux里设置环境变量的方法(export PATH)--待修改
  6. ssl/tls服务器瞬时_SSL / TLS REST服务器–带有Spring和TomEE的客户端
  7. [css] 你用过outline属性吗?它有什么运用场景
  8. bp 预测 matlab代码,bp神经网络进行交通预测的Matlab源代码.docx
  9. 转:PHP中实现非阻塞模式
  10. PgSQL · 应用案例 · 聚集存储 与 BRIN索引
  11. python ui自动_pytest+python下的UI自动化基础框架
  12. java中递归算法_java中递归算法是什么怎么算的?
  13. 阅卷系统java语言_主观题阅卷系统
  14. 血浆/血清RNA提取试剂盒的功能和特色
  15. python-静态网页爬取
  16. IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法
  17. 街道大动土,断网一周,学习计划照旧
  18. extern的使用方法
  19. JavaScript的pop()
  20. 如何推导欧拉公式e^iθ=cosθ+i*sinθ

热门文章

  1. 求助:程序员得了结膜炎+干眼症怎么办?
  2. 前端面试八股文(详细版)—上
  3. 三菱plcascll转换16进制_三菱FX系列PLC的SER指令使用方法
  4. JavaScript按键使盒子移动
  5. lumen php命令,laravel and lumen 软删除操作
  6. [附源码]计算机毕业设计JAVAjsp高校奖学金评定管理系统
  7. Java开发必学:java核心技术电子书资源
  8. java安装安卓模拟器下载安装_Android模拟器安装及其安装APK方法
  9. 【产品】产品原型设计工具 Axure 和 Mockplus 对比
  10. Python 使用mutagen批量修改MP3标签信息