#c #8051 #keil
#c #8051 #keil
Вопрос:
Я пишу очень простое приложение, которое позволяет изменять температуру. Температура отображается с помощью светодиодов (формат 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 amp;=0x00;
P1 |=0x83;
prog = 0;
while (1)
{
if(select == 1)
prog ;
if(prog == 1)
{
if(up == 1)
room ;
if(down == 1)
room--;
P2 = room;
}
}
}
Затем я выполнил это и получил шестнадцатеричный файл Intel, который затем попытался смоделировать с помощью Edsim.
Согласно коду C, температура должна меняться при prog =1 и при нажатии кнопки up (p1.0) или down (p1.1), но в моделировании она изменяется только при нажатии кнопки select(p1.7) и up /down!
Почему это происходит?
Ответ №1:
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. Я сделал
prog
, потому что я бы добавил больше условий для расширения функциональности моей программы (т. Е. Добавитьif==2
и т.д.). А также как это помогает? В моей текущей программе всякий раз, когдаselect==1
во 2-й раз,prog
будет равно 2, и, следовательно, он не должен вводить конструкцию if2. Если
prog
равно 2, тоif (prog == 1)
очевидно, что это false, потому что2 != 1
. В любом случае вы должны помнить, чтоif (select == 1)
подсчитывается не только количество раз, когда выбор менялся с 0 на 1, но и количество итераций, где он был равен 1 (не обязательно когда-либо был равен 0 в любой промежуточной точке). Если вы хотите добавить больше условий, вы можете изменить его наif (prog >= 1)
, но вы будете сталкиваться с одной и той же проблемой снова и снова.3. Хорошо, имеет смысл. Но тогда теперь, как мне это сделать? в случае переключения возникла бы та же проблема. Я хочу, чтобы при первом нажатии
select
он выполнял температурный код, при втором — выполнял функцию простого числа (еще не реализованную), при третьем — выполнял что-то еще. Это похоже на переход от одной функции к другой в зависимости от количества нажатийselect
.4. Подождите, пока
select
снова не станет 0, прежде чем увеличиватьprog
, например, что-то вродеif (select) { if (!wasOn) { prog; wasOn = 1; } } else { wasOn = 0; }
.
Ответ №2:
Я думаю, что ваш код не отражает то, что вы хотите, чтобы он делал.
if(select == 1)
prog ;
if(prog == 1)
{
значение prog изначально равно 0, поэтому значение prog==1 будет истинным только при первом нажатии кнопки select.
в это время он переходит в 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--;
}
вам все равно нужно будет нажать кнопку выбора, чтобы обновить температуру, и вверх / вниз, чтобы изменить температуру. Если вы можете более четко объяснить, как это должно работать, возможно, я смогу помочь больше.
Комментарии:
1. Я планирую расширить свой код, чтобы добавить дополнительную функциональность (т. Е. Что-то еще, когда
select==2
и т.д.). Итак, я хочу, чтобы при нажатииselect
он переключался на температурную часть, а затем менял температуру только при нажатии вверх / вниз. Но в то же время не должно быть необходимости нажиматьselect
для использования up / down. Надеюсь, я достаточно ясен!2. Я знаю, что было бы лучше использовать switch case, если я хочу, чтобы разные вещи выполнялись с разными
select
значениями, но изначально я изучаю и тестирую, поэтому переключусь на это позже
Ответ №3:
Вы должны попробовать изменить prog
на prog = 1
. Дайте мне знать, если это поможет!