Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
1

По нажатию кнопки вывести данные на дисплей HD44780 ATMega16 AVR Studio GCC

03.05.2015, 19:33. Просмотров 2489. Ответов 9
Метки нет (Все метки)

Здравствуйте, уважаемые любители-программисты.
Нуждаюсь в небольшой помощи по программированию микроконтроллера.
Задача: необходимо по нажатию кнопки вывести данные на дисплей.
Программировать начал недавно, хоть и немного разобрался, но многое осталось для меня непонятным либо недостижимым. Схема выполнена в протеусе.
Короче говоря, вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define F_CPU 8000000UL
#include <avr/io.h>
#include "lcd.h"
int main(void){
    PORTA=0x07;
    lcd_init();  
    lcd_goto(0,0);  
    lcd_puts("Yровенb воgb|:");  
    lcd_goto(0,1);
    lcd_puts("__0");
    while(1){
        if (PINA0==0x01){
            lcd_goto(0,1);
            lcd_puts("_20");        
                if (PINA1==0x02){
                    lcd_goto(0,1);
                    lcd_puts("_40");
        }
        else{
            lcd_goto(0,1);
            lcd_puts("__0");
            }
    }
    for(;;){ }  //пожалуйста, объясните
    return 0;  //что значут эти две строчки
    }
}
дисплей не показывает никаких изменений, а как сделать очистку дисплея я не знаю
Подскажите пожалуйста.

Библиотека по инициализации дисплея у меня есть.
Единственное что я так и не смог найти это русскую кодировку для этого дисплея.
Хоть и говорили на каком-то форуме, что перекодировщиков "КУЧА", но я так и не смог найти ничего.
0
Миниатюры
По нажатию кнопки вывести данные на дисплей HD44780 ATMega16 AVR Studio GCC  
Вложения
Тип файла: rar 1.rar (22.6 Кб, 14 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2015, 19:33
Ответы с готовыми решениями:

Дисплей HD44780 и Atmega16
Написал код для вывода текста на дисплей HD44780 через мегу16 и все работало и строки выводил пока...

Работа с LCD дисплеем HD44780 из МК Atmega16 (GCC)
Здравствуйте, пытаюсь подключить LCD дисплей к микроконтроллеру, скачал библиотеку, но уже на...

ATMega16 (AVR Studio, ASM) - Вывести результат на светодиоды по схеме
Ребят, помогите, пожалуйста, с решением задачи, не получается вывести результат на светодиоды по...

Как вывести данные на дисплей nokia 5110 на мк AVR?
Объясните пожалуйста общий принцип работы. Знаю что частота тактирования не более 4Мгц. Если...

9
pyzhman
876 / 520 / 77
Регистрация: 15.05.2012
Сообщений: 3,030
04.05.2015, 08:06 2
Вы не назначили направление работы портаА, т.е. не определили содержимое регистра DDRA. Но в железе он после сброса будет работать на ввод, поэтому не столь страшно. А вот с регистром PORTA беда.
C
1
PORTA=0x07;
Здесь он будет подтягивать шины к питанию. А в схеме у вас они подтянуты к массе. Кто кого переборет - большой вопрос. Это касательно работы кнопок.
Далее вам нужно просто вывести
C
1
lcd_puts("Yровенb воgb|:");
Попробуйте просто её вывести, без кнопок.
По русификации. Кириллицей обладают МЭЛТовские ЖКИ. А в протеусе таких нет. Русифицировать можно, загнав в область памяти ЖКИ образы букв, а равно и других символов, вплоть до бессмысленных. Но сначала - вывести хоть что-то на экран.
0
pyzhman
876 / 520 / 77
Регистрация: 15.05.2012
Сообщений: 3,030
04.05.2015, 08:47 3
+ отследите скобки в программе.
+ проверьте верно ли подключена библиотека.
По идее должно выглядеть так (протестировал):
0
Миниатюры
По нажатию кнопки вывести данные на дисплей HD44780 ATMega16 AVR Studio GCC  
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
04.05.2015, 14:48  [ТС] 4
Цитата Сообщение от pyzhman Посмотреть сообщение
Попробуйте просто её вывести, без кнопок.
без кнопок все работает
у меня работает схема, если только одна кнопка. Т.е. кнопка не нажата выводит __0, кнопка нажата - _20, отпускаешь кнопку - __0. Если подключить в цикл еще одну - начинается какая-то чепуха. Либо вообще ничего не выводит при нажатии, либо начинает мигать выводя то __0 то _20

Добавлено через 8 минут
Цитата Сообщение от pyzhman Посмотреть сообщение
загнав в область памяти ЖКИ образы букв
да, вот я тоже так подумал. В принципе я вроде что-то накопал по русским символам, но там их мужик выводит, как я понял, как дополнительный символ, таблица пользовательских символов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#if (TYPE_DISPLAY==VFD)
 
extern u08 __flash table_users_chars [8*QUANT_USERS_CHARS]  = // Таблица пользовательских символов.
{
0x00, 0x04, 0x0E, 0x15, 0x15, 0x0E, 0x04, 0x04, // Ф
0x00, 0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E, // Ь
0x00, 0x08, 0x0C, 0x1E, 0x1F, 0x1E, 0x0C, 0x08,
0x00, 0x02, 0x06, 0x0F, 0x1F, 0x0F, 0x06, 0x02,
};
 
void def_users_chars (u08 __flash *ptr)
{
   lcd_send_com (1<<6);
 
   u08 a;
   u08 b;
 
   for (a = QUANT_USERS_CHARS; a > 0; a--)
   {
      for (b = 8; b > 0; b--)
      {
         lcd_send_data (*ptr);
         ptr++;
      }
   }
}
 
extern u08 __flash table_rus_chars [32] = // Таблица кириллицы. VFD поддерживает только
// заглавные русские буквы. И не все. Ф и Ь в таблице пользовательских символов.
{
0x41, 0x80, 0x42, 0x92, 0x81, 0x45, 0x82, 0x83, /*АБВГДЕЖЗ*/
0x84, 0x85, 0x4B, 0x86, 0x4D, 0x48, 0x4F, 0x87, /*ИЙКЛМНОП*/
0x50, 0x43, 0x54, 0x88, 0x00, 0x58, 0x89, 0x8A, /*РСТУФХЦЧ*/
0x8B, 0x8C, 0x8D, 0x8E, 0x01, 0x8F, 0xAC, 0xAD, /*ШЩЪЫЬЭЮЯ*/
};
но как это впилить в файл lcd.c я не знаю. Пробовал конечно, заменить эти 16-тиричные значения, на те которые написаны в lcd.c вот тут
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned char lcd_codepage[]=
{
  0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,
  0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8,
  0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,
  0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1,
  0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,
  0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,
  0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,
  0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
};
но он выводит японские иероглифы. Это проблема с кодировкой, нужен перекодировщик. Откуда его взять - я так ничего и не нашел

Добавлено через 35 минут
попробовал что-то исправить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define F_CPU 8000000UL
#include <avr/io.h>
#include "lcd.h"
int main(void){
    lcd_init();  
    PORTA=0x07;
    DDRA=0x00;
    lcd_goto(0,0);  
    lcd_puts("Yровенb воgb|:");  
    lcd_goto(0,1);
    lcd_puts("__0");
    while(1){
        if (PINA==0x06){
            lcd_goto(0,1);
            lcd_puts("_20");    
        if (PINA==0x05){
            lcd_goto(0,1);
            lcd_puts("_40");
        }
        else{
            lcd_goto(0,1);
            lcd_puts("__0");
            }
    }
    for(;;){ }  
    return 0;
    }
}
я не знаю, как сделать так, чтоб по активному 0-ому сигналу он выводил данные на дисплей

Добавлено через 12 минут
попробовал вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int main(void){
    lcd_init();  
    PORTA=0x07;
    DDRA=0x00;
    lcd_goto(0,0);  
    lcd_puts("Yровенb воgb|:");  
    lcd_goto(0,1);
    //lcd_puts("__0");
    while(1){
        if (PINA==0x06){
            lcd_goto(0,1);
            lcd_puts("_20");
        }
        else{
            lcd_goto(0,1);
            lcd_puts("__0");
            }
                        
        if (PINA==0x05){
            lcd_goto(0,1);
            lcd_puts("_40");
        }
        else{
            lcd_goto(0,1);
            lcd_puts("__0");
            }
    }
    for(;;){ }  
    return 0;
    }
но в этом случае, он выводит на дисплей _20 при нажатии на кнопку, но число 2 переключается на _ , получается мигание - то _20 то __0. Тоже самое и со 2-й кнопкой.
0
pyzhman
876 / 520 / 77
Регистрация: 15.05.2012
Сообщений: 3,030
04.05.2015, 19:06 5
Отслеживайте только состояние нажатия кнопок (момент появления сигнала о нажатом состоянии). И по этому состоянию выводите данные на дисплей. Тогда ничего моргать не будет.
Еще вариант - введите память состояния.
1
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
04.05.2015, 19:13  [ТС] 6
это вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int main(void){
    lcd_init();  
    PORTA=0x07;
    DDRA=0x00;
    lcd_goto(0,0);  
    lcd_puts("Yровенb воgb|:");  
    lcd_goto(0,1);
    //lcd_puts("__0");
    while(1){
        if (PINA==0x06){
            lcd_goto(0,1);
            lcd_puts("_20");
        }
                        
        if (PINA==0x05){
            lcd_goto(0,1);
            lcd_puts("_40");
        }
        else{
            if (PINA==0x06){
                lcd_goto(0,1);
                lcd_puts("_20");
            }
            else{
                lcd_goto(0,1);
                lcd_puts("__0");
            }
        }           
    }
    for(;;){ }  
    return 0;
    }
0
pyzhman
876 / 520 / 77
Регистрация: 15.05.2012
Сообщений: 3,030
05.05.2015, 12:16 7
Нет, не так. Строкой
C
1
if (PINA== nn)
вы отслеживаете либо нажатое состояние, либо отпущенное. А нужно состояние момента нажатия (или отпускания), т.е. фронт.
1
Ethereal
5302 / 2461 / 327
Регистрация: 17.02.2013
Сообщений: 3,513
05.05.2015, 13:02 8
Инициализация :
old_PINA = PINA ;

В главном цикле :
tmp = PINA ;
change_PINA = tmp ^ old_PINA ;
release_PINA = tmp & change_PINA ;
press_PINA = ~tmp & change_PINA ;
old_PINA = tmp ;

В итоге :
change_PINA - флаги изменения состояния кнопок (бит = 1 - кнопка отпускалась или нажималась, бит = 0 - ничего не происходило)
release_PINA - флаги отпускания кнопок (бит = 1 - кнопка отпускалась, бит = 0 - ничего не происходило)
press_PINA - флаги нажатия кнопок (бит = 1 - кнопка нажималась, бит = 0 - ничего не происходило)

Вот в таком вот аксепте.
1
Greem_Jow
0 / 0 / 1
Регистрация: 04.04.2013
Сообщений: 23
25.05.2015, 23:35  [ТС] 9
Спасибо большое за помощь.
Но у меня немного другая задача. Я кнопками имитирую замыкание. Получается тоже самое будет?

А как тогда условие будет выглядеть? Что-то не пойму...
0
pyzhman
876 / 520 / 77
Регистрация: 15.05.2012
Сообщений: 3,030
26.05.2015, 13:52 10
Если вы опрашиваете
C
1
PINA==0x06
весь байт, то сделайте так, чтобы незначащие биты не влияли на результат. В вашем случае это биты 7,6,5,4,3.
0
26.05.2015, 13:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2015, 13:52

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

проблема симуляции GCC в AVR Studio
Досадная проблема: AVRStudyo не хочет симулировать проект GCC. Компиляция проходит нормально, код...

Вывести данные из массива по нажатию кнопки
Здравствуйте! Уважаемые Форумчане, помогите найти ошибку в коде. Задача в следующем: ...

GCC и AVR Studio 5 и AVR Studio 4.18
Доброго дня Всем! Кто может подсказать следующее - у меня установлена AVR Studio 5 со встроеным...

По нажатию кнопки выдать последовательность прямоугольных импульсов скважностью 3 (ATmega16, ASM)
По нажатию кнопки SW1 подключенной к выводу PD2 начать выдавать последовательность прямоугольных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.