微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一道简单的单片机编程

一道简单的单片机编程

时间:10-02 整理:3721RD 点击:
题目如下,用两个按键控制流水灯,按键1按下时流水灯左右流水(延时3s),按键2按下时流水灯不停闪烁(间隔3s)。我想到的程序大概是这样,
switch(key)   case(key1):while(1)  { led=_crol_(led,1);  delay(3s);  if(key2);  break; };   case( key2 ):while(1):{led=0xff;  delay(3s); led=~led;  delay(3s); if (key1); break; }......
当然程序这么写是不行的,我的问题主要是不用while(1)吧,不能实现循环,用了吧不能检测及时退出,因为有延时函数,按下另一个键的时候经常检测不到。请问大家这个程序正确的思路应该怎么编写啊?大家给个思路就好,我想应该很简单吧这个程序。

在中断里查询按键,

你好,谢谢你的指点,请问如果我用中断查询按键2,一旦按键2被按下即转入中断执行led闪烁的语句,但是要led不停闪烁也需要while(1)语句,此时再按下按键1并不能被检测到呢。

中断嵌套,你看怎么样

中断不是有优先级之分吗?用了之后好像两个按键总有一个按键不能响应啊?

给他个标志位就行了的,      按下对应键的时候就对应给他一个标志位,然后再在标志位的函数里面处理LED的闪烁问题就行咧,你试下呗

“中断不是有优先级之分吗?用了之后好像两个按键总有一个按键不能响应啊?”
首先,中断肯定是有优先之分的,这个要理清。
然后,你按键那里加了while循环肯定就跳不出了。

switch(key)   case(key1):while(key2!=0)  { led=_crol_(led,1);  }   case( key2 ):while(key1!=0):{led=0xff;  delay(3s); led=~led;   },刚想到的,类似于互锁。

看看~~~~~~~~~~~~~~~

小编多看看程序,别人怎么显得,慢慢就找到感觉了,其实就那么些东西,肯下功夫就能学在手

写程序要讲究程序框架。比如按键事件和动作内容,可以将其分开,通过变量或标志来进行两者间的信号传递。尽量避免死循环条件!类似这样:
void main()
{
Init();//程序初始化部分
while(1)
{
//按键扫描和按键事件处理部分
   switch(KeyScan())
  {
    case KEYA: Run_Mode=WATERLIGHT;break;
    case KEYB:Run_Mode=FLASHLIGHT;break;
  }
//主功能实现部分
   switch(Run_Mode)
   {
    case  WATERLIGHT:WaterRun();breakl;
   case FLASHLIGHT:FlashRun();break;
   }
}
}

while(1)
{
switch(key)   case(key1):
                         case(key2):
}

你可以看看 吴坚鸿 的程序,他的按键处理写的挺好的,http://bbs.elecfans.com/forum.ph ... 9&highlight=c51

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top