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

Нужна помощь в дописывании кода


Den1985

Рекомендуемые сообщения

Добрый день програмисты електроники. Очень нужна Ваша помощь в дописании кода в Atmel Studio для Atmega8. Я новичёк в програмировании. Суть такая.

С матричной клавиатуры могу вывести одну цифру от 0 до 9, но не могу добавлять чтоб было 2 или 3 или 4 цифры. Знаю что нужно как-то занести в переменную и умножить на 10, чтоб число сдвинулось но не знаю как это сделать. Пытаюсь сам разобраться но не получается. Может кто-то сможет мне дописать код. За ранее благодарен. Ниже код.

#include "main.h"

unsigned char key_tab[4] = 
{
    0b11111110,
    0b11111101,
    0b11111011,
    0b11110111
};

unsigned char scan_key(void)
{
    unsigned char key_value = 0;
    unsigned char i;
    for(i = 0;i < 4;i++)
    {
        PORTB = key_tab[i];
        _delay_us(10);
        switch (PINB & 0xF0)
        {
            case 0b11100000:
            key_value = 1 + i * 3;
            return (key_value);
            case 0b11010000:
            key_value = 2 + i * 3;
            return (key_value);
            case 0b10110000:
            key_value = 3 + i * 3;
            return (key_value);
            default:
            break;
        }
    }
    return (key_value);
}

int main(void)
{
    DDRB |= (1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0);
    DDRB &= ~(1 << PB7)|(1 << PB6)|(1 << PB5)|(1 << PB4);
    PORTB = 0xF0;
    DDRD = 0xFF;
    PORTD = 0x00;
    _delay_ms(10);
    LCD_ini();
    clearlcd();
    setpos(0,0);
    sendchar('D');
    setpos(1,0);
    sendchar('=');
    
    while(1)
    {
        unsigned long a;
        unsigned long c;

        if(scan_key()==1) c = 1;
        if(scan_key()==2) c = 2;
        if(scan_key()==3) c = 3;
        if(scan_key()==4) c = 4;
        if(scan_key()==5) c = 5;
        if(scan_key()==6) c = 6;
        if(scan_key()==7) c = 7;
        if(scan_key()==8) c = 8;
        if(scan_key()==9) c = 9;
        if(scan_key()==11) c = 0;
        
        a = c;
        
        setpos(2,0);
        sendcharlcd(( a %10000)/1000+0x30);
        sendcharlcd(( a %1000)/100+0x30);
        sendcharlcd(( a %100)/10+0x30);
        sendcharlcd( a %10+0x30);    
    }
}

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

11 часов назад, Den1985 сказал:

что нужно как-то занести в переменную и умножить на 10, чтоб число сдвинулось

Чтоб сдвинулось, нужно всего-лишь сдвинуть координату.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Цитата

Atmel Studio...

#include "main.h"

...

        _delay_us(10);

Не вижу библиотеки временнЫх задержек. И библиотека майн не попадалась. В какой студии написано?

Я не раздаю удочки. Я продаю рыбу.

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, Alex сказал:

Чтоб сдвинулось, нужно всего-лишь сдвинуть координату.

Добрый день. Я хочу чтоб писать не одну цыфру а писать с матричной клавиатуры несколько цифр. Допустим 2167 или 3876, а у меня пишет 2 или 3 или 8, по одной цифре а больше не пишет и я не могу понять как это сделать.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

4 часа назад, Alex сказал:

Чтоб сдвинулось, нужно всего-лишь сдвинуть координату.

И как это сделать, я не пойму. Поэтому я и прошу помощи.

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

@Den1985 В бесконечном цикле while(1) программа быстро-быстро бегает по кругу. Поэтому при одном нажатии на клавиатуру программа пробежит несолько раз, и будет несколько раз срабатывать одно и тоже условие  if(scan_key()=). То есть программа насыпет много одних и тех же цифр в переменную с.

Надо для начала сделать так, чтобы нажатая цифра срабатывала только один раз, потом программа должна ждать отпускания клавиши.

После отпускания программа будет готова принять второе нажатие клавиатуре. При втором нажатии переменную а умножаем на 10 и добавляем к ней новую цифру.

Затем снова ждём отпускания клавы. И так далее.

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

1 час назад, Den1985 сказал:

И как это сделать, я не пойму. Поэтому я и прошу помощи.

Чтобы сдвинуть цифры на дисплее, нужно сдвинуть координату для каждой цифры. Что тут может быть непонятного ?

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

4 минуты назад, Yurkin2015 сказал:

@Den1985 В бесконечном цикле while(1) программа быстро-быстро бегает по кругу. Поэтому при одном нажатии на клавиатуру программа пробежит несолько раз, и будет несколько раз срабатывать одно и тоже условие  if(scan_key()=). То есть программа насыпет много одних и тех же цифр в переменную с.

Надо для начала сделать так, чтобы нажатая цифра срабатывала только один раз, потом программа должна ждать отпускания клавиши.

После отпускания программа будет готова принять второе нажатие клавиатуре. При втором нажатии переменную а умножаем на 10 и добавляем к ней новую цифру.

Затем снова ждём отпускания клавы. И так далее.

Спасибо большое, но я новичек. А можно это как-то написать пожалуйста. Я это все понимаю но мозгов у меня не хватает это оформить. За ранее благодарен.

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

Ну, например так можно написать.

unsigned long a;
unsigned char c;
unsigned char check;

check = 0;
a = 0;
while(1)
{
   c = scan_key();
   if(c)
   {
      if (c == 11)
         c = 0;

      if(check)
      {
         check = 0;
     
         a = a * 10;
         a = a + c;
           
         setpos(2,0);
         sendcharlcd(( a %10000)/1000+0x30);
         sendcharlcd(( a %1000)/100+0x30);
         sendcharlcd(( a %100)/10+0x30);
         sendcharlcd( a %10+0x30);    
      }
   }
   else
      check = 1;

   _delay_ms(20);
}

 

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

6 минут назад, Yurkin2015 сказал:

Ну, например так можно написать.

unsigned long a;
unsigned char c;
unsigned char check;

check = 0;
a = 0;
while(1)
{
   c = scan_key();
   if(c)
   {
      if (c == 11)
         c = 0;

      if(check)
      {
         check = 0;
     
         a = a * 10;
         a = a + c;
           
         setpos(2,0);
         sendcharlcd(( a %10000)/1000+0x30);
         sendcharlcd(( a %1000)/100+0x30);
         sendcharlcd(( a %100)/10+0x30);
         sendcharlcd( a %10+0x30);    
      }
   }
   else
      check = 1;

   _delay_ms(20);
}

 

Спасибо огромное, это то что мне нужно. Всех благ!!!

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @VIT13 усилители ещё и "свистеть" умеют.
    • Спасибо за наводку на AIFEN!  Взял себе на озоне A5 pro ( там она оказалась гораздо дешевле чем на али https://www.ozon.ru/product/sugon-payalnaya-stantsiya-120-vt-nihromovyy-nagrevatel-1257369280/ ) Единственное - лажанулся с выбором ручки, но она довольно прикольно паяет мелочевку. Ручку по больше и жала так же можно взять отдельно. Ну и мне все таки он показался по интересней Fnirsi ( хотя этот можно таскать с собой в рюбзаке, что довольно удобно) Под катом - габариты.  
    • На этом Иппоне я проводил разные тесты на даче, цеплял два автоаккума по 60А\ч. Оказалось, что можно накачать тонну воды глубинным насосом со скважины 35метров. Ну подогреть чай кипятильником 500Вт тоже можно. С дополнительной подзарядкой от солнечных батарей\контроллера уже можно как-то жить, во всяком случае освещение есть постоянно. Хотя для полного фен-шуя нужно и батарей больше, и аккумов, и более мощный преобразователь в 220В. И стараться использовать топливные печки\нагреватели там, где это возможно, например, хорошо показали себя туристические газовые плитки, ну а если к ним подсоединить баллон литров на 10-20, то вообще хорошо. Хотя, конечно, опасное это дело газ...
    • Актуальная потребность) Тоже развлекался подобным способом, только с немного другим ибп. Хотел перевести его на железофосфат, но он до конца не заряжал батарею. Блок зарядки у него не калибровался, и по моему с микроконтроллером. В итоге оставил свинец. Когда то он тянул серверную на 4х батарейках по 200а/ч. Серверную он вытянул за ночь, а вот из за отсутствия охлаждегия все пошло в разнос. В итоге все закончилось полной заменой силовой комплектухи и устранением лишних отверстий в плате. Но картошку хватило сварить и даже немного поработать, зимой на железофосфате 4 часа отапливал тепловентилятором балкон)). Дешевле чем из розетки днем)) А для ленивых( ну или если в лом или нет достойного донора) можно взять инвертор от SVC он довольно не дорогой и мощный, при этом может работать с авто батарейками, зарядный ток до 10А. Я на нем гоняю насосы котла и кондиционер в шкафу, иногда еще станок.  
    • @Александр2, это у тебя в голове что-то с чем-то вступает в противоречие.  Я знаю, что ты ярый поклонник Ланзара. Поэтому пояснение для тебя того, почему симметричная на бумаге/на экране монитора схема, и спаянная на реальной плате с реальными комплектующими в отличии от неё за редким исключением вместо 0 на выходе зачастую имеет сдвиг напряжения величиной в +/- километр, думается мне излишняя трата времени.    
    • Верно подмечено. Вот их-то, КТ602ВМ и BD139 в ТО-126 в 1969-ом как раз-таки и не было. Не только у J. L. Hood-а, их вообще ещё не существовало. К тому же КТ602БМ  в корпусе КТ-27-2 (как и BD139 в TO-126) и КТ602А в корпусе КТЮ-3-9 - это совсем не близнецы-братья. Технология изготовления совершенно разная, а она при работе транзисторов динамическом режиме, как в случае с JLH-69, играет далеко не последнюю роль. Просто юноша в силу своего быстрого и раннего развития об этом ничего не знает. 
    • Садится разбираться в алгоритме работы и на микроконтроллере делать замену.  Попробуйте прогреть микросхему на зажигалке, когда-то читал о таком способе восстановления процессора от телевизора. Шансов мало, но вам нечего терять, а потом в панельку.
×
×
  • Создать...