【问题标题】:7 segment LED + 40947段LED + 4094
【发布时间】:2015-01-16 12:59:51
【问题描述】:

我想使用两个移位寄存器 4094、一些 7 段 LED 和一个 ATmega 328p 显示 2 个数字。 我当前的代码是:

uint8_t LED[10]={0b11111100,0b01100000,0b011011010,0b011110010,0b01100110,0b10110110,0b10111110,0b111000000,0b11111110,0b11110110};


int j =Led; //input from the main
uint8_t num_1=Led/10;
uint8_t num_2=Led%10;       
Strobe=0;
uint8_t mask=0x80;
 for(uint8_t i=0; i<8; i++)
  {
      mask=mask>>1;     

    if( (LED[num_1]  & mask) ==1)
    {
        DATA= 1;
    }
    else
    {

        DATA= 0;
    }
    pulse();
}
mask=0x80;
for(uint8_t i=0; i<8; i++)
{
    mask=mask>>1;
     ;

    if( (LED[num_2]  & mask)==1)
    {
        DATA= 1;
    }
    else
    {

        DATA= 0;
    }
    pulse();
}

当然它不能正常工作。它只生成 0。 你能为我指出正确的方向吗? 编辑: 我使用爱特梅尔工作室 6。 该代码的目的是生成从 00 到 16 的数字。

【问题讨论】:

  • 请提供更多细节。目标是生成一些位模式还是一系列位模式?代码看起来像 C,实际上是 C 吗?
  • 4094 需要一个额外的信号来将移入的值存储到存储其输出的内部寄存器中。我没有看到你在处理这个问题(在移出两位数字之间)。
  • 如果你显示代码,你应该标记语言。除了帮助人们找到问题外,它还会影响语法高亮。

标签: c bit-manipulation avr led


【解决方案1】:

首先,您应该将mask = mask&gt;&gt;1 放在循环的末尾。

其次,您需要将
if( (LED[num_2] &amp; mask) == 1 ) 替换为
if( (LED[num_2] &amp; mask) == mask) 或只是
if( LED[num_2] &amp; mask )

掩码可以是 0b10000000, 0b01000000,...,0b00000001。
&amp; 运算的结果只能与掩码相同或为零。
而==运算符的右侧是1,始终为0b00000001。

【讨论】:

  • 可以去掉if语句直接写Data= LED[num_2] & mask吗??
  • 如前所述,AND 运算的结果可以等于掩码,也可以为零。当结果为零时,您可以执行此操作。当结果为掩码时,结果将为非零,与 1 不同。根据4094的原则,Data只能是1或0。
  • 我认为最快的方法是这个 Data = !!(LED[num_2] & mask)。第二个 ! 将 mask(non-zero) 转换为 0,或将 0 转换为 1。第一个 ! 更正了逻辑。在你提到这个之前我没有考虑过这个,谢谢你。
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多