找回密码
 立即注册
查看: 53|回复: 4

用开天斧做计数器,用LED通过二进制表示计数值,但是出现bug

[复制链接]
  • TA的每日心情
    郁闷
    2024-4-11 17:03
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    2

    主题

    5

    回帖

    80

    积分

    注册会员

    积分
    80
    发表于 2024-4-11 17:28:40 | 显示全部楼层 |阅读模式
    前段时间,我们用8H8K64U实验箱做了计数器的实验,回来之后我想用送的开天斧板子把这个实验再做一个拓展,但是当我敲好代码之后我发现,我的LED灯一旦亮了就灭不掉了,或者说只会亮度微微变化
    代码如下:
    #include <stc8h.h> //包含支持STC8H系列单片机的头文件
    #include <intrins.h> //I/O口初始化文件
    #include <gpio.c> //设置为准双向口
    #define uchar unsigned char
    #define uint unsigned int
    uint counter=0; //设置计数变量


    //控制P2端口
    sbit num0=P2^7;
    sbit num1=P2^6;
    sbit num2=P2^5;
    sbit num3=P2^4;
    sbit num4=P2^3;
    sbit num5=P2^2;
    sbit num6=P2^1;
    sbit num7=P2^0;


    void Timer0_init(void)
    {
        TMOD=0x0C;
        TH0=0x00;
        TL0=0x00;
        TR0=1;
    }


    //用LED灯作二进制计数显示(主要问题就出在这里)
    void number(uint i)
    {
        uint a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
        for(a=0;a<i;a++)
        {
            if(a%2==0)
            num0=0x01;  //用不同的方法控制LED,让LED点亮
            else
        num0=0x00;  //用不同的方法控制LED,让LED熄灭(失败)
            if(a%2==0&&a>0)
            {
                b+=1;  //如果到达2的倍数,控制P2.6亮或灭,否则,P2.6保持(后面以此类推)
              if(b%2==1)
              num1=0;
          else
          num1=1;   //用不同的方法控制LED,让LED熄灭(失败)
            }
            if(a%4==0&&a>0)
            {
                c+=1;
              if(c%2==1)
              num2=0;
          else
          num2=1;
            }
            if(a%8==0&&a>0)
            {
                d+=1;
              if(d%2==1)
              num3=0;
          else
          num3=1;
            }
            if(a%16==0&&a>0)
            {
                e+=1;
              if(e%2==1)
              num4=0;
          else
          num4=1;
            }
            if(a%32==0&&a>0)
            {
                f+=1;
              if(f%2==1)
              num5=0;
          else
          num5=1;
            }
            if(a%64==0&&a>0)
            {
                g+=1;
              if(g%2==1)
              num6=0;
          else
          num6=1;
            }
            if(a%128==0&&a>0)
            {
                h+=1;
              if(h%2==1)
              num7=0;
          else
          num7=1;
            }
        }
    }


    //主函数
    void main(void)
    {
        uint temp1,temp2;
        gpio();
        Timer0_init();
        while(1)
        {
            for(;;)
          {
            temp1=TL0;
            temp2=TH0;
                counter=TL0;
                number(counter);
          }
      }
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-4-11 17:03
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    2

    主题

    5

    回帖

    80

    积分

    注册会员

    积分
    80
     楼主| 发表于 2024-4-11 17:30:57 | 显示全部楼层
    后面我还试了让 num0 = !num0 ,或者P27 = !P27,同样也不行
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-4-11 17:03
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    2

    主题

    5

    回帖

    80

    积分

    注册会员

    积分
    80
     楼主| 发表于 2024-4-11 22:04:16 | 显示全部楼层
    我今天试着改进了一下代码,虽然可以灭了但是好像逻辑不太对,出来的结果不是想要的

    #include <stc8h.h>    //包含支持STC8H系列单片机的头文件
    #include <intrins.h>  //I/O口初始化文件
    #include <gpio.c>     //设置为准双向口
    #define uchar unsigned char
    #define uint unsigned int
    uint counter=0;       //设置计数变量
    uchar a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
    sbit num0=P2^7;
    sbit num1=P2^6;
    sbit num2=P2^5;
    sbit num3=P2^4;
    sbit num4=P2^3;
    sbit num5=P2^2;
    sbit num6=P2^1;
    sbit num7=P2^0;

    void Timer0_init(void)
    {
            TMOD=0x0C;
            TH0=0x00;
            TL0=0x00;
            TR0=1;
    }


    void main(void)
    {
            uint temp1,temp2;
            gpio();
            Timer0_init();
            while(1)
            {
                    for(;;)
              {
    ////////////////////////////////////////////////////////////////
    //控制P2端口
                      if(counter%2==0) num0=1;   //如果用num0 = !num0,那么这个灯就只能亮,不会灭
                      else             num0=0;
                            if(counter%2 == 0 && counter > 0)
                                    {
                                             b+=1;  //如果到达2的倍数,控制P2.6亮或灭,否则,P2.6保持(后面以此类推)
                                             if(b%2==1)
                                             num1 = 0;
                                             else
                                             num1=1;
                                    }

                            if(counter%4 ==0 && counter > 0)
                                    {
                                            c+=1;
                                            if(c%2==1)
                                            num2=0;
                                            else
                                            num2=1;
                                    }
                            if(counter%8 == 0 && counter > 0)
                                    {
                                            d+=1;
                                            if(d%2==1)
                                            num3=0;
                                            else
                                            num3=1;
                                    }
                            if(counter%16 == 0 && counter > 0)
                                    {
                                            e+=1;
                                            if(e%2==1)
                                            num4=0;
                                            else
                                            num4=1;
                                    }
                            if(counter%32 == 0 && counter > 0)
                                    {
                                            f+=1;
                                            if(f%2==1)
                                            num5=0;
                                            else
                                            num5=1;
                                    }
                            if(counter%64 == 0 && counter > 0)
                                    {
                                            g+=1;
                                            if(g%2==1)
                                            num6=0;
                                            else
                                            num6=1;
                                    }
                            if(counter%128 == 0 && counter > 0)
                                    {
                                            h+=1;
                                            if(h%2==1)
                                            num7=0;
                                            else
                                            num7=1;
                                    }
    ////////////////////////////////////////////////////////////////
                            temp1=TL0;
                            temp2=TH0;
          counter=TL0;
                    }
            }
    }

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 02:02
  • 签到天数: 68 天

    [LV.6]常住居民II

    4

    主题

    414

    回帖

    1122

    积分

    金牌会员

    积分
    1122
    发表于 2024-4-12 07:51:38 | 显示全部楼层
    硬件仿真看一下,是哪里出现的问题
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    0

    主题

    182

    回帖

    358

    积分

    中级会员

    积分
    358
    发表于 2024-4-13 12:40:28 | 显示全部楼层
    IO口设置为准双向口,点亮LED用灌电流。看你的程序里显示num0=1来点亮LED是不合适的,你还是把gpio设置为推挽输出为好。还有就是if(a%2==0&&a>0)类似语句改成if((a%2==0)&&(a>0)),运算符是有优先级的,不加括号可能会得不到想要的结果的
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 03:44 , Processed in 0.058609 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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