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

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


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);

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

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

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

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

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

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

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

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

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

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

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 пользователей онлайн

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