按键控制流水灯

2019-07-15 23:25发布

利用一个按键控制流水灯的移位C语言程序怎样写,求指导
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
德国蟑螂
1楼-- · 2019-07-16 17:27
mlongze1206 发表于 2013-7-30 10:50
楼上为什么不选择定时呢?

利用定时器怎么说?如果说利用外部中断,让按键成为脉冲触发,这个确实应该是可以的,但是我现在问题是线路固定好了,只能用单片机的P0口来完成,没想到好的触发,我现在想到的一个程序是
void main()
{ P2=0xfe;
  num=P2;
  while(1)
{
        while(P0==0xff);
         btn=P0;
         if(btn==0xfe)
         {
           num=_crol_(num,1);
           delay(300);
           P2=num;
         }
         if(btn==0xfd)
         {
                 num=_cror_(num,1);
                 delay(300);
                P2=num;
         }
  }
}

这段程序能实现效果,靠的延时,但是总感觉不好一样
德国蟑螂
2楼-- · 2019-07-16 23:23
嵌入式linux工程 发表于 2013-7-30 08:50
想问一下你的按键检测程序是不是这种模式:if(key == 0)
{
    delay_ms(20);

按键是弹性按键,按下后弹起,不分长按还是短按,楼下有我想到的一些程序,也是靠延时,能实现效果,但是感觉不咋好,这里有个更好的给你看看,我看的不清楚#include <reg51.h>#include <intrins.h>
unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit        K1 = P0^0;        //对应按钮K1
sbit        K2 = P0^1;        //对应按钮K2
main()
{
        unsigned char key_s,key_v;
        key_v = 0x03;
        P2 = 0xfe;
        while(1)
        {
                key_s = scan_key();
                if(key_s != key_v)
                {
                        delayms(10);
                        key_s = scan_key();
                        if(key_s != key_v)
                        {       
                                key_v = key_s;
                                proc_key(key_v);                                       
                        }
                }
        }       
}
unsigned char scan_key()
{
        unsigned char key_s;
        key_s = 0x00;
        key_s |= K2;
        key_s <<= 1;
        key_s |= K1;
        return key_s;               
}
void proc_key(unsigned char key_v)
{
        if((key_v & 0x01) == 0)
        {
                P2 = _cror_(P2,1);
        }
        else if((key_v & 0x02) == 0)
        {
                P2 = _crol_(P2, 1);
        }
}
void delayms(unsigned char ms)                // 延时子程序
{                                               
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

嵌入式linux工程
3楼-- · 2019-07-17 01:40
 精彩回答 2  元偷偷看……
嵌入式linux工程
4楼-- · 2019-07-17 05:31
德国蟑螂 发表于 2013-7-31 09:48
按键是弹性按键,按下后弹起,不分长按还是短按,楼下有我想到的一些程序,也是靠延时,能实现效果,但是 ...

你可以参考一下我写的程序,也可以对比一下吧。在你的程序中执行一次按键检测程序总时间有20ms左右吧,20ms中有90%的时间是空出来什么都没做的,这个时间我指的是执行这些语句所需要的时间。再看看我的程序吧,执行定时器中断中所有程序算200us左右吧,在主函数中也算200us左右吧,执行一次按键程序所需语句时间为400us左右吧,其他时间CPU自由扩展,按键一直按下对其他程序没什么影响,因为中断程序时间太短了
德国蟑螂
5楼-- · 2019-07-17 07:27
嵌入式linux工程 发表于 2013-7-31 15:44
你可以参考一下我写的程序,也可以对比一下吧。在你的程序中执行一次按键检测程序总时间有20ms左右吧,20 ...

首先非常感谢你这么认真为我回答问题,你写的很不错,但是我感觉有点繁琐点了,我主要就是用一个按键直接控制一个灯的亮灭,按键连到P0^0,LED接在P2^0,如果说用到外部中断,那就非常简答,现在不能用这个,你说的我的程序可读性不高,那应该是8楼的吧,但是9楼的程序可读性应该是很好的,你不妨看下九楼的程序。非常感谢你的回答
德国蟑螂
6楼-- · 2019-07-17 12:39
嵌入式linux工程 发表于 2013-7-31 15:44
你可以参考一下我写的程序,也可以对比一下吧。在你的程序中执行一次按键检测程序总时间有20ms左右吧,20 ...

e ,不好意思,我可能看错了点,是控制流水灯的实现,用两个开关

一周热门 更多>