реклама на сайте
подробности

 
 
> Подскажите начинающему, Keil
Djumper
сообщение Oct 9 2010, 18:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 9-10-10
Пользователь №: 60 027



Очень заинтересовался программированием микроконтроллеров.
Сейчас изучаю Keil и язык C.
Имеется железка на микроконтроллере ADuC842.
Начал с малого. Решил написать программу, которая просто заставляет загореться два светодиода из четырёх. Написал. Получилось, работает.
Сейчас решил написать программу, суть которой заключается в том, что надо нажать на кнопку и светодиод загорится, если ещё раз нажать на кнопку, то светодиод тухнет. Бился целый день, но не получается.

Согласно схеме: на светодиод надо подать 0, чтобы он загорелся, на кнопку надо тоже подать 0, чтобы она сработала и заставила загореться светодиод.
Порты прописывал следующим образом: sbit P1_1=0x11 (например светодиод) и P2_1=0x22 (например кнопка). Адреса портов 0x00 условные, т.е. по спецификации я знаю правильный адрес, это для примера привел.

Подскажите, расскажите, объясните. Выслушаю всех, очень хочу научиться.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Djumper
сообщение Dec 16 2010, 15:04
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 9-10-10
Пользователь №: 60 027



Сам написал программу! Всё же приятно самому сделать что-то работающее. Получилась немного кривая программа.
Писал программу пользуясь другими программами, т.е. пришлось перерыть много "литературы", чтобы найти то что нужно.

Что получилось: хотел написать программу типа кодового замка, получилось, что-то вроде: жмём три кнопки 1,6,8 по очереди, загорается один, два и три светодиода (нажали нужные кнопки).
Причём в обратном направлении кнопки 8,6,1 также жмутся и светодиоды загораются, реализовать код не получилось.

Что хочу получить в новой версии программы, но не знаю как это реализовать:чтобы светодиоды загорались только при нажатии на кнопки 1,6,8. И чтобы когда загорелся третий светодиод, загорались все четыре светодиода и продолжали гореть, а при нажатии на любую кнопку они прекращали гореть.

Выслушаю любые советы и подсказки.

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;
char a[3]; //переменная "а" будет содержать 3 символа? или состоит из матрицы с 3 столбцами?
main()
{
char b[3]={'1','6','8'}; //это вроде как значение кода, но он не работает или это что-то другое? переменная, то для чего?
inception: P0=0; P1=0;//inception я придумал название, это же переменная?
while(k!=3) //почему "k" не равно 3??? когда будет больше нажатий то обнулиться?
{
P0_4=0; P0_5=1; P0_6=1; //ну тут на 1 столбец 0 подаём, что означает что на этом столбце будет нажата какая-то клавиша
if (P1_0==0) {k++; while(P1_0==0) a[k]='1'; //указали строку, нажата 1 клавиша, добавили к "k" единичку, далее пока клавиша нажата, то что? переменная "а" равна 1 кодовому символу?
P0_3=1; P0_2=0; P0_1=0; P0_0=0;} //включаем светодиод подавая 1 (специфичная схема sm.gif)

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;}
}
//тут охота чтобы после третьей нажатой клавиши загорались все 4 светодиода и продолжали гореть пока не нажму на любую другую клавишу
goto inception; //идём к "началу" и повторяем цикл?
}

PS: не важно в каком порядке буду код вводить, подскажите как включить все 4 светодиода и выключить их при нажатии на любую клавишу.
Спасибо!

Сообщение отредактировал Djumper - Dec 16 2010, 15:06
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 17 2010, 13:46
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Djumper @ Dec 16 2010, 21:04) *
Выслушаю любые советы и подсказки.

Попробую подсказать

Бесконечный цикл реализуется проще так:
вместо
Код
inception: P0=0; P1=0;//inception я придумал название, это же переменная?
.......
goto inception;
записываем
Код
for(;;)
{
P0=0; P1=0;
.......
}

Далее - матричная клавиатура...
Работает считывание нажатых кнопок так: на один из столбцов выдаем низкий уровень (0), на остальные - высокий (1). Считываем значение строк и, там где будет низкий - там нажата кнопка на "пересечении" строки и столбца.

Чтобы было Вам понятнее, рекомендую оформить отдельные функциональные части Вашей программы как функции. Например, функция возвращающая нажатые в данный момент кнопки может выглядеть как-то так (подстоюсь под Ваш стиль, чтобы было Вам понятнее):
Код
unsigned int GetButton(void)
{
  unsigned int x;
  P0_4= 1;  P0_5= 1; P0_6= 0;  // Третий столбец
  x= ((~P1) & 0x0F);  // Считали четыре кнопки третьего столбца (P1_0 ... P1_3)
  P0_4= 1;  P0_5= 0; P0_6= 1;  // Второй столбец
  x= (x << 4) | ((~P1) & 0x0F);  // Добавили четыре кнопки второго столбца (P1_0 ... P1_3)
  P0_4= 0;  P0_5= 1; P0_6= 1;  // Первый столбец
  x= (x << 4) | ((~P1) & 0x0F);  // Добавили четыре кнопки первого столбца (P1_0 ... P1_3)
  return x;
}
Эта функция возвращает шестнадцатибитовое значение, 12 младших разрядов которого означают состояние кнопок: 4 младших - на первом столбце, следующие четыре - на втором, и ещё четыре - на третьем. Причем, 1 - кнопка нажата (обратите внимание на инверсию разрядов - (~P1) ).

Можно написать и функцию зажигания/тушения светодиодов:
Код
void LED(unsigned char L)
{
  P0= (P0 & 0xF0) | (L & 0x0F);
}
Параметр этой функции: младшие четыре бита - состояния светодиодов (младший - первый, и т.д.)

Тогда Ваша программа будет выглядеть как-то так:
Код
void main(void)
{
  unsigned char P;  // Три младших бита этой переменной - признаки нажатия трёх "секретных" кнопок (оно же состояние трёх светодиодов)
  const unsigned int B[3]= { 0x0001, 0x0020, 0x0080 }; // Коды "секретных" кнопок: первая(первый столбец-первая строка), шестая(2-2) и восьмая(2-4)
  
  P= 0; // Кнопки нажаты не были
  LED(0);  // Светодиоды погашены
  for(;;)
  {
    unsigned int x;  // Текущее состояние кнопок
    x= GetButton();
    if((x & B[0]) != 0)
    {  // Среди нажатых кнопок есть первая секретная
      P= P | (1 << 0);  // Зафиксировали этот факт
      x= x & (~B[0]);  // Удалим её из переменной с нажатыми кнопками
    }
    if((x & B[1]) != 0)
    {  // Среди нажатых кнопок есть вторая секретная
      P= P | (1 << 1);
      x= x & (~B[1]);
    }
    if((x & B[2]) != 0)
    {  // Среди нажатых кнопок есть третья секретная
      P= P | (1 << 2);
      x= x & (~B[2]);
    }
// Обратите внимание, что выше напрашивается цикл, но сделал без цикла, чтобы было Вам понятнее - переделаете сами...
    if(x != 0) // Нажата ещё какая-то кнопка, которая не входит в список секретных?
      P= 0;  // Да, нажата ещё какая-то кнопка: Все - как бы сначала (т.е. сбросить признаки нажатия кнопок, потушить светодиоды)
    if(P == 0x07)  // Все ли секретные кнопки были нажаты?
      LED(P | 0x08); // или LED(0x0F); Да! Все три кнопки были нажаты - зажечь 4 светодиода
    else
      LED(P); // Зажечь те светодиоды, что соответствуют нажатым секретным кнопкам
  }
}


Ну - вот... Как-то так...

P.S. Может-быть я не понял Вашу задачу? Например, нужно ли соблюдать порядок нажатия на "секретные" кнопки? В приведенной выше программке - порядок нажатия безразличен. Это - не трудно исправить... Три светодиода я "привязал" к трем "секретным" кнопкам - т.е. нажали вторую "секретную" кнопку - второй светодиод и загорелся, первую кнопку - первый светодиод... А как Вы хотели? Научитесь четко формулировать задачу: хорошая формулировка - считай - половина работы сделана!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Djumper   Подскажите начинающему   Oct 9 2010, 18:09
- - rezident   Не нужно подавать на пин, к которому подключена кн...   Oct 9 2010, 19:02
|- - Djumper   Цитата(rezident @ Oct 10 2010, 02:02) Не ...   Oct 10 2010, 07:07
- - rezident   Периферию вашего контроллера я не знаю, а изучать ...   Oct 10 2010, 08:01
|- - Djumper   rezident спасибо, а что такое P3?   Oct 10 2010, 10:48
|- - rezident   Цитата(Djumper @ Oct 10 2010, 16:48) rezi...   Oct 10 2010, 11:05
|- - Djumper   Цитата(rezident @ Oct 10 2010, 18:05) Пор...   Oct 10 2010, 11:12
- - rezident   Ну дык замените в дефайнах номера битов и далее по...   Oct 10 2010, 11:52
- - Djumper   Дребезг и т.д. это слишком сложно для меня, на ско...   Oct 12 2010, 15:00
|- - rezident   Цитата(Djumper @ Oct 12 2010, 21:00) Но н...   Oct 12 2010, 16:09
- - firstvald   Вы фактически реализуете счетный триггер, но при ...   Oct 12 2010, 16:35
|- - Djumper   Цитата(firstvald @ Oct 12 2010, 23:35) Вы...   Oct 12 2010, 16:54
- - firstvald   Давайте еще проще: void main (void) { P1=0xff;//и...   Oct 12 2010, 17:18
|- - Djumper   Цитата(firstvald @ Oct 13 2010, 00:18) Да...   Oct 12 2010, 17:40
- - firstvald   Нет. Я специально написал безо всяких битовых опер...   Oct 12 2010, 17:51
|- - Djumper   Цитата(firstvald @ Oct 13 2010, 00:51) Не...   Oct 12 2010, 18:34
- - Djumper   С кнопкой с горем пополам разобрался Хочу собрат...   Nov 17 2010, 14:03
- - XVR   ЦитатаОдно не понятно, как мне подключить это устр...   Nov 18 2010, 11:12
|- - Djumper   Цитата(XVR @ Nov 18 2010, 18:12) Программ...   Nov 18 2010, 17:35
- - XVR   ЦитатаРадуюсь. Так? Так Или с вариантами - многие ...   Nov 18 2010, 18:14
- - Djumper   Как подключить библиотеку delay.h в Keil 3? Пишет ...   Nov 19 2010, 13:20
- - Djumper   Возможно эта библиотека называется как-то по друго...   Nov 21 2010, 14:48
- - Djumper   Кое как со скрипам научился делать что-то вроде за...   Nov 24 2010, 17:39
|- - Палыч   Цитата(Djumper @ Nov 24 2010, 20:39) sfr ...   Nov 25 2010, 06:29
||- - Djumper   Цитата(Палыч @ Nov 25 2010, 13:29) Код#in...   Nov 29 2010, 11:42
|- - Палыч   Цитата(Djumper @ Nov 24 2010, 20:39) P0_2...   Nov 25 2010, 08:12
|- - Палыч   Цитата(Djumper @ Nov 24 2010, 20:39) for ...   Nov 25 2010, 13:07
|- - Djumper   Цитата(Палыч @ Dec 17 2010, 22:46) P.S. М...   Dec 18 2010, 08:21
- - Палыч   Цитата(Djumper @ Dec 18 2010, 14:21) Подс...   Dec 18 2010, 09:08
- - Djumper   Кодsfr P0=0x80; sfr P1=0x90; sbit P0_0=0x80; //1 с...   Dec 18 2010, 15:16
- - Палыч   Цитата(Djumper @ Dec 18 2010, 21:16) for ...   Dec 19 2010, 04:22
- - Djumper   Учту дребезг в будущем. На данный момент сделаю т...   Dec 19 2010, 12:35
- - Палыч   Цитата(Djumper @ Dec 19 2010, 18:35) На д...   Dec 20 2010, 07:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 03:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016