原创 单片机菜单程序编写误区

2011-7-8 22:48 2209 8 9 分类: MCU/ 嵌入式

前段时间,用MSP430单片机开发的病虫害统计器的菜单程序出现了严重的问题,出现无缘无故死机和屏乱码,纠结了好几天,找不到问题的所在,幸亏有学长的指点,原来是堆栈的溢出,分析后是由于我的菜单是一个界面一个while1)组成造成的,如下:

Void Screenvoid

{

界面相关显示不变的

While1

{

扫描按键

If(按键一)

{

Screen_1();

break

}

If(按键二)

{

Screen_2();

brreak

}

……………..

 

}

}

Screen_1();   Screen_1();也行如Sreen这样写,切换几个界面可能没有什么问题,一旦界面换多了,它就会不断地在函数里面调用,跳不出来,因为每次调用函数都是放到RAM中的,函数套用多了,就会堆栈溢出了,而且出现死机是有一定规律的。

根据学长的讲解和指点,可以用标志位来切换不同界面,这样就不会出现如上情况,按键扫面可以放到整个大循环或者中断中,就不需要每个函数都扫描了,将固定的不变的没有while循环的界面程序写入相关界面函数即可,从而避免函数中调用函数,break跳不出来。如下:

uchar S_S=1;uchar S=0;   //标志位定义

Void Screenvoid

{

While1

{        按键扫描

Switch(键值)

{

Case 1

      相应键值标志

Case 2

      相应键值标志

}

}

IfS_S==1//默认初始界面

{

If(切换到下一界面的键值)

{

 键值复位;

 Screen_1();    //第一界面函数  无任何按键操作函数和循环

S_S=0

S=1

}

………………..

}

If(S==1)

{

If(切换到下一界面的键值)

{

 键值复位;

 Screen_1();    //第一界面函数  无任何按键操作函数和循环

S=2

}

…………….

}

If(S==2)

{

…………………..

}

………………

}

Void Screen_1(void)// 界面相关显示不变的

{

    Disp_HZ_1(40,120,(unsigned short *)"病虫调查统计器",7);

    Disp_HZ_1(80,200,(unsigned short *)"南京恒裕仪器",6);

    Disp_HZ_1(10,293,(unsigned short *)"菜单",2);

    Disp_HZ_1(95,293,(unsigned short *)"关机",2);

    Disp_HZ_1(180,293,(unsigned short *)"统计",2);

………….

}

 

这样一改,菜单就可以了,几乎不会出错,不知还有没更好的方法,希望得到大侠的批判。

 

 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1650614 2012-10-22 16:41

老大 你的485串口程序 用的版本是多少?

egaiai.1989_868445655 2011-7-8 12:26

哦,这个版本好像是张信哲和刘嘉玲的,不是容祖儿的6

egaiai.1989_868445655 2011-7-8 12:26

还有个版本,是孙燕姿和陈奕迅唱的,好听的没话说啊……
相关推荐阅读
用户1487752 2011-09-14 20:03
对小车和电赛个人看法
飞思卡尔智能小车比赛现在在全国各大高校的影响力越来越来大了,参赛队越来越多,规模越来越大,它集电子,机械、控制、计算机等多学科的知识于一体,是一项很能够锻炼大学生各方面动手能力的赛事,我相信参加过赛事...
用户1487752 2011-09-14 19:39
大学的竞赛路走完了
随着全国大学生电子设计大赛江苏赛区的成绩公布,我的大学竞赛路走完了。是该总结的时候了,从大二就开始着手准备和参加电子设计竞赛和飞思卡尔智能汽车比赛,到前几天自我结束的全国电赛,充满了喜悦、心酸、奋...
用户1487752 2011-07-12 17:30
遇到问题,PT100长线传输AD波动
电路图如下所示   采用差分放大,送到STM32的AD采样,PT100用的是两线制的,当PT100的线不是很长时,采样数据基本稳定,但是一但PT100的两端线很长时,AD采样的数据波动很大,并联一个...
用户1487752 2011-07-08 23:02
单片机RAM数组溢出
在编写输入法时,用到的一个结构数组,在结构数组中由于导入了太多的汉字导致堆栈溢出,其实就是RAM不够用了,因为程序中默认将全局的数组和变量放到RAM中去,我用的是MSP430F149它的RAM有2...
用户1487752 2011-05-14 12:41
发现一个用操作系统概念写单片机程序的好方法
 主要思想就是利用中断,把需要实现的功能分为多个响应时间频率的事件,然后在中断中实现,对于用单片机实现多任务有很好的借鉴价值,很简单。。确实很实用。。attachment download...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条