C编程8051:SFR方向作为参数

时间:2014-07-17 06:22:49

标签: c 8051 keil

我目前正在使用AT89C51RC2制作一个非常简单的Tic-Tac-Toe游戏,我在解决按钮输入问题时遇到了问题。

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

我已经

sbit R1 = P1^0; 

所有需要的输入,但我不确定这是否正确。

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

的东西
while(TRUE)
{
    scroll(R1);
}

这是名为scroll,我有这个

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之间玩杂耍,但我无法解决。

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

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,我可以将您的代码段展开为:

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

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

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

不幸的是,我不知道如何做你想要做的事情,因为你可能不会在函数中定义sbit,无论是本地还是参数。我确定使用SETBCLR指令在内联汇编中执行此操作是非直观的方法(也许其他人可以插入),但使用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);
}
祝你好运。

答案 1 :(得分:0)

我看到你们正在使用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都是一样的,因为它们使用相同的“核心”架构。