我正在编写一个非常简单的应用程序,可以让人改变温度。使用LEDS(BCD格式)显示温度
我在Keil C51中编写了以下代码:
#include< REG51.h>
sbit select = P1^7;
sbit up = P1^0;
sbit down = P1^1;
int data room = 24;
void main()
{ int prog;
P2 &=0x00;
P1 |=0x83;
prog = 0;
while (1)
{
if(select == 1)
prog++;
if(prog == 1)
{
if(up == 1)
room++;
if(down == 1)
room--;
P2 = room;
}
}
}
然后我遵守了这个并获得了英特尔hex文件,然后我尝试使用Edsim进行模拟。
根据C代码,当prog = 1并且按下向上(p1.0)或向下(p1.1)时温度应该改变,但是在模拟中它只在两个选择时都改变(p1.7)并按下向上/向下!
为什么会这样?
答案 0 :(得分:2)
prog++
表示prog
的值每次增加1 ,条件select == 1
为真。这意味着条件prog == 1
仅在它递增的第一次迭代时才为真。
尝试将prog++
更改为prog = 1
。
编辑:根据评论中的讨论,如果您希望跟踪select
已经上升的次数,则需要等待它再次为0才能让prog
再次递增。例如:
int prev = select;
…
if (select != prev) {
// select has changed from its previous state
prev = select;
if (prev) {
// select went from 0 to 1
++prog;
if (prog == 1) {
// code to be executed once only on the first press
} else if (prog == 2) {
// code to be executed once only on the second press
} else if (prog >= 3) {
// code to be executed once on every subsequent press
}
} else {
// select went from 1 to 0
}
}
if (prev) {
// select is being pressed
if (prog == 1) {
// code to be executed _continuously_ while select is held down
// (after first press only)
}
// ...
}
答案 1 :(得分:2)
我认为您的代码并不反映您希望它执行的操作。
if(select == 1)
prog++;
if(prog == 1)
{
prog最初为0,因此只有第一次按select时,prog == 1才会为真。
那时它会进入IF并检查
if(up == 1)
room++;
if(down == 1)
room--;
P2 = room;
如果按下向上或向下,则将房间当前温度更改为+1或-1。因为你用按钮模拟,这意味着按下选择时应该按下任一按钮。
然后将数据输出到P2
您需要做的是:
while (1)
{
if(select== 1)
{
P2 = room;
}
if(up == 1)
room++;
if(down == 1)
room--;
}
您仍然需要按选择以更新温度,然后按向上/向下以更改温度。如果你能让自己更清楚自己的工作方式,也许我可以提供更多帮助。
答案 2 :(得分:0)
您应该尝试将prog++
更改为prog = 1
。如果有帮助,请告诉我!