- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
菜单系统在AVR上的移植.pdf
AVR
AVR
一个占用内存极小的菜单系统在AAVVRR上的移植
相信经典的《一个占用内存极小的菜单系统的实现》这篇文章大家都看过了吧
我在做某工程的时候,也借鉴了作者的 的编程思想并在atmega32上做了自己的菜单系统
简单的说一下移植思路,本文假设读者详细阅读了 《一个占用内存很小的菜单系统》这篇
经典文章,并理解了原作者的编程思想,以及有一定的AVR C语言编程经验。
WINAV
WINAV
本文以下代码基于WWIINNAAVVRR2200009900331133
1.
1.
11..函数名列表 索引的移植
因为直接加const关键词定义表格是没有用的 表格的数据仍然是存放在.data区(RAM)的
还需要加PROGMEM关键字:
例子如下::::
constKbdTabStructKeyTab[]PROGMEM={
{0,1,2,3,4,(*MenuSleepInit)},
{1,0,0,0,0,(*MenuSleepUp)},
{2,0,0,0,0,(*MenuSleepDn)},
{3,0,0,0,0,(*MenuSleepEsc)},
{4,0,0,0,0,(*MenuSleepEtr)},
{5,6,7,8,9,(*MenuTopInit)},
{6,0,0,0,0,(*MenuTopUp)},
{7,0,0,0,0,(*MenuTopDn)},
{8,0,0,0,0,(*MenuTopEsc)},
{9,0,0,0,0,(*MenuTopEtr)},
……
}
这样 数组就被定义在Flash区了
2. ?
2. ?
22..如何读出菜单状态??
KeyFuncIndex=pgm_read_byte(KeyTab[KeyFuncIndex].KeyUpState);
3. Flash
3. Flash
33..如何把函数指针从 FFllaasshh区取出来 并执行?
(*((void(*)(void))pgm_read_word(KeyTab[KeyFuncIndex].CurrentOperate)))();
//从Flash区 读出函数指针(2个字节)并且强制转换为函数 执行
更简单的办法:
#define PgmFun(A) (*((void(*)(void))pgm_read_word(A)))() //定义一个可以执行
Flash区函数指针的宏
然后一句
PgmFun(KeyTab[KeyFuncIndex].CurrentOperate);
就可以调用表格内的函数指针.
4.
4.
44..菜单项的定义
const uchar MenuSetsEN_0[] PROGMEM=SetTime;
const uchar MenuSetsEN_1[] PROGMEM=SetDate;
const uchar*MenuSetsEN[] PROGMEM=
{
MenuSetsEN_0,
MenuSetsEN_1,
……
}
5.
5.
55..关于显示方面
一般情况下printf(formatstring);中的formatstring是在.data区的
我们还需要编写一个Printf_P
下面是一个LCD_Printf_P函数
/*
函数名:void LCD_Printf_P(unsigned char StartX,unsigned char AtLineY,const prog_char
*strfmt,...)
入口参数:unsignedcharStartX,unsignedcharAtLineY 开始点
constprog_char*strfmt,要显示的内容
%s 显示字符串 %d显示一个无符号整数0~65535的
文档评论(0)