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

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-04-11 17:03:51

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);
      }
  }
}

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-04-11 17:03:51

2

主题

5

回帖

80

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2024-04-11 17:03:51

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;
                }
        }
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-06-17 01:35:04
已绑定手机

17

主题

714

回帖

1245

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-06-16 00:53:18

0

主题

336

回帖

1628

积分

金牌会员

积分
1628
发表于 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, 2025-6-17 09:32 , Processed in 0.148163 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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