Reader's Digest

Digest your Internet

“Hello World!”的十个问题

Written By: dch1 - Jan• 23•11

我觉得,基本上可以说每个程序员都很熟悉“Hello World!”程序。依照惯例,它是学习编程语言、编译并运行你的首个程序的一种快速方法。然而,除此之外,它的价值不大。下面是我认为Hello World的十个问题。

我觉得,基本上可以说每个程序员都很熟悉“Hello World!”程序。依照惯例,它是学习编程语言、编译并运行你的首个程序的一种快速方法。然而,除此之外,它的价值不大。下面是我认为Hello World的十个问题。

10. 为什么是“Hello World”?为什么不叫“Hello Dave”或者“It Works!”?(Dave就是《2011太空漫游》中的HAL 9000)

我知道这个问题有点夸张。“Hello World”这种说法从何而来呢?除你之外,最后一次有人运行你的程序是什么时候?也许用“Hello <输入你的名字>”更合理些。

9. 它只适用于一件事情”?

我不是在发表“Hello World”一无是处的言论。然而,他们唯一擅长的就是合理性检查。

“Hello World”并不能帮你学习任何编程语言,它能做的只是帮你写一个能编译和运行的简单程序。

它可以帮助你检查其合理性,然后你便可以告诉你自己,“我成功了!”

8. 既不给力又不好玩

随着游戏中精细图形及互联网交互性的发展,几乎没有人再对那些在屏幕上输出一些字的应用程序感兴趣。

就像刚才说的那样,写一个“Hello World!”程序,除了你自己之外,不会给任何人留下印象。此外,它也不可能是你学习编程的动力。

7. 它不切实际

你最后一次编写仅要求将字符串显示到标准输出的程序是什么时候?有人可能会说,现在很少有程序不包含图形用户界面——不管是网页、窗口界面,或者甚至是对文件、数据库的操作。可能它在学术界很实用,在学术界可以始终如一地让程序显示运算或者数值,但专业领域并非如此。

6. 没有交互性

“Hello Word!”这个例子,除了需要终端用户验证“HelloWorld!”是否显示在屏幕上之外,不依赖用户做任何其它操作。它没有要求用户输入用户名、退 出程序或重新运行程序之类的交互。关于终端用户和程序之间如何进行交互,“Hello Word!”并没有涉及相关内容。

5. 没有逻辑和运算

计算处理非常依赖于逻辑结构(如:当这个条件为真时,打印这条语句)和运算。大多数程序的编写将运用一些标准下的决策逻辑。甚至计算机的基本组成部分(机器代码)也代表一种逻辑表达式:1=真,0=假。

4. 在不同语言下,太过相似

如果你观察一下不同语言编写的“Hello World!”程序,你会发现它们之间非常相似。

一旦你精通于用一种语言写出 “Hello World!”程序,那么你也差不多能用其他语言熟练地编写这个程序。

3. 只使用一个关键字

如果你看过各种Hello World范例,你会发现他们的共同点就是都只使用一个关键字。

一门编程语言有多少关键字:数百?上千?在编程语言的学习中,只学一个关键字是微乎其微的一步。

 

2. 忽略了变量和常量

 

正如我前面提到的,学习一门编程语言,除了要学习如何将一些东西显示在屏幕上之外,还要学习相当多的其他知识。

很少有程序不使用变量。

你可以说,由于“Hello World!”把语句中的字符串给写死了,因而这个程序会误导大家学习不好的编程习惯。

“Hello World”例子至少可以用一个常量来储存“Hello World”字符串的值。

1. 忽略了函数和OO等概念

“Hello World!”例子并没有用到一门给定编程语言的其他特性。

比如下面这些:

  • 函数签名
  • 类结构
  • 命名空间
  • 继承

大多数老练的程序员能理解这些东西,但对于那些新手或者只有过程化编程背景的人来说,这还是会让他们沮丧。

后台挂QQ挂MSN不是梦Backgrounder终极教程

Written By: dch1 - Jan• 23•11

  有很多人说iPhone 4开始  4.0以后的固件已经支持后台运行了,为什么还需要Backgrounder????

  我想说双击Home键出来的叫做最近运行程序列表,出现在这个列表里面的唯一、充分且必要条件是最近运行过的程序,跟任何别的因素没有关系。而且列表里面的图标是按最近运行的顺序排序的。这个列表里面的程序有可能是在后台驻留的,也有可能是已经完全退出的,还有可能是真后台还在继续运行的。总之,都有可能,因为是否后台跟是否出现在这个列表无关。我们可以肯定的只有一点:不在这个列表里面的程序必定是已经完全退出了的。在后台驻留但不出现在最近程序列表里面这种情况是不允许发生的。
如果你在这个列表里面手动叉掉一个程序图标,那么:
1、如果程序本来就已经完全退出,那么什么事情也不会发生,只是删掉了一个图标而已。
2、如果程序是在原生后台,那么程序会释放内存并退出,如果程序在运行系统支持的那几项原生后台任务(音乐,GPS什么的),会被终止。
3、如果程序在真后台运行,那么程序会终止运行并完全退出。并有可能丢失未保存的数据,这一点我不是很肯定,需要进一步观察。

  有很多人问为什么把程序设成完全关闭之后在双击Home键弹出的任务管理器里面还是存在,似乎大家都觉得Backgrounder的完全关闭还是没有在任务管理器里面手动删掉后台程序干净,这一点似乎让很多强迫症病患、偏执狂以及完美主义者极度不爽。关于这个问题,iOS4用户手册繁体中文版官方说明书说得很清楚了,双击Home键你看到的只是最近运行的程序,跟后台不后台没有一毛钱关系。你在这里删除的,也只是最近运行的程序图标而已,跟程序是否退出也没有一毛钱关系。而双击Home键弹出来这个东东也不叫任务管理器,只是最近运行程序列表而已。之所以你以为这个是任务管理器,只是你想当然而已,或许还有部分白痴评测文章的影响。总之,这个故事告诉我们,不要总以为自己看到的、自己想象的东西是正确的,多看说明书是正道。

  在网上看了半天,没有看到一个到位的Backgrounder教程,大多数都是截个图,告诉你照他这样设就好了。且不说各人的使用习惯不一样照猫画虎行不行,单说发这些教程的人很多自己也没搞清楚那些选项的真正意思,各种版本的教程问题多多。

  偏偏Backgrounder又是个对系统行为影响巨大的程序,个人感觉那些越狱之后大叫越狱费电厉害的一大半是因为这个程序。而Backgrounder的设置又是无比的绕,不仔细想想是不大能搞清楚的,这个程序的设置是需要思考的。所以小弟我认真做了个教程,希望能够帮大家正确使用这个程序。所有的说明以iOS4为标准,更早的系统我没有用过,没办法帮到大家。

后台模式设置(Backgrounding method)

  对于正确使用Backgrounder,最重要的就是对于iOS4原生后台模式的理解。这个问题Backgrounder自带的说明就已经讲得很清楚了。

  iOS4提供的伪后台支持后台音乐播放,GPS定位,网络语音通话,以及任务完成。也就是说仅只有这四项工作可以真正在后台运行。所谓任务完成是指在程序退出的时候还有工作没处理完,比如保存进度存档,那么系统允许程序在后台继续工作,然后在完成保存进度之后停止运行。

  除了上述四项后台功能,系统还提供一个程序快速切换的功能,这个功能也算是iOS4多任务的一部分。个人观点,这个功能是iOS4多任务中最先进最有用的功能。它让程序在最小化的时候仅仅是暂停运行,但并不释放内存,保持程序当前的状态,这样当你再次打开这个程序的时候,程序不需要重新从硬盘(闪存)中读出,不需要重新Load数据,而是瞬间恢复到上次退出程序时的状态,这个特性会给用户很强的多任务的感觉,仿佛程序从来没有退出过一样。而这个功能所花费的代价只是一块内存,而并不消耗cpu时间。什么意思呢?就是说快速切换并不比退出程序多耗一丝电,相反,由于再次打开程序的时候不需要读硬盘(闪存),它比退出程序再重新启动更省电!

  关于程序快速切换,了解到这个程度还不够,我们还需要知道更深入一点才能正确地使用Backgrounder。

  第一点是:为快速切换所保留的内存空间是可以被挤占的。iOS4是没有内存交换空间的,它不会像Windows那样把硬盘(闪存)虚拟成内存来建立一个对应用程序来说无限的虚拟内存空间。所以,在iOS4中,当前台程序内存空间不足的时候,系统会释放掉为后台程序保留的用于快速切换的内存,提供给前台程序使用。当然,如果所有能释放的内存都释放了,还不能满足前台程序的内存要求的话,系统会直接中止前台程序的运行,这就是我们为什么会看到有些程序运行中无故退出的原因。用于快速切换的内存可以被挤占这个特性是很先进的内存动态管理方式,特别适合于内存资源紧张的移动设备。这种内存管理策略的优点是在几乎不消耗任何额外的时间(CPU时间,程序在后台暂停)、空间(内存空间,可以被挤占)资源的情况下,可以提供一个性能优良的伪多任务环境。但是正因为快速切换的内存可以被挤占,所以它的缺点就是它不总是可用的。大家都有经验打开Safari的时候,有时能够直接显示上次退出时候的网页,有时候就需要重新载入,就是这个原因。

  关于快速切换我们需要知道的另外一点是,在每个程序最小化的时候,系统都会给程序发送一个通知,告诉程序你现在已经被最小化了。这时候一个优雅、精良的程序会释放掉可以释放的一部分无关紧要的空间以节省内存,比如画面缓存。这个特性的意思是支持iOS4多任务的程序被快速切换到后台以后占用的内存空间会比在前台运行时少。Backgrounder的真后台的操作方式就是在程序最小化的时候不给程序发送这个最小化的通知,所以程序不知道自己已经在后台了,不仅是仍然占用和在前台时一样多的内存,而且还在继续运行,和在前台时一样烧电。而除了几个操作系统底层的精灵进程之外,所有程序在iOS4的原生后台状态下都是暂停运行的,不烧电的。不仅如此,就算是已经在后台的程序,如果它支持iOS4多任务,那么它在收到系统发出的内存不足通知的时候,它还可以继续释放更多内存。比如Safari,在刚最小化的时候,它是保留所有打开的网页的,之后如果系统发出内存不足通知,Safari就可以一个一个地释放已打开的网页所占用的内存。

  好了,说了这么多,就是为了帮助大家正确选择Backgrounder最重要的一项选择:全局后台模式选择。对于这个选择,小弟只有一个推荐:原生模式。
  第一项:程序退出。上面已经说了,相比原生后台模式没有任何优势,两者都不会让程序在后台运行都不耗电,两者都不占内存(原生模式快速切换的内存可被释放),但是程序的退出和启动要比原生的快速切换多耗电且速度慢(你每次打开植物大战僵尸都要等那条草皮重新展开一次)。这里要顺便说一下,那些喜欢双击home键调出任务栏然后一个一个关掉任务栏上所有程序的同学,你们的这种偏执行为没有任何意义。

  第三项:真后台模式。这是Backgrounder的精华,是它存在的意义所在,但是也是很危险的选择。你需要时刻牢记的是,程序在真后台的时候在和前台时一样全速运行,一样刷新要显示的每一帧画面,除了背光,跟在前台的时候一样耗电。你更需要小心的是除了电,真后台的程序还跟在前台的时候一样在消耗流量!!!我的建议是:切勿在全局设置里面选择这一项。只有你真的需要一个程序在后台运行的时候才在覆盖设置里面添加你要的程序,然后选择这一项。别的程序选择真后台除了烧电以外没有任何意义,说不定还会让你错过很多东西:等你接完电话切回去一看,僵尸早就把你家铲了。

  第四项:自动选择模式。这个模式的意思是:对于支持iOS4多任务的程序使用原生模式,对于不支持iOS4多任务原生后台的老程序启用真后台模式。我个人的看法还是不要选这一项,需要真后台的程序还是要在覆盖设置里面手动添加。因为你不知道哪些程序是不支持原生后台的,所以很容易某个老游戏糊里糊涂地就被真后台了,然后疯狂偷电偷流量,尤其是在菊花显示没有打开的情况下。

原生后台模式选项(Option for “Native”)

  第一项:程序快速切换。不用说,一定要打开。如果关闭这一项,那么除了音乐、GPS、VOIP和任务完成之外就跟关闭后台没有区别了。

  第二项:即使程序不支持快速切换也强行打开。对于这一项就要小心了,主要有两个问题。一是不支持原生后台快速切换的程序在打开这个Backgrounder提供的快速切换的时候不会主动释放部分内存,跟在前台时占用的内存一样。二是程序通过这种方式被快速切换到后台之后,如果所保留的内存被别的程序挤占的话,未保存的进度和工作会全部丢失。支持快速切换的程序不会出现这种情况,因为他们在收到最小化通知的时候就会自动存盘。所以,个人意见不推荐打开这个选项。
真后台模式选项(Option for “Backgrounder”)
后台开关选项(Backgrounding state)
后台状态显示选项(Indicate state via…)
Miscellaneous

这几项都涉及到后台模式切换,而且比较绕,所以放到一起讲。
这几项之所以绕,是因为后台模式切换的问题Backgrounder的说明里面没有说得很直白清楚。

  Backgrounder可以让我们在应用程序运行中通过Activator的手势或者按键在两种后台模式之间切换,但是具体是在哪两种模式之间切换很多人都没搞清楚。现在我们一共有三种模式:无后台模式(完全退出),原生模式和真后台模式(自动检测不算一个模式)。这三种模式的切换方式是:

1、对于设置为原生后台模式的程序,它会在原生后台和完全退出之间切换。原生后台的时候显示蓝菊花和N图标,完全退出模式时无菊花和图标。比如ipod程序,在切换到无后台模式之后一按Home键歌声就停止了,跟在任务栏里面手动关掉一个效果。

2、对于真后台模式的程序,可以通过真后台切换模式选项:Fall back to Native来选择是切换到完全退出还是切换到原生后台。我选择的是切换到原生后台,因为在我现在的理解中,无后台模式没有存在的价值。当然,既然作者做了完全退出的选项,说明完全退出还是有存在的意义的,只是现在我对iOS的理解还不深,还看不到其中的原因。

3、对于设置为完全退出的程序,则无法切换后台状态,只能完全退出,没有选择。

4、有一种神奇的程序是完全无法后台的,不管你设成原生后台还是真后台,它们永远都不会在后台运行,这是因为它们被有意地设计成在最小化的时候就完全退出。这类程序也无法切换后台状态,也永远不会有后台图标或者菊花显示,因为它们永远不会在后台运行。我对装软件这种事情是很谨慎的,尤其是修改系统的软件,不是我需要的我绝对不会装,我这年纪的人已经没有那么大好奇心了。所以这类程序我还没有遇到过,但是Backgrounder的作者在FAQ里面是有提到的,我理解可能是出于安全原因吧,比如网银程序之类。这类程序要是后台了然后你手机被偷了你就仆街了,所以我想一到后台就退出这种设计是很有存在的意义的。另外说一下Cydia,回帖里面有同学说Cydia是可以后台的,我试了一下,用真后台模式确实是可以后台的。之所以我之前以为是不能后台的,是因为目前Cydia还没有为iOS4更新,所以不支持原生后台模式。另外Backgrounder的作者说Activator的作者在他的程序中有意屏蔽了Cydia,所以在Cydia运行的时候无法切换后台模式,具体原因不详。以上两点导致了我的误解,大家对Cydia打开真后台并且打开Enable at launch就可以后台它了。

  后台开关选项用于定义程序打开和最小化程序时的后台状态。这两个选项相当绕,个人觉得作者应该改进这两个选项。为了说清楚这两个选项,我必须先说Minimize on Toggle。

  Minimize on Toggle的意思是在切换后台模式的时候最小化程序。作者做这个选项的意图是为了让你有两种退出程序的方法。比如说按照缺省设置:长按Home键切换后台模式,那么如果Minimize on Toggle打开了,你就可以短按Home键关闭程序(或者最小化到原生后台),长按Home键让程序真后台(打开真后台,同时最小化)。如果Minimize on Toggle关闭,那么你可以在程序运行时切换到你想要的后台模式,然后再按Home键最小化程序(需要Stay Enabled打开)

  Enable at Launch决定程序打开时候的后台状态。

  Stay Enabled表示是否要在程序最小化的时候保持后台开启,这个选项相当蛋疼,因为如果不打开这一项,不管你在程序运行的时候切换到了什么后台模式,一按Home键全部关闭。所以如果这一项关闭了,那么Enable at Launch就没有意义了,反正最小化的时候后台都得关闭。而且Minimize on Toggle关闭也没有意义了,解释起来实在费劲,你们懂的~~~这个选项需要关闭的唯一一种使用方式就是配合Enable at Launch关闭,Minimize on Toggle打开。在这种情况下,程序打开的时候后台总是关闭的,然后你短按Home键正常关闭程序,长按Home键(或者你自己设置的切换手势)最小化程序到后台。如果你不是这种使用方式,那么这一项应该一直保持打开。

  最后说说状态显示。因为我自己的全局后台模式是原生后台,所以我菊花(Badge)显示是关闭的,如果打开的话,会看到满屏的菊花,相当蛋疼。所以菊花显示只适合于全局后台模式是退出的那些同学。图标的作用是在程序运行的时候可以知道当前的后台模式,如果你打开了Minimize on Toggle,用两种不同的方法关闭程序,那么图标可以关闭。我自己的习惯是关闭Minimize on Toggle,现在程序运行的时候就设置好后台模式,然后按Home退出,这样的话就最好打开图标。

  针对单独程序的覆盖设置和全局设置相同。如果你全局设置里面的后台模式是原生模式的话,覆盖设置里面缺省的电话、短信等那四项可以全部删除。
课后答疑时间:

1、下载?
Cydia首页->Featured->往下翻到Free Extensions

2、怎样的设置最好?
无所谓好坏,看你自己的使用习惯。截图中是我自己的设置,是比较保守的设置,只有真正需要后台的程序才打开真后台。iPhone不是台式机,资源比你想象的有限得多,之所以你觉得速度很快不比台式机差,电池还比别的手机强,那正是因为iOS杰出的设计。那些觉得iOS4的多任务是垃圾乔布斯是棒槌的人,他们自己才是棒槌~~~设置Backgrounder的时候还是应该尽量多利用OS本身的优点,尽量少改动系统本身的设置。

3、让你说糊涂了,照你的说法更本没安装的必要啊!
这个正是我想劝说大家的。我们使用大电脑使用Windows习惯了,已经感觉不到多任务的存在了,所以现在的孩子很少有仔细思考我们为什么需要多任务这个问题了。显然,苹果的天才们是相当清楚这个问题的,所以他们才会在iOS4中加入这样精巧的多任务系统。当然这个多任务系统不完美,我们接受不了,因为不能挂QQ,所以我们才要装Backgrounder。

4、发现一个问题,QQ能后台运行2个小时左右,然后就掉线。如何解决?设置完全是按照教程来的
这位大哥这问题我是真不知道,我开着VPN过几个钟头还会自己断掉呢,我也不知道是为啥呢。只是这位大哥的问题让我想起有个很重要的事情我忘了说,那就是真后台的程序使用的内存也会被挤占掉!比如你把QQ真后台了,然后再运行个几百M的大游戏,或者多开几个网页,再回头点开qq,你会发现qq界面出现一下,然后瞬间消失~~~这个问题在Backgrounder的FAQ里面有讲,这不是Backgrounder的bug,只是因为Backgrounder不是苹果自带的,不是原生的,所以iOS4不会对它另眼相看不会保证它的安全!也就是说,对于iOS4来说,任何在后台的程序都是不安全的!不管是原生后台还是真后台!如果你在打游戏的时候听见qq响,切换过去瞬间消失了,那你就是看不到那条消息了,没有办法!

5、如果只为QQ这样的设置真后台,那和设置推送的作用是不是就一样了,那推送和真后台对于耗电等又有多大区别呢?

关于推送,我了解得还不够清楚,只能大致说说,说得不对请各路神仙大侠表打脸~~~等我了解得更多了我会更新的。

  推送跟音乐,voip,gps定位等等一样,是iOS提供给应用程序的7个多任务接口之一。这些接口都是操作系统提供的功能,意思是说如果应用程序有后台运行这些功能的要求,可以通过调用接口要求系统运行,但是这些功能都是在应用程序的要求下,操作系统本身完成的,而不是应用程序自己在后台运行的,应用程序还是只有暂停的份儿。这就决定了qq消息推送必然比真后台qq省电,因为接收消息只是整个qq要干的那些乱七八糟的事情中的很小一部分,当然,iOS的qq已经比Windows的qq精简很多了,但是真后台的话至少它还会在后台刷新聊天窗口吧,还得维护好友列表吧,这些都是要烧电的。另外qq的代码质量显然不能跟iOS比,多烧电是必然的。

  不过正因为推送是iOS提供的,跟qq没有关系,所以造成的尴尬是你收到推送消息了,然后去打开qq,就发现并没有刚才推送的消息,还得等qq自己接收到了刚才的离线消息才会显示出来,这很清楚地说明,刚才推送的消息是系统接收的,不是qq接收的,qq根本就不知道。这一点个人认为是推送的一个很严重很关键的问题。乔布斯还是应该想个办法让推送消息和应用程序本身无缝结合起来。

真正的流水灯(渐暗渐明,脉宽变化)

Written By: dch1 - Nov• 28•10

(1)第1,3,5,7个灯半亮,其余的全亮。
(2)第1个亮1/8,第2个亮2/8,第3个亮3/8,第4个亮4/8,第5个亮5/8,第6个亮6/8,第7个亮7/8,第8个全亮。
(3)来点小难的,所有的灯逐渐从暗到全亮,再由全亮到暗。
(4)最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯。
思路:
(1)第1,3,5,7个灯半亮,其余的全亮。
把显示时间分成2个时间段,半亮的灯只在一个时间段内点亮,另一个时间段关闭
(2)第1个亮1/8,第2个亮2/8,第3个亮3/8,第4个亮4/8,第5个亮5/8,第6个亮6/8,第7个亮7/8,第8个全亮。
和第一个类似,只是分成了8个时间段(多分点也无所谓),当然8个时间段加起来的时间最好小于20MS(满足刷新率大于50HZ)
(3)来点小难的,所有的灯逐渐从暗到全亮,再由全亮到暗。
这个可以按照第二个例子来延伸一下,分成8个时间段,如果要明显一点可以多分几个时间段,所有灯同时工作就相当于一个LED一样。
(4)最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯。
#include <reg52.h>
typedef unsigned char uchar;
#define Ton 40
#define LED P1
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;

unsigned char Maikuan=0;
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar Occupy_led; //占空比越大,灯越亮
bit light;
uchar m;

void Inittime()
{
TMOD = 0x02; //定时器0,工作方式2,自动重装
TH0 = 256-Ton;
TL0 = 256-Ton;
ET0 = 1;
EA = 1;
TR0 = 1;
}
//定时器0中断
void time0() interrupt 1 using 0
{
Maikuan++;
}

void main()
{
unsigned char i = 0,j = 0; //初始化i,j
Inittime();
while (1)
{
//第1,3,5,7个灯半亮,其余的全亮。
for(i=254; i>0; i–)
{
while ( Maikuan!=20)
{
LED = 0x00;
}

while ( Maikuan!=200)
{
LED = 0x55;
}

Maikuan = 0;
}

//最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。

for(j = 0;j<=7;j++)
{
i = 0;
while(i!=255) // 由暗变亮
{
if( Maikuan == 0) // 点亮
{
LED = ledon[j];
}
if(Maikuan == i) // 熄灭
{
LED = 0xff;
}
if( Maikuan== 255)
{
i++;
}
}
}

for(j=7;j>=0;j–)
{
i = 0;
while(i!=255) // 由亮变暗
{
if(Maikuan == 0) // 熄灭
{
LED = 0xff;
}
if( Maikuan == i) // 点亮
{
LED = ledon[j];
}
if( Maikuan == 255)
{
i++;
}
}
}

//所有的灯逐渐从暗到全亮,再由全亮到暗。

for (m=254; m>0; m–)
{
while (Maikuan!=Occupy_led)
{
LED = 0x00;
}

while (Maikuan!=127)
{
LED = 0xff;
}

Maikuan = 0;

if (light)
{
Occupy_led++;
}
else
{
Occupy_led–;
}

if (Occupy_led==128)
{
Occupy_led = 127;
light = !light;
}
if (Occupy_led>128)
{
Occupy_led = 0;
light = !light;
}
}
}
}