找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机如何实现一个按键控制三个led灯,我的程序有问题

[复制链接]
跳转到指定楼层
楼主
ID:541458 发表于 2019-5-18 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求是按下按键 第一个亮 再按一下第二个亮第一个灭  第三下第三个亮第二个灭  我做的  存在问题 求助大神

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. sbit key=P0^1;
  4. sbit r=P3^0;
  5. sbit g=P3^1;
  6. sbit b=P3^2;
  7. char state;
  8. void delay_1ms(uint t)
  9. {
  10.   uint i;
  11.         while(--t)
  12.           for(i=0;i<600;i++);
  13. }
  14. void main()
  15. {
  16.   key=1;
  17.         r=1;
  18.         g=1;
  19.         b=1;
  20.         state=0;
  21.         while(1)
  22.         {
  23.           if(key==0)
  24.                 {
  25.                   delay_1ms(20);
  26.                         if(key==0&state==0)r=~r;
  27.                 }
  28.                 if(key!=0)state=1;
  29.                 if(key==0)
  30.                 {
  31.                   delay_1ms(20);
  32.                   if(key==0&state==1)
  33.                   {
  34.                           r=~r;
  35.                           g=~g;
  36.                   }
  37.                 }
  38.                 if(key!=0)state=2;
  39.                 if(key==0)
  40.                 {
  41.                   delay_1ms(20);
  42.                   if(key==0&state==2)
  43.                   {
  44.                           g=~g;
  45.                           b=~b;
  46.                   }
  47.                 }
  48.                 if(key!=0)state=0;
  49.         }
  50. }
复制代码


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

使用道具 举报

沙发
ID:21069 发表于 2019-5-18 22:24 | 只看该作者
程式如下: if(SW==1)    led1=1, led2=0, led2=0:
                if(SW==2)    led1=0, led2=1, led2=0:
                if(SW==3)    led1=0, led2=0, led2=1:
如此下去....................
回复

使用道具 举报

板凳
ID:512205 发表于 2019-5-18 22:34 | 只看该作者
做按键次数标记再执行吧 ,我的方法是用switch ,不知大家有没更好方法.下面是我做的一个项目的按键选择部分,你可参考一下.case 0 1 2 3 就是按键次数执行不同的语句而已!

/*************************************************************/
//2úÆ·Ñ¡Ôñ
void pro_scan_key()
{

   if(K_CPXZ==0 && QD_BJ==1 && GZ_ID==0) //éèÖÃÄ£ê½óDD§
         {                 
delay(20);
if(K_CPXZ==0 && QD_BJ==1 )
         while(!K_CPXZ);        //êÇ·ñËé¿a
                {  
                                 CP_ID++;
                                if(CP_ID>=4)
                                        CP_ID=0;
                                At24c02Write(10,CP_ID);   //ÔúμØÖ·100ÄúD′èëêy¾YCP_ID
                                delay(20);
                                GXYS_SJ=1;GXYS_BJ=1;                //×Ô¶¨1¤DòÑóê±ê±¼ä¼°¿aê¼¼Æê±

                               
                }
         }


   switch(CP_ID)      //SHU4ÎaÖ÷Öáμç»ú×aËù SHU1Îa»úí·μç»ú SHU2Îa±èày
                {
                        case 0:{ SHU1=8; SHU2=1; ZJSD=8; SHU4=90; ZJSJ=150; }; break;
                        case 1:{ SHU1=20; SHU2=1; ZJSD=60;SHU4=90;ZJSJ=150;};break;
                        case 2:{ SHU1=50; SHU2=5; ZJSD=40;SHU4=90;ZJSJ=99;};break;
                        case 3:{ SHU1=90; SHU2=10; ZJSD=90;SHU4=90;ZJSJ=9;};break;
          }
}
回复

使用道具 举报

地板
ID:541458 发表于 2019-5-18 22:40 来自手机 | 只看该作者
求助在线大神啊
回复

使用道具 举报

5#
ID:213173 发表于 2019-5-18 22:46 | 只看该作者
楼主这样写会乱套,需要有按键松手检测。给你改了,你试试。
注:P0端口用于按键需要外接10K上拉电阻
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. sbit key=P0^1;
  4. sbit r=P3^0;
  5. sbit g=P3^1;
  6. sbit b=P3^2;
  7. unsigned char state;
  8. void delay_1ms(uint t)
  9. {
  10.         uint i;
  11.         while(--t)
  12.                 for(i=0;i<600;i++);
  13. }
  14. void main()
  15. {
  16.         key=1;
  17.         r=1;
  18.         g=1;
  19.         b=1;
  20.         state=0;
  21.         while(1)
  22.         {
  23.                 if(key==0)
  24.                 {
  25.                         delay_1ms(20);
  26.                         if(key==0)
  27.                         {
  28.                                 state++;
  29.                                 if(state==1)
  30.                                 {
  31.                                         r=~r;
  32.                                 }
  33.                                 if(state==2)
  34.                                 {
  35.                                         r=~r;
  36.                                         g=~g;
  37.                                 }
  38.                                 if(state==3)
  39.                                 {
  40.                                         g=~g;
  41.                                         b=~b;
  42.                                 }
  43.                                 if(state>=4)
  44.                                 {
  45.                                         state=0;
  46.                                         r=g=b=1;
  47.                                 }
  48.                                 while(!key);//等待松手
  49.                         }
  50.                 }
  51.         }
  52. }
复制代码
回复

使用道具 举报

6#
ID:541189 发表于 2019-5-18 22:58 来自手机 | 只看该作者
感觉if(key==0&state==2)里面key==0不要,应该就可以了。你的程序很难读,我也是小白
回复

使用道具 举报

7#
ID:93224 发表于 2019-5-18 23:01 | 只看该作者
if(key==0&state==0)这句话语法错误
回复

使用道具 举报

8#
ID:541458 发表于 2019-5-19 19:18 | 只看该作者
jinsheng7533967 发表于 2019-5-18 22:24
程式如下: if(SW==1)    led1=1, led2=0, led2=0:
                if(SW==2)    led1=0, led2=1, l ...

这种可以 但简单了写 老师让我们让我们加个变值
回复

使用道具 举报

9#
ID:541458 发表于 2019-5-19 19:37 | 只看该作者
wulin 发表于 2019-5-18 22:46
楼主这样写会乱套,需要有按键松手检测。给你改了,你试试。
注:P0端口用于按键需要外接10K上拉电阻

大体可以 不过要实现第三个灯亮后 再按是第一个灯亮 依次循环应怎么修改
回复

使用道具 举报

10#
ID:541458 发表于 2019-5-19 19:44 | 只看该作者
QZQ1973 发表于 2019-5-18 22:34
做按键次数标记再执行吧 ,我的方法是用switch ,不知大家有没更好方法.下面是我做的一个项目的按键选择部 ...

还是小白 消化不了大神的程序
回复

使用道具 举报

11#
ID:541458 发表于 2019-5-19 19:46 | 只看该作者
lele5211314 发表于 2019-5-18 23:01
if(key==0&state==0)这句话语法错误

语法应该没问题  keil5ok的  但仿真不行 会乱套
回复

使用道具 举报

12#
ID:805286 发表于 2020-7-18 23:20 | 只看该作者
wulin 发表于 2019-5-18 22:46
楼主这样写会乱套,需要有按键松手检测。给你改了,你试试。
注:P0端口用于按键需要外接10K上拉电阻

下载了运行,完美
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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