stm32按键设置闹钟数进退位不正常?如何解决

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  stm32按键设置闹钟数进退位不正常。软件是keil5,板子是STM32F407ZGTx。程序想实现LCD屏实时显示时间,并有闹钟功能,按键可以更改设置时间和闹钟。

写的完整代码如下:

#include "stm32f4xx.h"
#include "system.h"
#include "Systick.h"
#include "LED.h"
#include "BEEP.h"
#include "Key.h"
#include "EXTI.h"
#include "TIME.h"
#include "PWM.h"
#include "Usart.h"
#include "stdio.h"
#include "IWDG.h"
#include "WWDG.h"
#include "tftlcd.h"
#include "Draw.h"
#include "rtc.h"/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
u8 GetMaxDay(u16 year, u8 month) //每月最大天数
{u8 day;switch (month) {case 1: case 3: case 5: case 7: case 8: case 10: case 12:day = 31;break;case 4: case 6: case 9: case 11:day = 30;break;case 2:// 判断是否是闰年if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {day = 29;} else {day = 28;}break;default:day = 31;break;}return day;
}int main()
{ unsigned char time_str[10];unsigned char date_str[25];unsigned char clock_str[25];//按键状态定义u8 key = 0;u8 k0=0,k1=0;//初始化SysTick_Init(168);//时钟频率为168 MHzNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC的优先级分组,设置为优先级组2USART1_Init(115200);//波特率为115200LED_Init();//初始化LED模块TFTLCD_Init();//初始化TFT LCD显示屏KEY_Init();//初始化按键模块BEEP_Init();//初始化蜂鸣器模块RTC_Config();//配置实时时钟(RTC)FRONT_COLOR=BLACK;//初始化结构体变量RTC_DateStruct.RTC_Year = 24; // 假设年份为2024年RTC_DateStruct.RTC_Month = 6; // 假设月份为6月RTC_DateStruct.RTC_Date = 18; // 假设日期为18日RTC_DateStruct.RTC_WeekDay = 2; // 假设星期为周二RTC_TimeStruct.RTC_Hours = 11; // 假设小时为11RTC_TimeStruct.RTC_Minutes = 10;//假设分钟为10RTC_TimeStruct.RTC_Seconds = 0; // 假设秒为0RTC_AlarmStruct.RTC_AlarmDateWeekDay = 2; // 假设闹钟日期为周二RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = 11; // 假设闹钟小时为11RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = 11; // 假设闹钟分钟为11RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 0; // 假设闹钟秒为0RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);//配置WAKE UP中断,1秒钟中断一次//RTC_Set_AlarmA(3,16,31,50);  //使用闹钟A,示例周3,16点31分50秒响RTC_Set_AlarmA(2,11,11,00);  //周2 11点11分00秒 蜂鸣器响while(1){//按键改变key=Key_Scan(0);if(key == KEY0_PRESS){ k0++;printf("按键k0依次设置顺序年、月、日、星期、时、分、秒、闹钟星期、闹钟时、闹钟分、闹钟秒,key_up加1,key_1减1\r\n");if(k0 == 1){printf("进入年份设置\r\n");k1 = 1;}if(k0 == 2){printf("进入月份设置\r\n");k1 = 2;}if(k0 == 3){printf("进入日设置\r\n");k1 = 3;}if(k0 == 4){printf("进入星期设置\r\n");k1 = 4;}if(k0 == 5){printf("进入时设置\r\n");k1 = 5;}if(k0 == 6){printf("进入分设置\r\n");k1 = 6;}if(k0 == 7){printf("进入秒设置\r\n");k1 = 7;}if(k0 == 8){printf("进入闹钟的星期设置\r\n");k1 = 8;}if(k0 == 9){printf("进入闹钟的时设置\r\n");k1 = 9;}if(k0 == 10){printf("进入闹钟的分设置\r\n");k1 = 10;}if(k0 == 11){printf("进入闹钟的秒设置\r\n");k1 = 11;}}//改变实时时钟的年份if((key == KEY_UP_PRESS) && (k1 == 1)){printf("进入年份加1判断\r\n");RTC_DateStruct.RTC_Year++;RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}if((key == KEY1_PRESS) && (k1 == 1)){printf("进入年份减1判断\r\n");RTC_DateStruct.RTC_Year--;RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}//改变实时时钟的月份if((key == KEY_UP_PRESS) && (k1 == 2)){printf("进入月份加1判断\r\n");RTC_DateStruct.RTC_Month = (RTC_DateStruct.RTC_Month % 12) + 1; // 增加月份循环RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}if((key == KEY1_PRESS) && (k1 == 2)){printf("进入月份减1判断\r\n");RTC_DateStruct.RTC_Month = (RTC_DateStruct.RTC_Month + 10) % 12 + 1; // 减少月份循环RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}//改变实时时钟的日if((key == KEY_UP_PRESS) && (k1 == 3)){printf("进入日加1判断\r\n");u8 max_day = GetMaxDay(RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month);RTC_DateStruct.RTC_Date = (RTC_DateStruct.RTC_Date % max_day) + 1; // 增加日期并循环RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}if((key == KEY1_PRESS) && (k1 == 3)){printf("进入日减1判断\r\n");u8 max_day = GetMaxDay(RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month);RTC_DateStruct.RTC_Date = (RTC_DateStruct.RTC_Date + max_day - 2) % max_day + 1; // 减少日期并循环RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}//改变实时时钟星期if((key == KEY_UP_PRESS) && (k1 == 4)){printf("进入星期加1判断\r\n");RTC_DateStruct.RTC_WeekDay = (RTC_DateStruct.RTC_WeekDay % 7) + 1; // 增加星期并循环RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}if((key == KEY1_PRESS) && (k1 == 4)){printf("进入星期减1判断\r\n");RTC_DateStruct.RTC_WeekDay = (RTC_DateStruct.RTC_WeekDay + 5) % 7 + 1; // 减少星期并循环RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);}//改变实时时钟的时if((key == KEY_UP_PRESS) && (k1 == 5)){printf("进入时加1判断\r\n");RTC_TimeStruct.RTC_Hours = (RTC_TimeStruct.RTC_Hours + 1) % 24; // 增加小时并循环RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);}if((key == KEY1_PRESS) && (k1 == 5)){printf("进入时减1判断\r\n");RTC_TimeStruct.RTC_Hours = (RTC_TimeStruct.RTC_Hours + 23) % 24; // 减少小时并循环RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);}//改变实时时钟的分if((key == KEY_UP_PRESS) && (k1 == 6)){printf("进入分加1判断\r\n");RTC_TimeStruct.RTC_Minutes = (RTC_TimeStruct.RTC_Minutes + 1) % 60; // 增加分钟并循环RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);}if((key == KEY1_PRESS) && (k1 == 6)){printf("进入分减1判断\r\n");RTC_TimeStruct.RTC_Minutes = (RTC_TimeStruct.RTC_Minutes + 59) % 60; // 减少分钟并循环RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);}//改变实时时钟的秒if((key == KEY_UP_PRESS) && (k1 == 7)){printf("进入秒加1判断\r\n");RTC_TimeStruct.RTC_Seconds = (RTC_TimeStruct.RTC_Seconds + 1) % 60; // 增加秒并循环RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);}if((key == KEY1_PRESS) && (k1 == 7)){RTC_TimeStruct.RTC_Seconds = (RTC_TimeStruct.RTC_Seconds + 59) % 60; // 减少秒并循环RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);}//改变闹钟的星期if((key == KEY_UP_PRESS) && (k1 == 8)){printf("进入闹钟星期加1判断\r\n");RTC_AlarmStruct.RTC_AlarmDateWeekDay = (RTC_AlarmStruct.RTC_AlarmDateWeekDay % 7) + 1; // 增加星期并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}if((key == KEY1_PRESS) && (k1 == 8)){printf("进入闹钟星期减1判断\r\n");RTC_AlarmStruct.RTC_AlarmDateWeekDay = (RTC_AlarmStruct.RTC_AlarmDateWeekDay + 5) % 7 + 1; // 减少星期并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}//改变闹钟的时if((key == KEY_UP_PRESS) && (k1 == 9)){printf("进入闹钟的时加1判断\r\n");RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours + 1) % 24; // 增加小时并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}if((key == KEY1_PRESS) && (k1 == 9)){printf("进入闹钟的时减1判断\r\n");RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours + 23) % 24; // 减少小时并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}//改变闹钟的分if((key == KEY_UP_PRESS) && (k1 == 10)){printf("进入闹钟的分加1判断\r\n");RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes + 1) % 60; // 增加分钟并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}if((key == KEY1_PRESS) && (k1 == 10)){printf("进入闹钟的分减1判断\r\n");RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes + 59) % 60; // 减少分钟并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}//改变闹钟的秒if((key == KEY_UP_PRESS) && (k1 == 11)){printf("进入闹钟的秒加1判断\r\n");RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 1) % 60; // 增加秒并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}if((key == KEY1_PRESS) && (k1 == 11)){printf("进入闹钟的秒减1判断\r\n");RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 59) % 60; // 减少秒并循环RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);}RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);RTC_GetDate(RTC_Format_BIN,&RTC_DateStruct);RTC_GetAlarm(RTC_Format_BIN , RTC_Alarm_A , &RTC_AlarmStruct);//LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,12,"hello");
//snprintf(str, sizeof(str), "%d", num);  //整数变字符串
//LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,12,str);sprintf(date_str, "20%02d-%02d-%02d  week:%d", RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date, RTC_DateStruct.RTC_WeekDay);  // 整形转字符串sprintf(time_str, "%02d:%02d:%02d", RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds);   // 整形转字符串sprintf(clock_str, "week:%d %d:%d:%d", RTC_AlarmStruct.RTC_AlarmDateWeekDay, RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours, RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);  // 整形转字符串LCD_ShowString(10, 30, tftlcd_data.width, tftlcd_data.height, 24, date_str); // 实时时间LCD显示LCD_ShowString(10, 60, tftlcd_data.width, tftlcd_data.height, 24, time_str);  // 实时时间LCD显示LCD_ShowString(10, 90, tftlcd_data.width, tftlcd_data.height, 24, clock_str);  // 实时时间LCD显示}
}


烧录后发现,按键更改闹钟的秒数时,加减实现进位、退位有问题。

问题展示如图可见,第三行最右就是闹钟秒数。在闹钟秒为59时摁按键增加,没有跳转到00而是09,之后一直增加可到99,99再增加又跳到了10,10之后增加就是正常进位了;若在10时摁按键减少,就是99、89、79…到09这样子减少,继续减少又是59,59之后减少是正常的。按键调整其他,例如年月日星期什么的都是正常的,只有闹钟秒数这里有问题。

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  根据您的描述和代码,问题出现在处理闹钟秒数的进位和退位逻辑上。在您的代码中,对秒数的加1和减1操作使用了简单的模运算,但在处理边界情况(即59到60和0到-1)时,这种模运算会导致不正确的行为。

问题分析

  1. 加1问题:当秒数为59时,(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 1) % 60 的结果应该是0,但您的代码中是09,这可能是因为在显示时没有考虑到秒数从59到0的转换。

  2. 减1问题:当秒数为10时,(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 59) % 60 的结果应该是-49,模60后变成11,这显然不正确。正确的逻辑应该是当秒数为0时,减1应该变成59。

解决方案

对于加1和减1的操作,我们需要重新设计逻辑,确保在边界情况下能够正确处理。

改进的加1逻辑
if((key == KEY_UP_PRESS) && (k1 == 11))
{RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds++;if(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds > 59){RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 0;}RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay, RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours, RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
}
改进的减1逻辑
if((key == KEY1_PRESS) && (k1 == 11))
{if(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds == 0){RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 59;}else{RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds--;}RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay, RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours, RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
}

其他注意事项

  • 确保在修改时间或闹钟设置后,调用RTC_Set_AlarmA()函数时传入的参数是正确的。
  • 检查LCD显示函数LCD_ShowString是否正确处理了时间格式的显示,特别是在进位和退位后。
  • 如果可能,添加一些调试信息,打印出在按键操作前后的秒数,以便于跟踪问题。

  通过上述修改,应该能够解决您遇到的进位和退位不正常的问题。如果问题仍然存在,请检查其他可能影响显示和设置的部分代码。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李彦宏: 开源模型是智商税|马斯克: OpenAI 闭源不如叫 CloseAI

在 2024 年世界人工智能大会(WAIC 2024)上,百度创始人、董事长兼首席执行官李彦宏发表对开源模型的评价。 李彦宏认为:开源模型实际上是一种智商税,而闭源模型才是人工智能(AI)行业的未来。 马…

如何批量更改很多个文件夹里的文件名中包含文件夹名?

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【学术会议征稿】第五届大数据、人工智能与物联网工程国际会议

第五届大数据、人工智能与物联网工程国际会议 2024 5th International Conference on Big Data, Artificial Intelligence and Internet of Things 第五届大数据、人工智能与物联网工程国际会议(ICBAIE 2024)定于2024年10月25-27号在中国深圳隆重举行。…

JRT打印药敏报告

最近没写jrt系列博客,不是中途而废了。而是在写微生物系统。今天终于把微生物大体完成了,伴随着业务的实现,框架趋于完善和稳定。构建一套完美而强大的打印体系一直是我的理想,从最开始C#的winform打印控件到刚接触bs时候用js打印…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 (1)准备Arcmap桌面软件; (2)准备2020年逐月平均气温数据(NC格式)、范围图层数据&…

JAVA分布式事务详情分布式事务的解决方案Java中的分布式事务实现

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

数一140+上岸|七月强化一定要避开这3个雷区!

当然可以,强化阶段的主要任务就是做题! 但是不用一刀切,强化阶段听课和做题可以二八原则,就是听课占20%,做题占80%。 因为自己去自学讲义的话,比如张宇18讲,会漏掉一些重点,有的技…

进程间的通信--管道

文章目录 一、进程通信的介绍1.1进程间为什么需要通信1.2进程如何通信 二、管道2.1匿名管道2.1.1文件描述符理解管道2.1.2接口使用2.1.3管道的4种情况2.1.4管道的五种特征 2.2管道的使用场景2.2.1命令行中的管道2.2.2进程池 2.命名管道2.1.1原理2.2.2接口2.2.3代码实例 一、进程…

scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别

一、在 Python 中,有多种函数可以用于应用 FIR/IIR 滤波器,每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别: from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…

【Docker-compose】搭建php 环境

文章目录 Docker-compose容器编排1. 是什么2. 能干嘛3. 去哪下4. Compose 核心概念5. 实战 :linux 配置dns 服务器,搭建lemp环境(Nginx MySQL (MariaDB) PHP )要求6. 配置dns解析配置 lemp Docker-compose容器编排 1. 是什么 …

【智能算法改进】一种混合多策略改进的麻雀搜索算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及实现 2.改进点 精英反向学习策略 将精英反向学习策略应用到初始化阶段, 通过反向解的生成与精英个体的选择, 不仅使算法搜索范围得到扩大, 提…

从零开学C++:类和对象(上)

引言:在学习了C的入门级知识之后,现在就让我们一起进入类和对象的学习吧,该知识点我将分为上,中,下三个部分对其进行讲解。 更多有关C语言和数据结构的知识详解可前往个人主页:计信猫 目录 一,类…

Android liveData 监听异常,fragment可见时才收到回调记录

背景&#xff1a;在app的fragment不可见的情况下使用&#xff0c;发现注册了&#xff0c;但是没有回调导致数据一直未更新&#xff0c;只有在fragment可见的时候才收到回调 // 观察通用信息mLightNaviTopViewModel.getUpdateCommonInfo().observe(this, new Observer<Common…

[嵌入式 C 语言] 按位与、或、取反、异或

若协议中如下图所示&#xff1a; 注意&#xff1a; 长度为1&#xff0c;表示1个字节&#xff0c;也就是0xFF&#xff0c;也就是 1111 1111 &#xff08;这里0xFF只是单纯表示一个数&#xff0c;也可以是其他数&#xff0c;这里需要注意的是1个字节的意思&#xff09; 一、按位…

第三课网关作用

实验拓扑图&#xff1a; 基础配置&#xff1a; PC1的基础配置 PC2的基础配置&#xff1a; PC4的基础配置 AR1添加PC4网段: 并且添加pc1,pc2的网段。 并且添加pc1,pc2的网段。 原理&#xff1a;PC4先把数据交给100.100.100.1&#xff0c;交给了路由器&#xff0c;路由器再把数…

瑞萨RH850 RTC计时进位异常

RH850 MCU的RTC&#xff08;实时时钟&#xff09;采用BCD&#xff08;二进制编码的十进制&#xff09;编码格式&#xff0c;支持闰年自动识别&#xff0c;并具有秒、分、时、日、周、月、年的进位功能。其中&#xff0c;秒和分为60进位&#xff0c;时为12或24进位&#xff0c;周…

Qt Design Studio 4.5现已发布

Qt Design Studio现已强势回归&#xff0c;生产力和可用性均得到大幅提升。无论是直观的3D编辑界面&#xff0c;还是与Figma和Qt Creator的无缝连接&#xff0c;新版Qt Design Studio将为您带来更好的产品开发体验。快来深入了解Qt Design Studio的全新功能吧&#xff01; 为3…

期权交易必须弄懂的期权波动率是什么?

今天带你了解期权交易必须弄懂的期权波动率是什么&#xff1f;波动率是金融资产价格波动的度量&#xff0c;它衡量了资产的收益率的不确定性&#xff0c;常用于反映金融资产的风险水平。 期权波动率是衡量资产价格偏离平均值的程度&#xff0c;偏离程度越大&#xff0c;期权波…

Animate软件基础:重命名图层或文件夹

默认情况下&#xff0c;Animate 会按照创建顺序向新图层分配名称&#xff1a;图层 1、图层 2&#xff0c;依此类推。为了更好地反映图层的内容&#xff0c;可以对图层进行重命名。 如果需要对图层或图层文件夹进行重命名&#xff0c;请执行下列操作之一&#xff1a; 双击时间轴…