我目前正在使用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之间玩杂耍,但我无法解决。
我希望我的问题是可以理解的!如果没有,我很乐意详细说明并发布所有代码(尽管它非常混乱)。谢谢,大家,提前!
答案 0 :(得分:1)
如果我正确理解您的问题,我可以将您的代码段展开为:
sbit R1 = P1^0;
sbit R2 = P1^1;
sbit R3 = P1^2;
while(TRUE)
{
scroll(R1);
scroll(R2);
scroll(R3);
}
(您的scroll
功能保持不变)。您正在尝试定义一个可以多次调用的函数,每次调用该函数时都会传入一个不同的引脚来断言。
不幸的是,我不知道如何做你想要做的事情,因为你可能不会在函数中定义sbit
,无论是本地还是参数。我确定使用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);
}
祝你好运。
答案 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都是一样的,因为它们使用相同的“核心”架构。