找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C语言程序case跑到8之后按键就跳不出去了?

[复制链接]
跳转到指定楼层
楼主
ID:899076 发表于 2022-6-7 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
麻烦各位大佬帮忙看下哪里有问题,LED的呼吸子程序不能用按键切换

单片机C语言源程序如下:
#include <reg52.h>

unsigned int mode;

void DelayXms(unsigned int xms);
void Delayus(int us);
void LED_R();
void LED_G();
void LED();

sbit key=P3^4;

void main()                          //主程序
{
        while(1)
        {
                LED();
                if(!key)
                {
                        DelayXms(50);
                        if(!key)
                        {               
                                mode++;
                                if(mode>=10)                                
                                mode=0;                                
                        }  while(!key);
                }
        }
}

void DelayXms(unsigned int xms)                 //延迟函数
{
        unsigned i,j;
        for(i=xms;i>0;i--)
        {
                for(j=124;j>0;j--);
        }        
}

void Delayus(int us)                //10us
{
        unsigned char i;
        while(us)
        {
                i = 2;
                while (--i);
                us--;
        }
}

void LED_R()                         //LED呼吸
{
        int i;
        
        for(i=1;i<300;i++)//由暗变亮
        {
                P1=0x00;
                Delayus(i);
                P1=0x01;
                Delayus(300-i);
        }
        for(i=1;i<300;i++)//由亮变暗
        {
                P1=0x01;
                Delayus(i);
                P1=0x00;
                Delayus(300-i);
        }        
}

void LED_G()                                //LED呼吸
{
        int i;
        
        for(i=1;i<300;i++)//由暗变亮
        {
                P1=0x00;
                Delayus(i);
                P1=0x02;
                Delayus(300-i);
        }
        for(i=1;i<300;i++)//由亮变暗
        {
                P1=0x02;
                Delayus(i);
                P1=0x00;
                Delayus(300-i);
        }        
}

void LED()
{
        switch(mode)
        {
                case 0:P1 = 0x00;break;          //上电默认所有的LED都不亮
                case 1:P1 = 0x01;break;          //按键按下,第一个LED亮
                case 2:P1 = 0x02;break;          //按键按下,第二个LED亮
                case 3:P1 = 0x04;break;          //按键按下,第三个LED亮
                case 4:P1 = 0x05;break;          //按键按下,第一第三个LED亮
                case 5:P1 = 0x03;break;          //按键按下,第一第二个LED亮
                case 6:P1 = 0x06;break;          //按键按下,第二第三个LED亮
                case 7:P1 = 0x07;break;          //按键按下,LED全亮
                case 8:LED_R();break;
                case 9:LED_G();break;
                default: break;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:899076 发表于 2022-6-7 18:05 | 只看该作者
前面的case 0 - case 7 都能正常,但是到了case 8 之后就不行了。按键按好多次才能跳出去。就是呼吸灯的子程序都不能用按键切换模式
回复

使用道具 举报

板凳
ID:329625 发表于 2022-6-7 22:04 | 只看该作者
当达到最后一次的时候,如果程序在执行当前程序,按键无法被检测到,建议使用外部中断控制按键,会十分灵敏。
回复

使用道具 举报

地板
ID:25696 发表于 2022-6-7 23:14 | 只看该作者
void DelayXms(unsigned int xms) 函数里面定义的变量 unsigned i,j; 是错误的,正确的是unsigned int i,j;
回复

使用道具 举报

5#
ID:161164 发表于 2022-6-7 23:27 | 只看该作者
LED_R();和LED_G();的写法令mode在有按键按下时不能立刻更新
只有按着按键直到LED_R();和LED_G();运行完才能更新mode

改成这样试试
  1. void LED_R()                         //LED呼吸
  2. {
  3.         static int i=1;
  4.                 static bit swap=1;
  5.         if(swap)
  6.         {
  7.                 P1=0x00;//由暗变亮
  8.                 Delayus(i);
  9.                 P1=0x01;
  10.                 Delayus(300-i);
  11.         }else
  12.         {
  13.                 P1=0x01;//由亮变暗
  14.                 Delayus(i);
  15.                 P1=0x00;
  16.                 Delayus(300-i);
  17.         }  
  18.                 if(i++>300){
  19.                         i = 1;
  20.                         swap = !swap;
  21.                 }                       
  22. }
复制代码



回复

使用道具 举报

6#
ID:624769 发表于 2022-6-8 01:59 | 只看该作者
void Delayus(int us)                //10us
{
        unsigned char i;
        while(us)
        {
                i = 2;
                while (--i);
                us--;
             if(!key)  break;

        }
}

void LED_R()                         //LED呼吸
{
        int i;
        
        for(i=1;i<300;i++)//由暗变亮
        {
                P1=0x00;
                Delayus(i);              if(!key)  break;

                P1=0x01;
                Delayus(300-i);
              if(!key)  break;
        }
        for(i=1;i<300;i++)//由亮变暗
        {
                P1=0x01;
                Delayus(i);
             if(!key)  break;
                P1=0x00;
                Delayus(300-i);
             if(!key)  break;
        }        
}


回复

使用道具 举报

7#
ID:899076 发表于 2022-6-8 09:07 | 只看该作者
188610329 发表于 2022-6-8 01:59
void Delayus(int us)                //10us
{
        unsigned char i;

谢谢大佬指点
回复

使用道具 举报

8#
ID:899076 发表于 2022-6-8 09:07 | 只看该作者
lkc8210 发表于 2022-6-7 23:27
LED_R();和LED_G();的写法令mode在有按键按下时不能立刻更新
只有按着按键直到LED_R();和LED_G();运行完才 ...

谢谢大佬指点
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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