Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

Мы научились: управлять микроконтроллером и управлять чем то, при помощи микроконтроллера. Теперь, чтобы сделать наше устройство более дружелюбным, будем к нему подключать дисплей.

Сразу оговорюсь дисплей — символьный. Это значит что внутри у него, в памяти, уже есть алфавит. Все что нам нужно — дать команду вывести строку.

Дисплеи бывают разные: разный цвет подсветки экрана, разное количество строк, разное количество символов в строке. Поэтому, здесь рассматривается дисплей WH0802A-YGK-CT, 2 строки по 8 символов, подсветка желтая светодиодная.

Создадим проект в CodeVision. На вкладке LCD укажем порт, к которому будет подключен наш дисплей (PORTD). В строке Char/Line указываем количество символов нашего ЖК дисплея (8).

Генерируем, сохраняем проект. Приводим код к следующему виду:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <mega8.h>
 
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h> 
 
void main(void)
{
PORTD=0x00;
DDRD=0x00;
lcd_init(8);
 
while (1)
{
 
};
}

Добавились новые строчки

#asm
.equ __lcd_port=0x12
#endasm
Дисплей подключен к PORTD
#include <lcd.h> Библиотека для работы с LCD дисплеями

 

Немного изменим код нашей программы:

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
 #include <mega8.h>
 
#asm
.equ __lcd_port=0x12
#endasm
#include <lcd.h>
 
void main(void)
{
 
PORTD=0x00;
DDRD=0x00;
 
lcd_init(8);
 
lcd_gotoxy(0,0);
lcd_putsf("lesson3");
 
#pragma rl+
lcd_gotoxy(0,1);
lcd_putsf("Урок3");
#pragma rl-
 
while (1)
{
 
};
}
lcd_gotoxy(0,0); Переставить курсор в координату ХУ,х – позиция по горизонтали,у – по вертикали
lcd_putsf(«lesson3»); Вывести слово lesson3 на LCD дисплей
#pragma rl+
lcd_putsf(«Урок3»);
#pragma rl-
Данная директива позволяет вывести на экран русский алфавит, при условии что дисплей его поддерживает

Запустим получившийся код на симуляцию в ISIS Proteus. Как видно первая строчка отображается правильно, а вот вторая кракозябами. Дело в том, что протеус не распознает русский алфавит и если ваш дисплей не будет поддерживать его, то на реальном дисплее тоже будут непонятные символы.

Теперь нужно опробовать все это на настоящем дисплее. Тут есть свои нюансы. Открываем даташит на наш дисплейчик и видим такую вот таблицу с распиновкой:

Наверное, тут все очевидно, но все же:

1 — Земля 0В.

2 — Питание +5В.

3 — Управление контрастностью. Подключается  через переменный резистор.

Светодиодная подсветка. Подключаем как обычный светодиод.

А — подключаем к «+» через токоограничивающий резистор, К — подключаем к «земле» (GND).

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

Внешний вид прошитого устройства

Файл прошивки и протеуса доступны тут

206 комментариев: Урок 3. Как подключить ЖК(LCD) дисплей к AVR микроконтроллеру

  • потому что вы каждый раз ложите в буфер новые значения, поверх друг друга

  • Столкнулся с проблемой. Использую функцию float, в которой считаю проценты потом вывожу на дисплей, например Y=%.0f\x25 , где x25 собственно значок процента»%», при симуляции в Протеусе, дисплей просто его не показывает, как будто его нет, может существует другой способ его вывести на дисплей, а то без него как-то не эстетично.

  • lcd_putchar(‘%’);

  • Спасибо.

  • Уважаемый администратор! Я копировал вашу программу для пробы, на протеусе все ок. Залил в мк, припоя lcd, информацию не выводит. Чистый экран. все спасена правильно, но установлен внутренний генератор на 8 МГц. Может быть ли в этом проблема? И какие фьюзбиты ещё должны быть отмечены галочки? Программную прямо из codevisionavr. За ранее спасибо!

  • контрастность крутили?

  • Да. С схемой вроде все в порядке. Экранчик 1602А 2×16 При пуске когда контроллер пустой на экране отражается тестовая верхняя строка. прошиваю мк, экранчик мигнул и пустой. 😯

  • вероятно инициализация вашего дисплея отличается от того что в библиотеке cavr

  • Как мне быть в этой ситуации? можно ли найти готовую библиотеку для этого LCD. или что-то можно корректировать в библиотеке? У Вас большой опыт помогите.
    Есть еще надписи 1602A и ниже QAPASS на али утверждали что он на камне HD44780.

  • Вот так на али написано было.
    ЖК-дисплей модуль с голубой Blacklight
    Широкий угол обзора и высокую контрастность
    Встроенный отраслевой стандарт HD44780 эквивалент ЖК Контроллер
    обычно используется в: копиров, факсов, лазерные принтеры, промышленных тестового оборудования, Сетевое оборудование, таких как маршрутизаторы и устройства хранения
    Тип НОК: персонажи
    может отображать 2-линии x 16-символов
    работать с 5 В DC
    модуль Размеры: 80 мм x 35 мм x 9 мм (приблизительно)
    Область просмотра размер: 64.5 мм x 15 мм (приблизительно)
    & #12288;
    ЖК-дисплей модуль x 1
    http://ae01.alicdn.com/kf/HTB1iltSRFXXXXcVaXXXq6xXFXXXH.jpg?size=86543&height=800&width=800&hash=8ab79d22fa2b5ee7e38dfa6c8f51e627

  • У меня в обвязки кварца стояли конденсаторы на 12 пик. Я их задел и экран запустился, там на 22 нужно ставить?

  • 18-22

  • Я долго ковырялся и наконец-то нашел! Экранчик оказался очень чувствительный к источнику питания. Сделал стабилизацию все ОК! Вам спасибо!
    Мне сайт ваш очень нравиться, огромное количество полезной инфы. Если у вас есть возможность, сделайте пожалуйста урок по i-button. считывание, запись и вывод на LCD и LED. Там заплет какой-то с с памятью МК. Просветите если можете. И еще раз Спасибо. 😛

  • Огромное спасибо за Ваши уроки!
    Возможно ли сделать так, чтобы одна из строчек дисплея !! LOAD OFF !! мигала?
    Установка задержек не помогают.
    Кусок кода:
    while (1)
    {
    if(PINB.1==0)
    {
    PORTB.0=1;
    lcd_gotoxy(0,3);
    lcd_putsf(» !! LOAD OFF !! «);
    }
    if(PINB.1==1)
    {
    PORTB.0=0;
    lcd_gotoxy(0,3);
    lcd_putsf(» <> «);
    }

  • выводите по очереди пустую строку и вашу строку

  • у меня вопрос к админу как написать на аtmel Studio7 русский текст?или другие значки есть какаято программа которая какбы мы наираем биты и ресуем в этой программе не можете подсказать? 8 бит свободных в этом дисплее они и ключевые.

  • можете просто посылать код символа

  • да я это имею ввиду буквы и любой рисунок оказывается можно прописать кодом в буфере.Ну а буфер освобождать в какойто момент времени.Вы когда часы описывали там значёк вот его и любой другой можно нарисовать.Если вы знаете какая программа это может сделать? То намекните.Или дайте если можете сссылку.

  • в статье про часы вроде все подробно описано. вообще там руками все просто, но можете взять какой нибудь графический редактор вроде paint.net нарисовать букву и уменьшить размер полотна. дальше просто заносите закрашенные биты в массив.

  • В Proteuse работает. На железе не работает. Почему?
    Как установить fuse для этого проекта?

  • Дисплей WH1602A-YYK-CTK. Показывает только квадратики.

  • проверяйте подключение

  • у меня вопрос если можете ответе.Я пытаюсь вывести бегущую строку на экран /*
    * Bobr AVR_M mega32a.c
    *
    * Created: 27.08.2017 6:53:20
    * Author : User
    */

    #define F_CPU 8000000UL//установка частоты контроллера ATMEGA16 8Мгц
    #include
    #include
    #include
    #include «lcd.h»
    #include
    #include
    #include
    #define btn_plus (PINC&1<<1)
    #define btn_minus (PINC&1<<7)
    #define FIRST_ADC_INPUT 0//деректива ввода первого вывода АЦП
    #define LAST_ADC_INPUT 2//последнего вывода АЦП
    #define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0< (LAST_ADC_INPUT-FIRST_ADC_INPUT))
    input_index=0;
    ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
    // Delay needed for the stabilization of the ADC input voltage
    _delay_us(10);
    // Start the AD conversion
    ADCSRA|=(1<a&&adc_data[1]>b&&adc_data[2]>c&&PIND&1<<6)
    {
    // PORTD|=(1<<7);
    bit1=1;
    // flag5=1;
    }

    else
    {
    //PORTD&=~(1<d)
    {
    flag7=1;
    }
    }
    if (flag7==1)
    {
    flag7=0;
    bit2=0;
    }
    if (bit1==1&&bit2==1)
    {
    PORTD|=(1<<7);

    }
    else
    {
    PORTD&=~(1<<7);

    }

    }
    ISR(TIMER0_COMP_vect)
    {
    TCNT0=0;//счетный регистр
    pauza++;

    //if (!(PINC&1<<0))
    //{
    // flag1=1;
    // pauza=0;
    //}
    //if ((flag1==1)&&(PINC&1<1500)
    {
    PORTD|=(1<1600)
    {
    PORTD&=~(1<500)
    //{
    //bit9=1;

    //}
    //if (bit9==1)
    //{
    //TCCR0=(0<<CS02)|(0<<CS01)|(0<<CS00);
    //}
    //if (bit9==0)
    //{
    // TCCR0=(1<<CS02)|(0<<CS01)|(1<12554)
    {
    //flag7=0;
    bit4=1;
    bit5=1;
    bit6=1;
    bit7=1;
    bit8=1;
    //bit9=0;

    }
    if (pauza_x>12900)
    {
    bit3=1;
    }
    if (bit3==1)
    {
    TCCR1B=(0<<CS12)|(0<<CS11)|(0<<CS10);
    }

    if (bit3==0)
    {
    TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
    }

    //if (bit9==0)
    //{
    // ADCSRA|=(1<<ADSC);
    //}
    //if (bit9==1)
    //{
    // ADCSRA|=(0<<ADSC);
    //bit1=0;
    //}

    }

    void init_PORTS()
    {
    DDRA|=(0<<0)|(0<<1)|(0<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
    PORTA|=(0<<0)|(0<<1)|(0<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
    DDRC|=(0<<0)|(0<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(0<<7);//настройка порта D на вход "0" и на выход "1"
    PORTC|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"

    DDRB|=0xFF;//
    PORTB|=0x00;//установка на выводах портаB
    DDRD|=(1<<0)|(0<<1)|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(0<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"
    PORTD|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(1<<6)|(0<<7);//установкана всех выводах порта D
    }
    void init_TIMERS()
    {
    TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
    TCCR1A=0;
    TCNT1H=0;
    TCNT1L=0;
    OCR1B=250;
    TCCR2|=(1<<CS22)|(0<<CS21)|(1<<CS20);
    TCNT2=254;
    OCR2=254;

    TCCR0=(1<<WGM01);
    TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
    TCNT0=0;//счетный регистр
    OCR0=200;//когда пдключаем вход OCR2 счёт идёт на этот вход
    TIMSK|=(1<<OCIE0)|(0<<OCIE1A)|(1<<OCIE1B)|(1<<OCIE2);
    TIFR=(1<<OCF0)|(0<<OCF1A)|(1<<OCF1B)|(1<<OCF2);//флаг прерывания таймера по сравнению
    }
    void init_ADC()
    {
    ADCSRA|=(1<<ADEN);
    ADCSRA|=(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    ADMUX |=(0<<REFS1)|(1<<REFS0);
    ADCSRA |=(1<<ADSC);
    }
    void INT_PIN()
    {
    GICR|=(1<<INT0);
    MCUCR|=(1<<ISC01)|(1<<ISC00);
    GIFR|=(1<<INTF0);

    }

    //unsigned int ADC_result(unsigned char adc_input)
    //{
    // ADMUX=adc_input | (ADMUX & 0xF0);
    //задержка для стабилизации входного напряжения
    // _delay_us(10);
    //начинаем преобразование (ADSC = 1)

    // ADCSRA=ADCSRA|(1<<ADSC);
    // while(ADCSRA & (1<<ADSC));//ждем, пока АЦП закончит преобразование (ADIF = 0)
    // return ADC;//ADC — содержит ADCH и ADCL
    //}

    int main(void)
    {
    a=eeprom_read_word(& save1);// чтение 2 байт
    b=eeprom_read_word(& save2);// чтение 2 байт
    c=eeprom_read_word(& save3);// чтение 2 байт
    d=eeprom_read_word(& save4);// чтение 2 байт

    init_PORTS();
    INT_PIN();
    init_TIMERS();
    init_ADC();

    lcd_init(LCD_DISP_ON);
    //lcd_clrscr();
    asm("sei");
    while(1)
    {

    if (!(PINC&1<<0))
    {
    flag1=1;
    }
    if ((flag1==1)&&(PINC&1<<0))
    {
    _delay_ms(20);
    n++; menu++;flag1=0;
    pauza=0;
    }
    if (n==1)
    {
    PORTD|=(1<<4);
    }
    if (n==2)
    {
    PORTD|=(1<<4);

    }
    if (n==3)
    {
    PORTD|=(1<<4);

    }
    if (n==4)
    {
    PORTD|=(1<<4);

    }
    if (n==5)
    {
    PORTD&=~(1<<4);

    //n=0;
    }
    if (n==6)
    {
    PORTD&=~(1<2)
    {
    pauza=0;

    if ( a==1023)
    {
    a=0;
    }
    a++;
    }
    }
    if (btn_minus==0)
    {
    if (pauza>2)
    {
    pauza=0;

    if (a==0)
    {
    a=1023;
    }
    a—;
    }
    }
    asm(«sei»);
    }
    if (menu==2)
    {
    asm(«cli»);

    if (btn_plus==0)
    {
    if (pauza>2)
    {
    pauza=0;

    if (b==1023)
    {
    b=0;
    }
    b++;
    }
    }
    if (btn_minus==0)
    {
    if (pauza>2)
    {
    pauza=0;
    if (b==0)
    {
    b=1023;
    }
    b—;
    }
    }
    asm(«sei»);
    }
    if (menu==3)
    {
    asm(«cli»);
    if (btn_plus==0)
    {
    if (pauza>2)
    {
    pauza=0;
    c++;

    if (c==1023)
    {
    c=0;
    }
    }
    }
    if (btn_minus==0)
    {
    if (pauza>2)
    {
    pauza=0;
    if (c==0)
    {
    c=1023;
    }
    c—;
    }
    }
    asm(«sei»);

    }
    if (menu==4)
    {
    asm(«cli»);
    if (btn_plus==0)
    {
    if (pauza>2)
    {
    pauza=0;
    d++;

    if (d==1023)
    {
    d=0;
    }
    }
    }
    if (btn_minus==0)
    {
    if (pauza>2)
    {
    pauza=0;
    if (d==0)
    {
    d=1023;
    }
    d—;
    }
    }
    asm(«sei»);

    }

    if (menu==0)
    {

    //asm(«cli»);
    // result=((20.00*adc_data[0])/1024.00);
    // asm(«cli»);
    //menu=0;

    // asm(«cli»);
    // result=((20.00*adc_data[0])/1024.00);
    lcd_clrscr();
    // asm(«cli»);

    lcd_gotoxy(0,0);

    // asm(«sei»);
    lcd_puts(«BobrAVR»);

    //asm(«sei»);

    //lcd_puts(«BobrAVR «);
    //sprintf(buf7,»i=%.2fa»,result);
    //lcd_gotoxy(9,0);
    // lcd_puts(buf4);
    //asm(«cli»);

    if (bit4==1)
    {

    if (adc_data[0]b&&adc_data[2]>c)
    {
    flag3=1;
    }
    }
    if (bit6==1)
    {

    if (adc_data[0]>a&&adc_data[1]c)
    {
    flag8=1;
    }

    }
    if (bit7==1)
    {

    if (adc_data[0]>a&&adc_data[1]>b&&adc_data[2]d)
    {
    flag4=1;
    }
    }

    if (flag4==1)
    {
    lcd_gotoxy(8,0);
    lcd_puts(«PEREGRUZ»);

    }

    if (adc_data[0]<a&&adc_data[1]<b&&adc_data[2]<c)
    {
    lcd_gotoxy(10,10);
    lcd_puts("OF");
    }
    else
    {
    lcd_gotoxy(10,10);
    lcd_puts("ON");
    }
    if (PIND&1<<2)
    {
    lcd_gotoxy(14,14);
    lcd_puts("NX");

    }
    else
    {
    lcd_gotoxy(14,14);
    lcd_puts("NZ");

    }

    if (PIND&1<<6)
    {
    lcd_gotoxy(12,12);
    lcd_puts("VX");
    }
    else
    {
    lcd_gotoxy(12,12);
    lcd_puts("VZ");

    }
    _delay_ms(50);
    // asm("sei");

    }

    if (menu==1)
    {
    //asm("cli");

    lcd_clrscr();
    sprintf(buf1,"a=%2d",a);
    lcd_puts(buf1);

    asm("cli");

    if (!(PIND&1<<3))
    {
    flag6=1;
    }
    if ((flag6==1)&&(PIND&1<<3))
    {
    _delay_ms(20);
    flag6=0;
    eeprom_write_word (& save1,a);
    }
    asm("sei");

    if (adc_data[0]<a)
    {

    lcd_gotoxy(0,9);
    lcd_puts("N");
    }
    else
    {

    lcd_gotoxy(0,9);
    lcd_puts("R");

    }
    r1=adc_data[0];
    lcd_gotoxy(2,1);
    sprintf(buf4,"a1=%2d",r1);
    lcd_puts(buf4);

    _delay_ms(50);
    asm("sei");

    }
    if (menu==2)
    {
    //asm("cli");

    lcd_clrscr();
    sprintf(buf2,"b=%2d",b);
    lcd_puts(buf2);

    asm("cli");

    if (!(PIND&1<<3))
    {
    flag6=1;
    }
    if ((flag6==1)&&(PIND&1<<3))
    {
    _delay_ms(20);

    flag6=0;

    eeprom_write_word (& save2,b);
    }
    asm("sei");

    if (adc_data[1]<b)
    {

    lcd_gotoxy(0,9);
    lcd_puts("N");
    }
    else
    {

    lcd_gotoxy(0,9);
    lcd_puts("R");

    }
    r2=adc_data[1];
    lcd_gotoxy(2,1);
    sprintf(buf5,"b1=%2d",r2);
    lcd_puts(buf5);

    _delay_ms(50);
    //asm("sei");

    }

    if (menu==3)
    {
    //asm("cli");

    lcd_clrscr();
    sprintf(buf3,"c=%2d",c);
    lcd_puts(buf3);
    asm("cli");

    if (!(PIND&1<<3))
    {
    flag6=1;
    }
    if ((flag6==1)&&(PIND&1<<3))
    {
    _delay_ms(20);
    flag6=0;
    eeprom_write_word (& save3,c);
    }
    asm("sei");

    if (adc_data[2]<c)
    {
    lcd_gotoxy(0,1);
    lcd_puts("N");

    }
    else
    {
    lcd_gotoxy(0,1);
    lcd_puts("R");
    }
    r3=adc_data[2];
    lcd_gotoxy(3,1);
    sprintf(buf6,"c1=%2d",r3);
    lcd_puts(buf6);

    _delay_ms(50);
    //asm("sei");
    }
    if (menu==4)
    {
    //asm("cli");

    lcd_clrscr();
    sprintf(buf3,"d=%2d",d);
    lcd_puts(buf3);
    asm("cli");

    if (!(PIND&1<<3))
    {
    flag6=1;
    }
    if ((flag6==1)&&(PIND&1<d)
    {
    lcd_gotoxy(0,1);
    lcd_puts(«PR»);

    }
    else
    {
    lcd_gotoxy(0,1);
    lcd_puts(«RB»);
    }
    r3=adc_data[2];
    lcd_gotoxy(3,1);
    sprintf(buf6,»c1=%2d»,r3);
    lcd_puts(buf6);

    _delay_ms(50);
    //asm(«sei»);
    }
    if (menu==5)
    {
    lcd_clrscr();
    //lcd_gotoxy(0,0);

    asm(«cli»);
    //lcd_clrscr();

    //lcd_gotoxy(0,0);
    if (pauza>4)
    {
    //lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘R’);

    }

    // lcd_clrscr();
    // lcd_gotoxy(0,0);

    if (pauza>8)
    {
    //lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘V’);
    lcd_data(‘R’);

    }

    // lcd_clrscr();
    //lcd_gotoxy(0,0);

    //_delay_ms(50);
    if (pauza>12)
    {
    //lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘A’);
    lcd_data(‘V’);
    lcd_data(‘R’);

    }

    if (pauza>16)
    {
    //lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘r’);
    lcd_data(‘A’);
    lcd_data(‘V’);
    lcd_data(‘R’);

    }

    // lcd_clrscr();
    //lcd_gotoxy(0,0);

    if (pauza>20)
    {
    // lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘b’);
    lcd_data(‘r’);
    lcd_data(‘A’);
    lcd_data(‘V’);
    lcd_data(‘R’);

    }

    if (pauza>24)
    {

    //lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);
    lcd_data(‘A’);
    lcd_data(‘V’);
    lcd_data(‘R’);

    }

    if (pauza>28)
    {
    // lcd_clrscr();
    lcd_gotoxy(0,0);

    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);
    lcd_data(‘A’);
    lcd_data(‘V’);
    lcd_data(‘R’);
    // pauza=0;

    }
    //lcd_clrscr();

    if (pauza>32)
    {
    //lcd_clrscr();
    lcd_gotoxy(0,0);
    lcd_data(‘ ‘);

    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);

    lcd_data(‘r’);
    lcd_data(‘A’);
    lcd_data(‘V’);
    lcd_data(‘R’);
    //lcd_clrscr();

    }
    // _delay_ms(50);
    //if (pauza_x>200)
    // {
    // bit9=1;
    // }

    asm(«sei»);
    _delay_ms(50);

    // menu=0;
    }
    if (menu==6)
    {
    menu=0;

    }

    }
    }

  • Но у меня в протеусе немного не выходит.меню 5 там написана программа бегущей строки вернее на таймере.Мерцание в пустом месте.Может я не так что делаю?

  • мерцает из за того что очищаешь целиком экран часто

  • И что мне переписывать программу? хоть намикните что делать?

  • попробуйте затирать пробелами только те символы, которые перерисовываете

  • lcd_data(‘ ‘);вы имеете ввиду этот пробел всё равно не тот результат

  • по идее должно работать, затираешь символ — выводишь новый, потом следующий

  • Здравствуйте. Где можно скачать библеотеку lcd.h? А то в седьмой студии она отсутвует

  • если речь про atmel studio то ее там нет, она относится к CAVR, в CAVR ее в какой то версии переделали в alcd.h

  • Здравствуйте, помогите пожалуйста с модулем tm1637, понимаю что не в тему. Библиотеку для авр студио нашел, работает, а в кодевижин не хочет, знаний для переписания нет.

  • Можете посмотреть идеологию в статьях про статическую и динамическую индикацию http://avr-start.ru/?p=435 http://avr-start.ru/?p=491

  • у меня вышло сделать бегущую строку вот так.В протеусе всё как нужно в железе не пробовал.Без мерцания.Экспериментировал.Я не программист-экспериментатор.С наступающими праздниками вас любители и профи программисты!
    * Bobr AVR _mega32a.c
    *
    * Created: 27.08.2017 6:41:02
    * Author : User
    */

    #define F_CPU 8000000UL
    #include
    #include
    #include
    #include
    #include «lcd.h»
    #include
    //#include
    #define btn_menu (ADC_result(3)>300&&ADC_result(3)450&&ADC_result(3)550&&ADC_result(3)650&&ADC_result(3)<700)

    //#define btn_minus (PINC&1<960)
    {
    flag3=0;
    bit2=1;
    //PORTD|=(1<<7);

    }

    if (bit3==1)
    {
    TCCR0=(0<<CS02)|(0<<CS01)|(0<<CS00);
    }

    if (bit3==0)
    {
    TCCR0=(1<<CS02)|(0<<CS01)|(1<<CS00);
    }

    }

    void programa_2()
    {
    if (pauza_x==1)
    {
    PORTD|=(1<<5);
    }

    if (pauza_x==98)
    {

    PORTD&=~(1<<5);
    }

    }
    unsigned int ADC_result(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADMUX & 0xF0);
    //задержка для стабилизации входного напряжения
    _delay_us(10);
    //начинаем преобразование (ADSC = 1)

    ADCSRA=ADCSRA|(1<<ADSC);
    while(ADCSRA & (1<<ADSC));//ждем, пока АЦП закончит преобразование (ADIF = 0)
    return ADCW;//ADC — содержит ADCH и ADCL
    }
    void INT_PIN()
    {
    GICR|=(1<<INT0);
    MCUCR|=(1<<ISC01)|(1<<ISC00);
    GIFR|=(1<<INTF0);

    }
    void init_ADC()
    {
    ADCSRA|=(1<<ADEN);
    ADCSRA|=(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    ADMUX |=(0<<REFS1)|(1<<REFS0);
    ADCSRA |=(1<<ADSC);
    }

    int main(void)
    {

    a=eeprom_read_word(& save1);// чтение 2 байт
    b=eeprom_read_word(& save2);// чтение 2 байт
    c=eeprom_read_word(& save3);// чтение 2 байт
    d=eeprom_read_word(& save4);// чтение 2 байт

    DDRA=0x00;
    PORTA=0x00;
    DDRB|=0xFF;//
    PORTB|=0x00;//установка на выводах портаB
    DDRD|=(1<<0)|(0<<1)|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"
    PORTD|=(0<<0)|(1<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7);//установкана всех выводах порта D
    TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
    TCCR1A=0;
    TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00);
    TCCR2|=(1<<CS22)|(0<<CS21)|(1<<CS20);
    TIMSK|=(1<<OCIE0)|(1<<OCIE1B)|(1<<OCIE2);
    TIFR|=(1<<OCF0)|(1<<OCF1B)|(1<5)
    {
    // pauza_z=0;

    flag1=0;
    menu++;

    }

    asm(«sei») ;

    }
    if (r==1)
    {
    asm(«cli»);
    programa_2();
    asm(«sei») ;
    }
    if (r==2)
    {
    r=1;
    }
    if (menu==0)
    {
    lcd_clrscr();
    lcd_data(‘a’);
    lcd_data(‘v’);
    lcd_data(‘r’);

    _delay_ms(50);

    }
    if (menu==1)
    {
    if(btn_plus==1)
    {

    asm(«cli»);

    if (pauza_z>2)
    {

    pauza_z=0;
    if (a==1023)
    {
    a=0;
    }
    a++;
    }

    asm(«sei») ;

    }
    if (btn_minus==1)
    {
    asm(«cli»);

    if (pauza_z>2)
    {
    pauza_z=0;
    if (a==0)
    {
    a=1023;
    }
    a—;
    }
    asm(«sei») ;

    }

    }
    if (menu==3)
    {
    menu=0;

    }
    if (menu==1)
    {

    lcd_clrscr();
    lcd_gotoxy(1,6);
    result=ADC_result(3);
    sprintf(buf2,»a=%2d»,result);
    lcd_puts(buf2);
    lcd_gotoxy(6,9);

    sprintf(buf1,»a=%2d»,a);
    lcd_puts(buf1);
    lcd_gotoxy(0,0);
    lcd_data(‘a’);
    lcd_data(‘v’);
    lcd_data(‘r’);
    lcd_data(‘ ‘);
    lcd_data(‘m’);
    lcd_data(‘e’);
    lcd_data(‘n’);
    lcd_data(‘u’);

    _delay_ms(50);
    }
    if (menu==2)
    {

    asm(«cli»);

    if (pauza_z==1)
    {
    lcd_clrscr();

    lcd_gotoxy(0,1);

    lcd_data(‘r’);

    }
    //asm(«sei») ;
    //asm(«cli»);

    if (pauza_z==4)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    //asm(«sei») ;
    //asm(«cli»);

    if (pauza_z==7)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==10)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==13)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==15)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==18)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==21)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==23)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==26)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==29)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==32)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==35)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);

    }
    if (pauza_z==38)
    {

    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);
    }
    if (pauza_z==41)
    {

    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);
    }

    if (pauza_z==44)
    {

    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);
    }
    if (pauza_z==47)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    lcd_data(‘r’);
    }
    if (pauza_z==50)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    lcd_data(‘b’);
    }
    if (pauza_z==53)
    {

    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);
    lcd_data(‘o’);
    }
    if (pauza_z==56)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘B’);

    }
    if (pauza_z==59)
    {
    lcd_clrscr();
    lcd_gotoxy(0,1);

    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);
    lcd_data(‘ ‘);

    }
    if (pauza_z==60)
    {
    pauza_z=0;

    }
    _delay_ms(50);

    asm(«sei»);
    //_delay_ms(50);

    }

    }
    }

  • Здравствуйте! Я пытаюсь использовать в атмеге 8 порт D для вывода информации на LCD, но потребовалось использовать внешнее прерывание,оно тоже на порте D, порт B с кварцем, порт С — не полный. Я в CVAVR переназначил вывод и освободил int0, LCD в железе работает, а вот по int0 сомнение и в симуляторе AVR studio прерывание не работает. Проблема не может быть в стандартной библиотеке CVAVR? и вообще возможно ли использовать так свободный вывод порта МК?

  • не совсем понял ваш вопрос, если вам нужно внешнее прерывание, то для это выделены специальные ноги int*. если ног не хватает можете подключить дисплей через I2C расширитель портов.

  • Здравствуйте! Подскажите, как правильно вывести инкремент переменной на дисплей? Ну, типа i++

  • так же как и любую другую переменную

  • Добрый день
    я пытаюсь вывести на дисплей показания в процентах, максимум получается до 99%
    lcd_putchar(speed/10+0x30);
    lcd_putchar(speed%10+0x30);
    данная функция выводит на LCD только две цифры

    lcd_putchar(speed/100+0x30);
    lcd_putchar(speed/10+0x30);
    lcd_putchar(speed%10+0x30);
    выводит три цифры, но вторая не обнуляется, после цифры «9» показывает разные символы
    подскажите, пожалуйста, как можно выводить на экран более двух цифр
    и ещё хотелось бы понять как можно изменять отдельную цифру из, скажем, 5-ти значного числа, вроде набора пароля и т.д.

  • сделайте проверку в каком диапазоне число if(x > 9 && x < 99) тогда выводим 2 символа, 3 затираем пустым и тп

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика