- Работа на 16x2 LCD дисплей
- Електрическа схема към интерфейсен LCD с микроконтролер STM8
- STM8 LCD библиотека - заглавен файл за STM8S103F3P6
- LCD програма за микроконтролер STM8S
- STM8 с LCD - Работи
Буквено-цифровият LCD дисплей 16x2 е най-често използваният дисплей сред любителите и ентусиастите. Дисплеят е много полезен, когато искате да покажете основна информация на потребителя, а също така може да помогне при тестване или отстраняване на грешки на нашия код. Този конкретен 16x2 LCD модул е лесно достъпен и е популярен от дълго време. Можете да научите повече за основите на 16x2 LCD модула в свързаната статия.
За да продължим с нашата серия от уроци за микроконтролер STM8, в този урок ще научим как да свързваме LCD с микроконтролер STM8. Преди това сме свързвали 16x2 LCD и с много други микроконтролери, уроците са изброени по-долу и можете да ги проверите, ако се интересувате.
Ако не сте запознати със STM8, проверете как да започнете със статията за микроконтролера STM8, за да разберете основите на платката на контролера и програмната среда. Няма да разглеждаме основите в този урок.
Работа на 16x2 LCD дисплей
Както подсказва името, LCD 16x2 ще има 16 колони и 2 реда. Така общо ще можем да покажем 32 знака на този дисплей и тези знаци могат да бъдат азбуки или цифри или дори символи. Прост 16x2 LCD pinout, който използваме в този урок, е показан по-долу -
Както можете да видите, дисплеят има 16 щифта и можем да го разделим на пет категории, захранващи щифтове, контрастни щифтове, контролни щифтове, щифтове за данни и щифтове с подсветка, както е показано в таблицата по-долу. Ще влезем в подробностите за всеки щифт, когато обсъдим схемата на този урок.
Категория | ПИН НЕ. | Име на ПИН | Функция |
Захранващи щифтове | 1 | VSS | Заземяващ щифт, свързан с заземяване |
2 | VDD или Vcc | Напрежение Pin + 5V | |
Контраст ПИН | 3 | V0 или VEE | Настройка на контраста, свързан към Vcc чрез променлив резистор. |
Контролни щифтове | 4 | RS | Регистрация Изберете ПИН, RS = 0 Команден режим, RS = 1 Режим на данни |
5 | RW | ПИН за четене / запис, RW = 0 Режим на запис, RW = 1 Режим на четене | |
6 | Е. | Активиране, импулс с висок до нисък импулс трябва да активира LCD | |
Пинчета за данни | 7-14 | D0-D7 | Data Pins, Съхранява данните за показване на LCD или командните инструкции |
Щипки за подсветка | 15 | LED + или A | За захранване на Backlight + 5V |
16. | LED- или K | Земя за подсветка |
На задната страна на LCD, както е показано на изображението по-долу, ще намерите две черни точки, вътре в които имаме HD44780 LCD драйвер за интегрална схема (обграден в червено). Нашият микроконтролер трябва да комуникира с тази интегрална схема, която от своя страна ще контролира какво се показва на течнокристалния дисплей. Ако ви интересува как точно всичко това работи, трябва да проверите работата на 16x2 LCD дисплей, където вече обсъдихме как работи LCD в детайли.
В този урок ще обсъдим електрическата схема и кода за показване на алфамерни символи (азбуки и цифри) на LCD дисплей 16x2, използвайки прости команди LCD_print _char и LCD_print_string . Тези команди могат директно да се използват в програмата след включване на нашия заглавен файл. Заглавният файл се занимава с всички повечето неща за вас, така че не е задължително да знаете как работи дисплеят или интегралната схема на драйвера HD44780.
Електрическа схема към интерфейсен LCD с микроконтролер STM8
Цялата STM8 LCD схема може да бъде намерена на изображението по-долу. Както можете да видите, връзката за STM8S103F3P6 контролер с LCD е много проста, ние имаме LCD дисплея, директно свързан към нашата платка, а ST-link също е свързан за програмиране на платката.
Захранващите щифтове Vss и Vcc са свързани към 5V щифта на платката STM8S, имайте предвид, че работното напрежение на LCD е 5V и е свързано за работа на 3.3V. Така че, въпреки че микроконтролерът STM8S103F3P6 работи на 3.3V, задължително е да имате 5V захранване за LCD, можете да избегнете това, като използвате IC контролер за зареждане, но няма да го обсъждаме в този урок.
След това имаме контрастния щифт, който се използва за задаване на контраста на LCD, свързали сме го с потенциометъра, за да можем да контролираме контраста. Използвахме 10k пот, но можете да използвате и други близки стойности, потът действа като потенциален разделител, за да осигури 0-5 V към контрастния щифт, обикновено можете да използвате и резистор директно, за да осигурите около 2.2V за разумен контраст стойност. След това имаме щифтове за нулиране (RS), четене / запис (RW) и Активиране (E). Пинът за четене и запис е заземен, защото няма да четем нищо от LCD, а само ще извършваме операции по запис. Другите два контролни щифта Rs и E са свързани съответно към щифтове PA1 и PA2.
След това имаме щифтове за данни DB0 до DB7. LCD 16x2 може да работи в два режима, единият е 8-битов режим на работа, където трябва да използваме всичките 8 пина за данни (DB0-DB7) на LCD, а другият е 4-битовият режим на работа, където са ни необходими само 4 щифтове за данни (DB4-DB7). Често се използва 4-битовият режим, тъй като изисква по-малко GPIO пинове от контролера, така че ние също използвахме 4-битов режим в този урок и сме свързали само пинове DB4, DB5, DB6 и DB7 към щифтове PD1, PD2, PD3, и PD4 съответно.
Последните два щифта BLA и BLK се използват за захранване на вътрешното светодиодно фоново осветление, като резистор за ограничаване на тока използвахме резистор от 560 ома. Програмистът ST-Link е свързан както винаги както в предишния ни урок. Направих пълната връзка на борда и настройката ми изглежда така, както е показано на изображението по-долу.
STM8 LCD библиотека - заглавен файл за STM8S103F3P6
Преди да пристъпим към електрическата схема, нека вземем заглавния файл на STM8 LCD от GitHub, като използваме следната връзка -
STM8S 16x2 LCD заглавен файл
Можете да изтеглите пълния репо и да получите файла stm8s103_LCD_16x2.h или да опростите кода от горната връзка. Докато настройвате проекта, не забравяйте да включите всички необходими заглавни файлове в директорията inc заедно с този заглавен файл.
Ако не сте сигурни как да добавите заглавните файлове и да компилирате програмата, следвайте видеото в долната част на тази страница. И ако ви интересува как работи кодът в заглавния файл, можете да проверите PIC с LCD урок. Заглавният файл, използван в този проект, е много подобен на този, обяснен там, така че няма да навлизаме в подробности за това.
LCD програма за микроконтролер STM8S
За демонстрацията ще програмираме нашия контролер STM8S да показва прост низ като “Circuit Digest” и след това ще увеличаваме стойност “Test” за всяка секунда във втория ред. Пълната програма може да бъде намерена в долната част на тази страница. Обяснението е следното.
Започваме нашата програма, като дефинираме щифтовете и добавяме необходимите заглавни файлове, както винаги. В нашата обсъдена по-горе електрическа схема ние сме свързали LCD_RS към PA1, така че сме го определили като LCD_RS GPIOA, GPIO_PIN_1. По същия начин направихме същото и за други щифтове. Ако те следват различна верига, уверете се, че сте променили съответно тези стойности.
#define LCD_RS GPIOA, GPIO_PIN_1 #define LCD_EN GPIOA, GPIO_PIN_2 #define LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 #define LCD_DB6 GPIOD "
След това в нашата основна програма сме декларирали променливите, необходими за този примерен код. Имаме тестова променлива, наречена test_var, която се инициализира до нула, ще увеличим променливата и ще я покажем на LCD. Символите d1 до d4 представляват 4-те цифри на тестовата променлива, тъй като нашият LCD не може директно да покаже int стойност, трябва да ги преобразуваме в символи.
// Декларации на променливи int test_var = 0; char d4, d3, d2, d1;
Функцията LCD_Begin () се използва за инициализиране на LCD. Тази функция ще инициализира всички необходими GPIO щифтове и също така ще настрои LCD дисплея в режим 16x2 LCD. Тогава имаме функцията LCD_Clear (), която се използва за изчистване на всички стойности на LCD, това ще изтрие всичко на LCD, така че да е чисто за записване на нови стойности. Тогава имаме функцията LCD_Set_Cursor (x, y), където x и y са позициите, на които трябва да напишем новия си символ. Например, (1,1) означава първи ред и първа колона, по същия начин (2,12) означава втори ред 12 колона, също. Имайте предвид, че тук имаме 2 реда и 16 колони, както обсъдихме по-рано.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Сега LCD е настроен, изчистен и курсорът е на мястото. Следващото нещо е да отпечатате нещо на екрана. Можем да използваме LCD_Print_String („Sample String“), за да отпечатаме низ на LCD и LCD_Print_Char (a), за да отпечатаме стойност на символа на LCD. В нашата програма тук отпечатахме “STM8S103F3P3 LCD” и създадохме закъснение от 5 секунди, използвайки кода по-долу.
Lcd_Print_String ("STM8S103F3P3 LCD"); delay_ms (5000);
След 5 секундно закъснение изчистваме LCD отново и показваме „Circuit Digest“ на първия ред и „Test:“ I на втория ред.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuit Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Тест:");
Вътре в цикъла while ще разделим стойността на целочислената променлива test_var на отделни символи, така че тя да може да се покаже на LCD, използвайки прости оператори на разделяне и модул. Добавихме и „0“, за да преобразуваме ASCII стойността в знака.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
След това сме задали курсора на (2,6), защото вече сме написали „Тест:“ на втория ред, който е 6 знака. Ако презапишем, съществуващият знак ще бъде заменен с нов знак на LCD. Също така сме добавили закъснение 1 секунда и увеличаваме променливата.
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); delay_ms (1000); test_var ++;
STM8 с LCD - Работи
За да тествате нашата програма, просто качете кода на нашия контролер и го включете с микро-USB порта. Имайте предвид, че LCD изисква 5V за работа, така че е задължително захранването на платката от USB порта. Преди това го захранвахме директно от ST-link, защото не се нуждаехме от 5V захранване.
Както можете да видите, LCD работи както се очаква, като стойността на пробната променлива се увеличава приблизително за всяка секунда. Също така имайте предвид, че не сме използвали таймери и сме използвали само функцията за забавяне, за да създадем това забавяне, така че не очаквайте продължителността на забавянето да бъде точна, ще използваме таймери по-късно в друг урок за тази цел.
Пълната работа на проекта може да бъде намерена във видеото, свързано по-долу. Надявам се, че ви е харесал урока и сте научили нещо полезно. Ако имате въпроси, оставете ги в раздела за коментари или използвайте форумите ни за други технически въпроси.