标题: 4个独立按键控制4个LED亮灭 [打印本页]
作者: ll13536121668 时间: 2017-11-16 16:25
标题: 4个独立按键控制4个LED亮灭
stc15w408as, 4只按键、按到的LED就亮、各位师傅请帮小弟看看程序、要在同一个按键关LED 还须增加什么语句能实现关LED灯劳烦大家谢谢
4个LED亮灭程序实测视频
http://v.youku.com/v_show/id_XMzEzNjM3ODgwOA==.html
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
作者: zl2168 时间: 2017-11-16 18:35
本帖最后由 zl2168 于 2017-11-16 18:36 编辑
实例5 4种不同方式键控信号灯
先Proteus仿真一下,确认有效。
实例5 不同方式键控灯.rar
(31.72 KB, 下载次数: 39)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1.书中电路和程序设计有详细说明,程序语句条条有注解。
作者: ll13536121668 时间: 2017-11-19 22:51
上面这个程序能按一键亮一个灯 但是没有关灯, 就是想在4只键上加入一个关灯语句 ,就是在按键按第二次关led灯须要什样修改才可以
作者: Mr丶Right 时间: 2017-11-20 18:36
led=!led试试
作者: 51dianzihy 时间: 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;}
作者: ll13536121668 时间: 2017-11-21 11:03
保持这个程序的功能、在四只按键、按第二下能关LED
灯楼主懂修改吗帮小弟看看谢谢
作者: 芥末酱 时间: 2017-11-21 16:09
第一次按下,小灯点亮,松手后灯依旧亮,然后等第二次按下的时候,小灯才灭对吧,
第一次按键松开后,小灯状态不变,而后再加入一个if(按键再次按下),小灯再取反
作者: ll13536121668 时间: 2017-11-21 19:04
楼主你好 能修改后上传程序看看好吗 谢谢
作者: ljn123123 时间: 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(); //按键扫描程序
}
}
这是修改的,
作者: david888 时间: 2017-11-22 08:14
i et 不用这第复杂吧,直接用switch 语句行了
作者: ll13536121668 时间: 2017-11-22 10:12
师博你好 什样修改能简化程序 直接用switch 语句行
能修改后上传程序看看好吗 谢谢
作者: ll13536121668 时间: 2017-11-22 10:43
楼主你好 你修改 的程序 用Keil uVision4软件能通过吗 小弟试过不能通过
作者: david888 时间: 2017-11-22 13:59
可先初始化所有LED关,然后判断是那个按键,点亮相应的灯就行,在WHILE 里
作者: david888 时间: 2017-11-22 14:07
按那个就那个亮,其它的关了,这样就能用了
作者: ll13536121668 时间: 2017-11-22 15:25
师博你好 能修改后上传程序看看好吗 谢谢
作者: 1551125514 时间: 2017-11-22 19:26
我只硬件模拟,没有真的做过硬件
作者: ll13536121668 时间: 2017-11-22 22:55
david888 发表于 2017-11-22 13:59
可先初始化所有LED关,然后判断是那个按键,点亮相应的灯就行,在WHILE 里
楼主小弟初学可以修改后上传吗?谢谢
作者: zl2168 时间: 2017-11-23 11:15
S3按第一次亮,按第二次暗,不是吗?
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |