Перейти к содержанию
    

Подскажите начинающему

Подскажите и я вам буду очень благодарен :)

PS: кстати, прочтите мои комментарии к моей программе, правильно ли я понимаю как работает программа?

Поскольку из Ваших коментариев трудно понять, что же вы хотели сделать, то написанное ниже - мои фантазии на эту тему...

 

char a[3]; //переменная "а" будет содержать 3 символа? или состоит из матрицы с 3 столбцами?

Массив с именем а состоит из трёх элементов, каждый из которых - символ. Imho, сюда Вы ходели поместить некие символы, соответствующие нажатым клавишам.

 

char b[3]={'1','6','8'}; //это вроде как значение кода, но он не работает или это что-то другое? переменная, то для чего?

Наверное, этот массив, с которым нужно бы сравнить массив а после нажатия трёх клавиш.

 

inception: P0=0; P1=0;//inception я придумал название, это же переменная?

Это - не переменная, это - метка. Как лучше оформлять бесконецный цикл - см. мой предыдущий пост: тогда сразу видно, что этот цикл - бесконечный.

 

while(k!=3) //почему "k" не равно 3??? когда будет больше нажатий то обнулиться?

Imho, не равно 3, потому, что Вы ожидаете нажатие трёх кнопок. Значение переменной k изменяется в цикле (операторы k++), обнулять эту переменную нужно самому (автоматически это не делается).

 

if (P1_0==0) {k++; while(P1_0==0) a[k]='1'; //указали строку, нажата 1 клавиша, добавили к "k" единичку, далее пока клавиша нажата, то что? переменная "а" равна 1 кодовому символу?

Вы, вероятно путаете символ '1' со значением 1... Поскольку в начале переменная k равнялась нулю (и то, потому, что эта переменная - глобальная; хорошо бы явно присваивать ей начальное значение), то увеличивать её значение нужно было бы после a[k]='1' (индексы массивом начинаются с нуля, т.е. первый элемент массива а[0]). Оператор while спользуется, по-видимому, для ожидания отпускания кнопки. Всё это следовало бы записать, наверное так:

if (P1_0==0) 
{
  a[k]='1'; k++;        // или так: a[k++]='1';
  P0_3=1; P0_2=0; P0_1=0; P0_0=0;
  while(P1_0==0);
}

 

//тут охота чтобы после третьей нажатой клавиши загорались все 4 светодиода и продолжали гореть пока не нажму на любую другую клавишу

Здесь, наверное, нужно сравнить Ваши массивы a и b, и, если они совпадают, то зажечь четвертый светодиод. Здесь же, наверное, нужно ещё и обнулить переменную k, раз Вы переходите на начало Вашего бесконечного цикла...

 

P.S. Кнопки имеют нехорошее свойство, которое называют "дребезг контактов". Ваша программа от него не защищена! И, возможно (даже - вероятнее всего), будет улавливать нажатие одной кнопки как множественное нажатие на одну и ту же кнопку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sfr P0=0x80;
sfr P1=0x90;
sbit P0_0=0x80; //1 светодиод
sbit P0_1=0x81; //2 светодиод
sbit P0_2=0x82; //3 светодиод
sbit P0_3=0x83; //4 светодиод
sbit P0_4=0x84; //1 столбец клавиатуры матричного типа
sbit P0_5=0x85; //2 столбец
sbit P0_6=0x86; //3 столбец
sbit P1_0=0x90; //1 строка
sbit P1_1=0x91; //2 строка
sbit P1_2=0x92; //3 строка
sbit P1_3=0x93; //4 строка

int k, c;
char a[3];
main()
{
char b[3]={'1','6','8'};
inception: P0=0; P1=0;
while(k!=3)
{
P0_4=0; P0_5=1; P0_6=1;
if (P1_0==0) {k++; while(P1_0==0) a[k]='1';
P0_3=1; P0_2=0; P0_1=0; P0_0=0;}

P0_4=1; P0_5=1; P0_6=0;
if (P1_1==0) {k++; while(P1_1==0) a[k]='6';
P0_3=0; P0_2=1; P0_1=0; P0_0=0;}

P0_4=1; P0_5=0; P0_6=1;
if (P1_2==0) {k++; while(P1_1==0) a[k]='8';
P0_3=0; P0_2=0; P0_1=1; P0_0=0;}
}

for (c=0; c<4; c++) //ввёл переменную "c": сначала "с" равно "0", пока "с" меньше 4-х то выполняется программа, правильно?

if (b[c]!=a[c]) //тут сравниваем: если "b" не равно "а" то гоу в начало, правильно?

goto inception;
}

Всё равно не могу сообразить как четыре светодиода включить и сбросить.

Изменено пользователем Djumper

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

for (c=0; c<4; c++) //ввёл переменную "c": сначала "с" равно "0", пока "с" меньше 4-х то выполняется программа, правильно?
Нет, неправильно. Массивы а и b состоят из трёх элементов; индексы этих элементов 0, 1, 2 (в языке Си самый первый элемент массива имеет индекс ноль); поэтому - "пока переменная с меньше трёх".

 

if (b[c]!=a[c]) //тут сравниваем: если "b" не равно "а" то гоу в начало, правильно?
Да, правильно. Но, скорее всего, Ваши массивы никогда не совпадут (см. PS к моему предыдущему посту).

 

Всё равно не могу сообразить как четыре светодиода включить и сбросить.
Вот, после выполнения цикла for(c=0; c<3; c++) т.е. после того, как проверили, что массивы совпадают и надо включить четыре светодиода. Что делать дальше? Далее нужно сканировать клавиатуру и обнаруживать нажатия на клавишу; как только нажатие клавиши будет обнаружено, то потушить диоды и - в начало.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Учту дребезг в будущем.

 

На данный момент сделаю так, чтобы загорались все 4 светодиода.

Правильно?

for (c=0; c<3; c++)
P0_3=1; P0_2=1; P0_1=1; P0_0=1;
if (b[c]!=a[c])

 

Или из-за дребезга можно вообще убрать сравнение, т.к. оно врятли будет работать в нынешней моей версии программы?

Т.е. просто сделать так:

for (c=0; c<3; c++)
P0_3=1; P0_2=1; P0_1=1; P0_0=1;

 

Ой, причём тут переменная "c", нужна "k"?

for (k=0; k<3; k++)
P0_3=1; P0_2=1; P0_1=1; P0_0=1;

 

Кстати, а можно int k, c; и char a[3]; поместить в main {}?

Т.е. сделать так:

main()
{
int k, c;
char a[3];
char b[3]={'1','6','8'};
}

 

Надо брать микроконтроллер с программатором на вечное пользование и учиться, а то людей отвлекаю своими вопросами :)

Изменено пользователем Djumper

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На данный момент сделаю так, чтобы загорались все 4 светодиода. Правильно?

for (c=0; c<3; c++)
P0_3=1; P0_2=1; P0_1=1; P0_0=1;
if (b[c]!=a[c])

Нет, неправильно. В некоторых операторах (например, циклов, ветвления...) можно разместить один оператор, а если нужно - несколько операторов, то они заключаются в операторные (фигурные) скобки. Так, как Вы написали: будет трижды (при с=0, 1, 2) выполнен один и тот же оператор (P0_3=1;). Цикл же здесь, чтобы сравнить три элемента массивов a и b. Т.е. должно быть что-то такое:

for (c=0; c<3; c++)
  if (b[c]!=a[c]) // элементы совпадают ?
    { // нет, не совпадают
      // здесь помещаем все действия, что нужно выполнить при неправильном наборе
      goto inception;
    }
// Сюда программа попадёт, если все три элемента массивов a и b совпадут между собой
P0_3=1; P0_2=1; P0_1=1; P0_0=1;  // зажечь все четыре светодиода

 

можно int k, c; и char a[3]; поместить в main {}?

Можно

 

Надо брать микроконтроллер с программатором на вечное пользование и учиться, а то людей отвлекаю своими вопросами
Ну, или, если микроконтроллер с программатором труднодоступен, то - "потренироваться на кошечках" - воспользоваться симулятором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...