av писал(а): 05 окт 2018, 21:54Даже простейшая функция мне непонятна.
ну это как в математике
y = f(x), где f(x) = x+2
такое же решал?
в коде это записывается такъ
int y;
---
int f(int x) { return x+2;}
вызывается так
y = f(2);
printf(y);
на экране получим 4
объясняю на примере дихальтовской статьи
[spoiler]
Код: Выделить всё
void Blink(void)
{
if (Blink_State == 1)
{
Led_On();
Blink_State = 0;
Return;
}
if (Blink_State == 0)
{
Led_Off();
Blink_State = 1;
Return;
}
}
[/spoiler]
у нас есть переменная Blink_State
в зависимости от ее состояния выполняются какие-то действия + обязательно изменить состояние этой переменной на нужное
если мы выключили диод, то в следущий раз его надо включить (т.е. состояние Blink_State должно быть уже 1, т.к. включение светодиода у нас вызывается в блоке, где условие в круглых скобках Blink_State == 1
в флпроге такое не предусмотрено, зато на многих блоках есть вход разрешения
подав туда единицу, мы разрешаем выполнять код, который сгенерирует этот блок
т.е. мы так же делаем условие if (enable == true) { led_on();}
тут возникает второй вопрос: у меня много кнопок и значит будет много состояний, как тогда действовать?
для этого есть другой вид записи
сначала мы делаем перечисления всех состояний автомата
enum function {FMasterVolume, FFrontLeftVolume, FFrontRightVolume,
FCenterVolume, FRearLeftVolume, FRearRightVolume, FSubVolume,
FBass, FMiddle, FTreble, F3D, FToneDefeat, FEnd};
задаем начальное состояние автомата
// startup state
int currentFunction = FMasterVolume; // вот эта строчка
int mute = false;
int mode = DISPLAYMODE;
дальше там есть кнопка функций мелкасхемы этой
когда мы ее нажимаем, то каждый раз на экране загорается новый режим
void loop()
{
// read function button
int functionButton = deBounceRead(FUNCTIONPIN);
if (functionButton == HIGH){
currentFunction++;
if (currentFunction == FEnd) // если мы достигли конца, то выставляем дефолтный режим FMasterVolume
currentFunction = FMasterVolume;
displayFunction();
mode = EDITINGMODE;
}
в таком режиме регулируется громкость кнопками +-
в других режимах регулируется какой-то другой параметр
что происходит, когда мы нажимаем кнопку вверх?
// read up button
int upButton = deBounceRead(UPPIN);
if (upButton == HIGH && mode == EDITINGMODE){
if (currentFunction > FTreble)
functionValues[currentFunction] = !functionValues[currentFunction];
else{
if (functionValues[currentFunction] < maxValues[currentFunction])
functionValues[currentFunction] += 1;
}
displayFunction();
}
вот интересная строчка
if (upButton == HIGH && mode == EDITINGMODE){
у нас тут при нажатии кнопки проверяется не просто ее нажатие, но одновременно еще состояние машины
а их 2
#define DISPLAYMODE 0
#define EDITINGMODE 1
&& это логическое И, только не побитовое, а именно логическое для frue/false
конечно этот код из файла в первом посте этой темы не совсем годный пример, но боле менее показывает, как делается переключение между разными функциями мелкасхемы
в флпрог это делается путем посылки данных + сигнала запись этих данных в виртуальный блок
как вариант - можно сделать блок, у которого будет вход инт и каждое число это будет режим мелкасхемы
регулировка громкости 1, баланс 2, тембр 3
и еще входы +-
после последнего нажатия ждем пару секунд и сбрасывает вход на 1, который отвечает за регулировку громкости используется чаще всего
Отправлено спустя 5 минут 25 секунд:
вот еще почитай теорию
http://easyelectronics.ru/avr-uchebnyj- ... gramm.html
вот так, генерируемый флпрогом код это и есть суперцикл
т.к. код сгенерен прогой для проги, то нам нет смысла разбираться в этом наборе букв, для нас он не имеет смысла, важно чтобы компилятор переварил это
а когда мы делаем сложные ветвления, то тут применются все остальные методы конструкции проги