【问题标题】:C Programming for 8051: SFR directions as arguments8051 的 C 编程:SFR 方向作为参数
【发布时间】:2014-09-07 21:25:30
【问题描述】:

我目前正在使用 AT89C51RC2 制作一个非常简单的井字游戏,但在正确输入按钮时遇到问题。

基本上,输入是一个 3x3 按钮矩阵,我想通过用脉冲扫描行来使用它,同时检查列是否有连接;很基本。但是,我想这样做的方法是创建一个独特的 scroll 方法,该方法接收行参数并相应地将其设置为 HIGH。

我已经有了

sbit R1 = P1^0; 

全部通过所需的输入,但我不确定这是否正确。

然后,在我的主要方法上,我运行类似

while(TRUE)
{
    scroll(R1);
}

这叫卷轴,我有这个

void scroll (bit P)
{
   P = HIGH; //Sets the row being checked to HIGH (HIGH is already defined as a 1). Same goes with the aformentioned TRUE
   ...
}

所以,这行不通。我知道我做的不对,但我必须从某个地方开始。我正在尝试做的事情可能吗?发送单个 Pin 地址作为方法的重载?如果是这样,它应该是什么数据类型?我在 char 和 bit 之间徘徊,但我无法解决。

我希望我的问题可以理解!如果没有,我会很乐意详细说明并发布所有代码(尽管它很混乱)。谢谢大家,提前!

【问题讨论】:

  • 你认为P1^0 会做什么?
  • @DavidSchwartz,它可能做了他认为的事情。它是一个编译器扩展,用于引用 8051 中的位可寻址内存范围。

标签: c 8051 keil


【解决方案1】:

如果我正确理解您的问题,我可以将您的代码 sn-ps 扩展为如下所示:

sbit R1 = P1^0;
sbit R2 = P1^1;
sbit R3 = P1^2; 

while(TRUE)
{
    scroll(R1);
    scroll(R2);
    scroll(R3);
}

(您的scroll 功能保持不变)。您正在尝试定义一个可以多次调用的函数,每次调用该函数时传入一个不同的引脚来断言。

不幸的是,我不知道有一种方法可以完全按照您的意愿进行操作,因为您可能不会在函数中将 sbits 定义为局部变量或参数。我敢肯定,使用SETB 和CLR 指令(也许其他人可以加入)的内联汇编中存在一种非直观的方法,但仅使用Keil C 编译器是不行的。

相反,也许您可​​以创建一个辅助函数来进行引脚分配。这会让你做这样的事情:

void setRow(char whichRow, bit whatValue)
{
    switch (whichRow)
    {
        case 1:
            R1 = whatValue;
            break;
        case 2:
            R2 = whatValue;
            break;
        case 3:
            R3 = whatValue;
            break;
        default:
            break;
    }
}

void scroll (char row)
{
    setRow(row, HIGH); //Sets the row being checked to HIGH (HIGH is already defined as a 1). Same goes with the aformentioned TRUE    
    ...
}

然后在你的主要:

while(TRUE)
{
    scroll(1);
    scroll(2);
    scroll(3);
}

祝你好运。

【讨论】:

  • 感谢您的回答。确实,我尝试使用 sbit 作为参数,但它不起作用。有人指出指针也不起作用,所以我想我将不得不对其进行硬编码。您的 switch 语句是一个很好的建议,但我认为如果我只是硬编码它会减少代码行数。毕竟只有三排。感谢您花时间回答!
【解决方案2】:

我看到你我们正在使用 Keil(非常好的 8051 编译器 IMO)。这个编译器为你提供了一个你正在使用的 MCU 的头文件,它已经声明了一个端口的各个位来访问它们中的每一个 on Keil page dedicated to Atmel's family of 8051 compiler.

(AT89C51RC2 Keil的网页http://www.keil.com/dd/chip/3681.htm)

这样,访问芯片的每个 SFR 将比重新定义它们(UART、TIMER 等)更容易。

通常,支持芯片的编译器会为其客户开发头文件。

在你的项目中包含这个头文件之后,你可以这样访问一下:

unsigned char ucBTN = P1_0; //ucBTN equals P1_0 value;

大多数情况下,您将使用的每个 8051 都是相同的,因为它们使用相同的“CORE”架构。

【讨论】:

  • 下次我会尝试使用特定的标头。我使用了 REG51X.h,因为这是我在学校学到的,AT89C51X.h 什么的)。我肯定要尝试特定的标题(我认为是 AT。谢谢你的推荐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2011-05-02
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多