接上篇讲到的虚拟键盘设计,下一步就是课程变量录入。关于课程肯定是要掉电保存的,我比较懒就选了板载的AT24C02(去买一个也行,就一瓶快乐水不到的价格),默认出厂地址都是0XA0,剩下的就是IIC协议的事(真的,只要按着时序图写,用系统delay就行不会出错)。因为写入方式是一个字节一个字节的写入,所以我们在封装函数的时候要知道写入的地址、写入的内容、以及写入的个数,满足上述后两者最好的办法就是用数组,故写入之前,我们需要对每个课程进行宏定义取数组长度(方便后期修改)且提前放入内容:
const u8 TEXT_Buffer[]={"NON"};//没课
const u8 Math[]={"Mat"};
const u8 Chinese[]={"Chi"};
const u8 English[]={"Eng"};
const u8 Physics[]={"Phy"};
const u8 Biology[]={"Bio"};
const u8 Chemistry[]={"Che"};
const u8 Geography[]={"Geo"};
const u8 Politics[]={"Pol"};
const u8 History[]={"His"};
#define SIZE sizeof(TEXT_Buffer)
#define MathSIZE sizeof(Math)
#define ChineseSIZE sizeof(Chinese)
#define EnglishSIZE sizeof(English)
#define PhysicsSIZE sizeof(Physics)
#define BiologySIZE sizeof(Biology)
#define ChemistrySIZE sizeof(Chemistry)
#define GeographySIZE sizeof(Geography)
#define PoliticsSIZE sizeof(Politics)
#define HistorySIZE sizeof(History)
可能不少朋友会问:为什么课程数组填入的内容用的是首字母三位缩写?这就不得不提到一份钱一分货的故事了,AT24C02虽然便宜,但是它的存储空间仅有256(0-255),我们要写入一周的课程那么256/7天/8结课=4.57意味着每个课程的英文名只能有四个英文(显然不会)故只能采用缩写进行分辨,反正最后读的时候匹配显示出全名不就好了嘛,省省是好事。
那么剩下的事情就很好解决了,以我取的三位首字母缩写为例子,我们开一个for循环:for(count=87;count<255;)我从87位开始写AT24C02的地址,内嵌一个while(1)死循环,破除死循环的条件是按下课程/跳过输入课程,每次循环一遍则count+3(避免重复写入覆盖数据),以count为AT24C03的首位写入地址,每次写入后自动更新地址AT24CXX_Write(count,课程数组,宏定义直接取长度)由此即可完成课程录入,只需在获取虚拟按键值后if判断里写入之前预留的功能函数即可。写入如此,后续我们根据日期读取指定时间的课程时也是如此。此外我们还可以根据count的值进行计算:一天三节课一节课用3个英文表示,差值为24也就意味着87(星期一)+24=111后即为星期二,可以此更新我们录入课程时实时星期几的显示。
在上述while(1)死循环里我们做到了一步一循环的课程录入,因避免误触我们需要再加入一个“确认”变量做到既按下课程//退出又按下确认方可执行录入程序。如果我们不打算录入则需要在对应的“取消录入”功能键里写入标志位flag,当按下等于一时for(count=87;count<255;)和while(1)对其判定break退出。退出时记得给虚拟键盘清屏。
特别注意:AT24C02在连续写入:页写(一页就八字节)的时候需要在写完一页后延迟5us以上,否则会出现写入错误问题(官方手册有提到)
至此我们完成课程录入工作。