【问题标题】:Why doesn't my bit left shift?为什么我的位不左移?
【发布时间】:2012-05-12 13:05:20
【问题描述】:

我在 Keil 上使用嵌入式 C。我正在尝试编程,使其存储一个位,位移,然后再次存储它并重复,直到存储所有八位。

但是,当我调试(可能调试错误)时,该值仅显示“01 00 00 00 00 00 00...”。当它存储逻辑'1'然后左移时,它显示“02 00 00 00 00 00 00...”。当循环重复时,它会一遍又一遍地显示相同的内容。我所期望的是“01 01 01 01 01 01 01 ...”(假设所有输入位都是“1”)。我该如何解决这个问题?

#include <reg51.h>

sbit Tsignal = P1^2;
unsigned char xdata x[500];

for(u=0; u<8; u++)
{
     x[i] = x[i] << 1;
     x[i] = Tsignal;  //Store Tsignal in x
}

啊,我已经解决了。

unsigned int u;
unsigned char p;
unsigned char xdata x[500];

for(u=0; u<8; u++)    //Bit Shift Loop
{
    x[i] = x[i] <<1;   //Left Bit Shift by 1
    p = Tsignal;       //Store Tsignal to Buffer p
    x[i] |= p;
} //End Bitshift loop

【问题讨论】:

  • 在标准 C 中没有对位数组的直接支持。你使用的是 Keil 特有的东西 - 你能包括你对 x 的定义吗?
  • 你为什么要立即覆盖你用Tsignal创建的值?
  • #include sbit Tsignal = P1^2;无符号字符 xdata x[500];
  • @xrainxfallx 发布您自己问题的答案非常好。在您接受任何答案作为正确答案之前,请给其他人时间回复,包括您自己的答案。
  • @Lundin 我会记住这一点的。

标签: c embedded microcontroller 8051 keil


【解决方案1】:

我想你想做这样的事情:

for(u=0;u<8;u++)
{
  // Update Tsignal.
  //Tsignal = GetBitValue();

  // Store it to x.
  x = (x << 1) | (Tsignal & 0x1)
}

【讨论】:

  • 我可以知道你的 GetBitValue();功能?
  • 我想你想 OR 它不 AND 它 x = (x
  • GetBitValue() 是伪代码。它表示一个函数,该函数返回例如通用数字输入的位值。
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2019-01-02
  • 2020-10-03
  • 2018-02-25
  • 1970-01-01
  • 2021-09-23
相关资源
最近更新 更多