【问题标题】:Seven Segment Display Scrolling七段显示滚动
【发布时间】:2017-07-25 07:08:00
【问题描述】:

我正在使用 2 个级联移位寄存器对 SSD 显示器进行编码。我正在为 PIC 编译器使用 mikroC。我可以使用我的代码 Static Display of 4 Numbers 显示最多 4 位的静态数字序列

    #define SHIFT_CLOCK PORTB.F1    //Clock Connection of 74HC595 SSD Driver
    #define SHIFT_LATCH PORTB.F3    //Latch Connection of 74HC595 SSD Driver
    #define SHIFT_DATA PORTB.F2    //Data Connection of 74HC595 SSD Driver

    char array4[4] = {6, 91, 79, 102};           //Display 1234 on SSD
    char digit[4] = {0xFE, 0xFD, 0xFB, 0xF7};   //Switch on the SSD digits one by one

    char i,j,temp,flag1,flag2;

    void InitTimer0()
    {
     OPTION_REG     = 0x86;
     TMR0           = 6;
     INTCON         = 0xA0;
    }

    void latch595()
    {
     SHIFT_LATCH = 1;
     Delay_us(1);
     SHIFT_LATCH = 0;
    }

    void shiftdata595(unsigned char _shiftdata)
    {
     int i;
     unsigned char temp;
     temp = _shiftdata;
     i=8;
     while (i>0)
     {
      if (temp.F7==0)
       {
        SHIFT_DATA = 0;
       }
       else
       {
        SHIFT_DATA = 1;
       }
       temp = temp<<1;
       SHIFT_CLOCK = 1;
       SHIFT_CLOCK = 0;
       i--;
     }
    }

    void Interrupt()
    {
     if (TMR0IF_bit)
     {
      TMR0IF_bit  = 0;
      TMR0        = 6;
      flag1 = 1;
      flag2 = 1;
     }
    }

    void main()
    {
     TRISB = 0;
     TRISC.F1 = 1;
     InitTimer0();
     while (1)
     {
      if (PORTC.F1==0)
      {
       if (flag2==1)
       {
        shiftdata595(digit[i]);
        i++;
        if(i==4)
        {
         i=0;
        }
        if (flag1==1)
        {
         shiftdata595(array4[j]);
         latch595();
         j++;
         if (j==4)
         {
          j=0;
         }
        }
       }
      }
      else if(PORTC.F1==1)
      {
       shiftdata595(0);
       shiftdata595(0);
       latch595();
      }
     }
    }

如果我向 array4[] 添加更多数字,比如最多 9 个,我需要将数字依次向左滚动。 我尝试将数组移动

temp = array4[0];
for (n=1; n<8; n++)
{
 array4[j-1] = array[j];
}
array[9] = temp;

我希望这段代码将左移数组并且显示会滚动,但我得到的只是一个混乱的显示。如果我添加延迟,我可以看到数字正在显示但没有滚动。

是基础算法有问题还是可以通过修改代码来使用?

【问题讨论】:

  • 为什么你使用n作为循环变量,而j索引array4[]?另外,您正在使用array[9] = temp; 索引一个超出范围的9 元素数组最后是array4 一个错字吗? - 你同时使用arrayarray4
  • 抱歉,array[9]=temp 是一个错字。我的意思是输入 array4[9] = temp。我也尝试使用 j 作为循环变量,但结果相同
  • 那么你在哪里设置array4[8]
  • 假设数组是 array4[10] = {6, 91, 79, 102, 109, 125, 7 , 127, 111, 63 };现在数组需要左移给出,并且 array4[] 中的第一个元素进入一个临时变量。数组从数组 4[1] 左移至数组 4[9]。之后将临时变量放在array4[10] 的地方。
  • 您已将其从 9 个元素更改为 10 个元素,但同样,没有array4[10] 地点。它超出了范围。

标签: c embedded pic mikroc


【解决方案1】:

我确实发现了我的代码的问题。循环是错误的。我在级联模式下使用两个 74HC595。一个控制数字(共阴极),另一个控制段。由于只有一根数据线将信息传递给数字和段,因此需要协调数字前进和段的时间。整个问题是我不必要地专注于协调的计时部分,但相反,我应该专注于推进段然后左移数组的循环条件。

朋友指出,我需要在一张纸上为每个循环写下数据值,这样就解决了问题。我没有像 array4[8] 或 array4[10] 那样手动向循环提供数组的长度,而是使用 sizeof() 函数,然后在循环的前四次迭代之后,将数组左移一个位置。现在滚动效果很好。

这是更新后的工作代码,

shiftdata595(array4[tmp7]);
 latch595();
  Delay_ms(32);
  tmp7++;
 if (tmp7>=4)
 {
  tmp7=0;
  tmp1 = sizeof(array4)/sizeof(array4[0]);
  tmp2 = array4[0];
  for (n=1;n<tmp1;n++)
  {
   array4[n-1] = array4[n];
  }
  array4[tmp1-1] = tmp2;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多