Jump to content

Recommended Posts

#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>

#define RS PINC0
#define EN PINC1
// Функция передачи команды
void lcd_com(unsigned char com)
{
	PORTC &= ~(1 << RS); // RS = 0 (запись команд)
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; //обнуляем 0:4 пины порта Д
	PORTD |= (com >> 4); // старший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; //обнуляем 0:4 пины порта Д
	PORTD |= (com & 0x0F); // младший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
}
// Функция передачи данных
void lcd_data(unsigned char data)
{
	PORTC |= (1 << RS);PORTC|=(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD)
	PORTD &= 0xF0; PORTD |= (data >> 4); // старший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
	PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
	PORTD &= 0xF0; PORTD |= (data & 0x0F); // младший нибл
	_delay_us(100);
	PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
	_delay_us(100);
}
//функция передачи строки
void lcd_string (const char str1[])
{
	wchar_t n;
	for(n=0;str1[n]!='\0';n++)
	lcd_data(str1[n]);
}
//функция вывода чисел
void lcd_chisla(unsigned int chislo)
{//делим число и выводим посимвольно в buffer, buffer[2] значение запятой
	unsigned char buffer[5]={'0','0',',','0',0};
	buffer[0]=(chislo/100)+'0';
	buffer[1]=((chislo%100)/10)+'0';
	buffer[3]=(chislo%10)+'0';
	for (unsigned char i=0;i<5;i++)
	{
		lcd_data(buffer[i]);
	}
}
//функция позиционирования курсора
void lcd_poz(unsigned char x)
{
	char adress;
	adress=x|0b10000000;//set DDRAM adress дш стр24
	lcd_com(adress);
}
//функция инициализации дисплея
void lcd_ini(void)
{
	_delay_ms(15);
	// Конфигурирование четырехразрядного режима
	PORTC |= (1 << PIND1);
	PORTC &= ~(1 << PIND0);
	// Активизация четырехразрядного режима
	PORTC |= (1 << EN);
	PORTC &= ~(1 << EN);
	lcd_com(0x20); //0b00100000 - 4 разрядная шина, 1 строки
	_delay_ms(40);
	lcd_com(0x08); // 0b00001000 полное выключение дисплея
	_delay_ms(40);
	lcd_com(0x01); // 0b00000001 очистка дисплея
	lcd_com(0x06);  //0b00000110 - курсор движется вправо, сдвига нет
	_delay_ms(40);
	lcd_com(0x0C);  //0b00001100 - дисплей включен, курсор выключен, мерцание выключено
	_delay_ms(40);
}
//функция очистки дисплея
void lcd_clear (void)
{
	lcd_com(0b00000001);
}

void port_ini (void)
{
	DDRD|=0xFF;
	DDRB|=0xFF;
	DDRC|=0xFF;
	PORTD|=0;
	PORTB|=0;
	PORTC|=0;
}
int main(void)
{
	port_ini();
	lcd_ini();
	while (1)
	{	
		lcd_poz(0);
		lcd_string("i love maria");
	}
}

вот вся портянка

Share this post


Link to post
Share on other sites
Posted (edited)
_delay_ms(20); //Ждем 15 мс (стр 45)
	sendhalfbyte(0b00000011);
	_delay_ms(4);
	sendhalfbyte(0b00000011);
	_delay_us(100);
	sendhalfbyte(0b00000011);
	_delay_ms(1);
	sendhalfbyte(0b00000011);
	_delay_ms(1);
	sendhalfbyte(0b00000010);
	_delay_ms(1);
		
	sendbyte(0b00101000,0); //0-0-1-DL-N-F-0-0,(4бит-режим DL=0) и (2 линии N=1, N=0 1 линия), (F=0 размер символов 5*8 точек F=1 размер 5*10)
	_delay_ms(1);
	sendbyte(0b00001100,0); //0-0-0-0-1-D-C-B,(включаем изображение на дисплее (D=1 вкл D=0 выкл),курсор выкл=0 вкл=1 (C-подчеркивание, B-квадрат)
	_delay_ms(1);
	sendbyte(0b00000110,0); //0-0-0-0-0-1-I/D-S,(I/D=0 счетчик адреса уменьшается =1 увелич.(S=0 сдвиг экрана не будет,S=1 сдвиг производится согласно I/D
	_delay_ms(1);
	clearlcd();//стереть дисплэй

Я полагаю у вас не верная инициализация дисплея. Нужна вот такая последовательность.. sendhalfbyte(0b00000011); функция отсылает 1-е 4 бита.(0-3)

Edited by Demonrostov

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

8 минут назад, Дмитрий Мамедиев сказал:

но она работает с передачей через порты 4:7

так сделай чтобы работала через 0:3, а не тупо вытри из процедуры инициализации

1 час назад, Дмитрий Мамедиев сказал:


//функция инициализации дисплея
void lcd_ini(void)
{
	_delay_ms(15);
	// Конфигурирование четырехразрядного режима
	PORTC |= (1 << PIND1);
	PORTC &= ~(1 << PIND0);
	// Активизация четырехразрядного режима
	PORTC |= (1 << EN);
	PORTC &= ~(1 << EN);
}

 

Конфигурирование четырехразрядного режима куда делось?

Share this post


Link to post
Share on other sites
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

13 минуты назад, Дмитрий Мамедиев сказал:

но она работает

Может оно и работает, но закрывая на не правильную (согласно даташиту) инициализацию, вы закладываете себе на будущее  непонятки типа "как, оно же работало!".  Один дисплей может работать, второй нет....Один протеус реагирует на код так другая версия уже может по другому.

Share this post


Link to post
Share on other sites

Вам никто не поможет, пока вы сами не начнете делать сразу правильно, а не так "как вроде работает".

Share this post


Link to post
Share on other sites
Только что, Дмитрий Мамедиев сказал:

я только изменил в lcd_com и lcd_data порядок передачи полубайта

Это как? Порядок есть порядок, его менять не надо...

Share this post


Link to post
Share on other sites

Ошибка инициализации есть. Почитайте даташит. Ее надо исправлять.

Share this post


Link to post
Share on other sites
26 минут назад, Дмитрий Мамедиев сказал:

да ничего я не вытирал из инициализации.

да ну? передача первых четырех ниблов (команды 0х3 и 0х2) из твой портянки куда делась?

1602.thumb.png.a40df6dc218a0ae5a936c92661da75c8.png

Share this post


Link to post
Share on other sites
19 минут назад, Дмитрий Мамедиев сказал:

lcd_com и lcd_data

Вы не заметили, что эти функции практически одинаковы и отличаются только RS сигналом, так может их стоит объединить и добавить еще один параметр (команда, данные)...И партянка станет короче:rolleyes:

Share this post


Link to post
Share on other sites
void lcd_ini(void)
{
	_delay_ms(15);
	lcd_com(0x3);
	_delay_ms(5);
	lcd_com(0x3);
	_delay_us(100);	
	lcd_com(0x3);//0b00100000 - 4 разрядная шина, 1 строки
	lcd_com(0x2);//очистка дисплея, курсор невидим и не мигает
	lcd_com(0x8);// 0b00000001 очистка дисплея
	lcd_com(0x6);//0b00000110 - курсор движется вправо, сдвига нет
	lcd_com(0xC);//0b00001100 - дисплей включен, курсор выключен, мерцание выключено
}

вот с этим заработало. 

Share this post


Link to post
Share on other sites
11 минуту назад, Дмитрий Мамедиев сказал:

вот с этим заработало. 

лапшу на ущи не вешай.

Share this post


Link to post
Share on other sites

ну если не вешаешь расскажи, что ты там передал в ЖКИ этой командой  lcd_com(0x3); или этой lcd_com(0x2); и что надо было передать, обиженный ты наш

Share this post


Link to post
Share on other sites

Вы там ни че не напутали? После прошивки идет верификация и если нет ошибок значит все хорошо. Ошибка в программе или нерабочий пин.

Share this post


Link to post
Share on other sites

То что программа скомпилировалась не означает что она рабочая.

Share this post


Link to post
Share on other sites

Добрый день!

Раньше имел дело только с дисплеями 1602 и nokia 5110.

Сейчас попал в руки дисплей PG24122 (интернет определяет его как GM24122S1RH).

PG24122_front_640.jpg.8df3afca6cc6fa2b81c53a32c67f51e3.jpgHTB1cFvTJFXXXXcaXVXXq6xXFXXXx.jpg.2b7a9b2946bfbaab83c042a831e4562f.jpg

Описание: http://megtestesules.info/hobbielektronika/cuccok.html

LCD Module Specification: http://megtestesules.info/hobbielektronika/cuccok/HE001/GM24122S1RH-J6.pdf

1365847185_.PNG.e3d8fc9d53abeab008f5ad30461ca31e.PNG

Продается на алиэкспресс: https://ru.aliexpress.com/item/32814247150.html

Это всё, что я смог найти в сети про этот дисплей.

Может кто-то научить, как подключить его к Ардуино или Атмега?

Спасибо!

Share this post


Link to post
Share on other sites

У меня примерно с таким же интерфейсом от древнего ноута есть дисплей. Дело в том что тут не всё так просто. У дисплея есть память только на одну строку, а всю картинку должен держать в себе контроллер. По всей видимости, логически дисплей состоит из двух частей - верхней и нижней половины с независимыми регистрами строк. Каждая часть из себя представляет регистр строки в который ты побитно через SD1 и SD2 с общим клоком CP заносишь данные на одну строку(длину строки в битах х.з. какая у этого дисплея можно определить практически либо с маркировки но думаю что кратная 8) потом выдаёшь сигнал LOAD(типа строчный синхросигнал), и содержимое записывается в транзисторы TFT-матрицы и переключается на следующую строку. Заряд на них держится... какое-то время, от секунд до минуты. Когда загрузил все строки, выдаётся сигнал FRAME(это типа кадровой развертки в телевизоре), счетчик строк обнуляется и всё идет сначала. По-хорошему, сигнал надо выдать в начале отрисовки дисплея.

Общий провод и +5в - понятно куда подключать, VLCD и VADJ всё-таки надо смотреть в даташит, в моём дисплее от ноута там было порядка -19В и на контрасте -21В или наоборот. У этого дисплея поидее должно быть меньше, но надо уточнять.

ME(M) это вход частоты перекллючения ЖК ячеек дисплея... поидее туда надо меандр в диапазоне 10-20Гц. Чем быстрее переключаешь тем отзывчивей дисплей но выше энергопотребление. Можно попробовать в эконом режиме 1-2Гц но может наяать неприятно мерцать.

К мелкому контроллеру не подключишь... тут надо много RAM.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


×
×
  • Create New...