蓝桥杯嵌入式——第十一届-省赛模拟试题
一、赛题分析
系统框图如下,这一届主要用到了LCD、LED、USART、按键、EEPROM等模块。这些模块的配置都是比较常规的,只是涉及了一个按键的长按短按的考点,对于按键的长按和短按,只需要开辟一个变量,记录一下按键按下的时间,再判断是否是长按。然后对与LCD还考了一下高亮显示,这个在我的另外一篇博客中详细说明,点我跳转。
二、问题总结
- 将按键的扫描放在中断里面,这样的话按键会触发的比较及时,扫面的时间也更加精准。
尽量不要把延时放在按键里面,因为按键是放在中断里面的,中断里面不能有延时。在这次做赛题的过程中就遇到了一个问题,我在按键扫描程序里面向eeprom写数据,然后导致程序卡死,就是因为延时比较长,所以以后需要注意。 - 如下图,赛题有个这样的要求,那么实际测试的时候不是用的我们自己的开发板,那么读出来的数据不久不符合要求了。所以我考虑的是,首先向eeprom的某个字节或者某几个字节写一些特定的数据,就相当于是我自己的一个专有标识了。开发板上电的时候,我们先从这些位置读取数据出来看看是不是自己设置的标识,如果不是,就表示这个开发板是第一次上电,就向里面写入我们的标识,如果是,就表示这个就是自己的开发板,并且不是第一次上电。
if(eeprom_read(7) == 21 && eeprom_read(8) == 43 && eeprom_read(9) == 65)
{
int temp;
temp = eeprom_read(0);
if(temp < 24)
time_alarm.hour = temp;
temp = eeprom_read(1);
if(temp < 60)
time_alarm.min = temp;
temp = eeprom_read(2);
if(temp < 60)
time_alarm.sec = temp;
RTC_SETTING_cnt = eeprom_read(3);
ALARM_SETTING_cnt = eeprom_read(3);
}
else
{
eeprom_write(7,21);
Delay_Ms(5);
eeprom_write(8,43);
Delay_Ms(5);
eeprom_write(9,65);
Delay_Ms(5);
eeprom_write(0,12);
Delay_Ms(5);
eeprom_write(1,0);
Delay_Ms(5);
eeprom_write(2,0);
Delay_Ms(5);
eeprom_write(3,0);
Delay_Ms(5);
eeprom_write(4,0);
Delay_Ms(5);
}