找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14866|回复: 17
打印 上一主题 下一主题
收起左侧

4个独立按键控制4个LED亮灭

[复制链接]
跳转到指定楼层
楼主
ID:17109 发表于 2017-11-16 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stc15w408as,   4只按键到的LED就亮、各位师傅请帮小弟看看程序、要在同一个按键关LED  还须增加什么语句能实现关LED灯劳烦大家谢谢


4个LED亮灭程序实测视频




kay1按下.LED1亮.
kay2按下.LED2亮.LED1灭
kay3按下.LED3亮.LED2灭
kay4按下.LED4亮.LED3灭

修改在每只键 上停留时按第二次能关led灯可以吗


#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit key1=P3^6;                //按键1定义
sbit key2=P3^5;                //按键2定义
sbit key3=P3^4;                //按键3定义
sbit key4=P3^3;                //按键4定义
sbit led1=P1^3;                //led1端口
sbit led2=P1^2;                //led2端口
sbit led3=P1^1;                //led3端口
sbit led4=P1^0;                //led4端口

/********按键扫描程序*************/
void key_scan()
{
        static bit key1_sign,key2_sign,key3_sign,key4_sign;//静态位变量按键自锁标志
        static uint count1,count2,count3,count4;//静态计数变量                        

        if(key1==0)                                                        //检测按键1按下
        {
                if(key1_sign==0)
                {
                        count1++;                                        //消抖计数1自+1
                        if(count1>=1000)                        //按主循环周期100~2000调整
                        {
                                key1_sign=1;                        //按键1自锁标志置1
                                led1=0;led2=led3=led4=1;                         //led1取反                        
                        }
                }
        }
        else                                                                //按键1抬起
        {
                key1_sign=0;                                         //按键1自锁标志清0
                count1=0;                                                //消抖计数1清0
        }

        if(key2==0)        //检测按键1按下
        {
                if(key2_sign==0)
                {
                        count2++;                                        //消抖计数2自+1
                        if(count2>=1000)                        //按主循环周期100~2000调整
                        {
                                key2_sign=1;                        //按键2自锁标志置1
                                led2=0;led1=led3=led4=1;                         //led2取反                        
                        }
                }
        }
        else                                                                //按键2抬起
        {
                key2_sign=0;                                        //按键2自锁标志清0
                count2=0;                                                //消抖计数2清0
        }

        if(key3==0)                                                        //检测按键1按下
        {
                if(key3_sign==0)
                {
                        count3++;                                        //消抖计数1自+1
                        if(count3>=1000)                        //按主循环周期100~2000调整
                        {
                                key3_sign=1;                        //按键3自锁标志置1
                                led3=0;led1=led2=led4=1;                         //led3取反                        
                        }
                }
        }
        else                                                                //按键3抬起
        {
                key3_sign=0;                                        //按键3自锁标志清0
                count3=0;                                                //消抖计数3清0
        }

        if(key4==0)                                                        //检测按键1按下
        {
                if(key4_sign==0)
                {
                        count4++;                                        //消抖计数4自+1
                        if(count4>=1000)                        //按主循环周期100~2000调整
                        {
                                key4_sign=1;                        //按键4自锁标志置1
                                led4=0;led1=led2=led3=1;                         //led4取反                        
                        }
                }
        }
        else                                                                //按键4抬起
        {
                key4_sign=0;                                        //按键4自锁标志清0
                count4=0;                                                //消抖计数4清0
        }
}
/************主程序************/
void main()
{
        while(1)
        {
                key_scan();                                                //按键扫描程序
        }
}






4个独立按键控制4个led.zip

20.71 KB, 下载次数: 81

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-11-16 18:35 | 只看该作者
本帖最后由 zl2168 于 2017-11-16 18:36 编辑

实例5  4种不同方式键控信号灯
Proteus仿真一下,确认有效。
实例5 不同方式键控灯.rar (31.72 KB, 下载次数: 39)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1.书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

板凳
ID:17109 发表于 2017-11-19 22:51 | 只看该作者
上面这个程序能按一键亮一个灯 但是没有关灯,    就是想在4只键上加入一个关灯语句  ,就是在按键按第二次关led灯须要什样修改才可以
回复

使用道具 举报

地板
ID:247666 发表于 2017-11-20 18:36 | 只看该作者
led=!led试试
回复

使用道具 举报

5#
ID:251605 发表于 2017-11-20 20:37 | 只看该作者
其实你这样也并不好给每个按键定义一个变量,相当于它的键值,比如key1对应于P1.1口,灯在P.1,sbit P13=P1^3; sbit P21=P2^1; key1=0;if(P13==0){key1=!key1P21=key1;}
回复

使用道具 举报

6#
ID:17109 发表于 2017-11-21 11:03 | 只看该作者
51dianzihy 发表于 2017-11-20 20:37
其实你这样也并不好给每个按键定义一个变量,相当于它的键值,比如key1对应于P1.1口,灯在P.1,sbit P13=P1 ...

保持这个程序的功能、在四只按键、按第二下能关LED
灯楼主懂修改吗帮小弟看看谢谢
回复

使用道具 举报

7#
ID:251930 发表于 2017-11-21 16:09 | 只看该作者
第一次按下,小灯点亮,松手后灯依旧亮,然后等第二次按下的时候,小灯才灭对吧,
第一次按键松开后,小灯状态不变,而后再加入一个if(按键再次按下),小灯再取反
回复

使用道具 举报

8#
ID:17109 发表于 2017-11-21 19:04 | 只看该作者
芥末酱 发表于 2017-11-21 16:09
第一次按下,小灯点亮,松手后灯依旧亮,然后等第二次按下的时候,小灯才灭对吧,
第一次按键松开后,小灯 ...

楼主你好   能修改后上传程序看看好吗   谢谢
回复

使用道具 举报

9#
ID:231632 发表于 2017-11-22 00:16 | 只看该作者
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit key1=P3^6;                //按键1定义
sbit key2=P3^5;                //按键2定义
sbit key3=P3^4;                //按键3定义
sbit key4=P3^3;                //按键4定义
sbit led1=P1^3;                //led1端口
sbit led2=P1^2;                //led2端口
sbit led3=P1^1;                //led3端口
sbit led4=P1^0;                //led4端口

/********按键扫描程序*************/
void key_scan()
{
        static bit key1_sign,key2_sign,key3_sign,key4_sign;//静态位变量按键自锁标志
        static uint count1,count2,count3,count4;//静态计数变量  
                uint bzw1=1,bzw2=1,bzw3=1,bzw4=1;//设置标志位。                     

        if(key1==0)                                                        //检测按键1按下
        {
                if(key1_sign==0)
                {
                        count1++;                                        //消抖计数1自+1
                        if(count1>=1000)                        //按主循环周期100~2000调整
                        {
                                key1_sign=1;                                           //按键1自锁标志置1
                                                                if(bzw1==1)                       
                                        led1=0;led2=led3=led4=1;                         //led1取反  
                                                                else
                                                                        led1=led2=led3=led4=1;                              
                        }
                }
                                bzw1++;
                                if(bzw1>3)
                                        bzw1=1;

        }
        else                                                                //按键1抬起
        {
                key1_sign=0;                                         //按键1自锁标志清0
                count1=0;                                                //消抖计数1清0
        }

        if(key2==0)        //检测按键1按下
        {
                if(key2_sign==0)
                {
                        count2++;                                        //消抖计数2自+1
                        if(count2>=1000)                        //按主循环周期100~2000调整
                        {
                                key2_sign=1;                        //按键2自锁标志置1
                                                                if(bzw2==1)
                                        led2=0;led1=led3=led4=1;                         //led2取反  
                                                                else
                                                                        led1=led2=led3=led4=1;                              
                        }
                }
                                bzw2++;
                                if(bzw2>3)
                                        bzw2=1;
        }
        else                                                                //按键2抬起
        {
                key2_sign=0;                                        //按键2自锁标志清0
                count2=0;                                                //消抖计数2清0
        }

        if(key3==0)                                                        //检测按键1按下
        {
                if(key3_sign==0)
                {
                        count3++;                                        //消抖计数1自+1
                        if(count3>=1000)                        //按主循环周期100~2000调整
                        {
                                key3_sign=1;                        //按键3自锁标志置1
                                                                if(bzw3==1)
                                        led3=0;led1=led2=led4=1;                         //led3取反
                                                                else
                                                                        led1=led2=led3=led4=1;                       
                        }
                }
                                bzw3++;
                                if(bzw3>3)
                                        bzw3=1;
        }
        else                                                                //按键3抬起
        {
                key3_sign=0;                                        //按键3自锁标志清0
                count3=0;                                                //消抖计数3清0
        }

        if(key4==0)                                                        //检测按键1按下
        {
                if(key4_sign==0)
                {
                        count4++;                                        //消抖计数4自+1
                        if(count4>=1000)                        //按主循环周期100~2000调整
                        {
                                key4_sign=1;                        //按键4自锁标志置1
                                                                if(bzw4==1)
                                               led4=0;led1=led2=led3=1;                         //led4取反
                                                                else
                                                                        led1=led2=led3=led4=1;                       
                        }                  
                }
                                bzw4++;
                                if(bzw4>3)
                                        bzw4=1;
        }
        else                                                                //按键4抬起
        {
                key4_sign=0;                                        //按键4自锁标志清0
                count4=0;                                                //消抖计数4清0
        }
}
/************主程序************/
void main()
{
        while(1)
        {
                key_scan();                                                //按键扫描程序
        }
}
这是修改的,
回复

使用道具 举报

10#
ID:231046 发表于 2017-11-22 08:14 | 只看该作者
i et 不用这第复杂吧,直接用switch 语句行了
回复

使用道具 举报

11#
ID:17109 发表于 2017-11-22 10:12 | 只看该作者
david888 发表于 2017-11-22 08:14
i et 不用这第复杂吧,直接用switch 语句行了

师博你好  什样修改能简化程序  直接用switch 语句行   
能修改后上传程序看看好吗   谢谢
回复

使用道具 举报

12#
ID:17109 发表于 2017-11-22 10:43 | 只看该作者
ljn123123 发表于 2017-11-22 00:16
#include
#define uchar unsigned char
#define uint  unsigned int

楼主你好   你修改   的程序   用Keil uVision4软件能通过吗      小弟试过不能通过
回复

使用道具 举报

13#
ID:231046 发表于 2017-11-22 13:59 | 只看该作者
可先初始化所有LED关,然后判断是那个按键,点亮相应的灯就行,在WHILE 里
回复

使用道具 举报

14#
ID:231046 发表于 2017-11-22 14:07 | 只看该作者
按那个就那个亮,其它的关了,这样就能用了
回复

使用道具 举报

15#
ID:17109 发表于 2017-11-22 15:25 | 只看该作者
david888 发表于 2017-11-22 14:07
按那个就那个亮,其它的关了,这样就能用了

师博你好      能修改后上传程序看看好吗   谢谢
回复

使用道具 举报

16#
ID:252387 发表于 2017-11-22 19:26 | 只看该作者
我只硬件模拟,没有真的做过硬件
回复

使用道具 举报

17#
ID:17109 发表于 2017-11-22 22:55 来自手机 | 只看该作者
david888 发表于 2017-11-22 13:59
可先初始化所有LED关,然后判断是那个按键,点亮相应的灯就行,在WHILE 里

楼主小弟初学可以修改后上传吗?谢谢
回复

使用道具 举报

18#
ID:111634 发表于 2017-11-23 11:15 | 只看该作者
ll13536121668 发表于 2017-11-19 22:51
上面这个程序能按一键亮一个灯 但是没有关灯,    就是想在4只键上加入一个关灯语句  ,就是在按键按第二次 ...

S3按第一次亮,按第二次暗,不是吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表