Иcпользование ЖКИ индикаторов на базе контроллера HD44780 и его аналогов совместно с PIC-микроконтро
ЖКИ на базе контроллеров HD44780 являются эффективным средством отображения различной информации и могут с успехом применяться даже в любительских разработках. Наличие многих режимов вывода (скроллирование, курсоры, определяемые пользователем символы) позволяет разрабатывать удобные интерфейсы управления и устройства индикации.
Наличие 4-х битного режима вывода даёт возможность задействовать минимум портов микроконтроллера.
Довольно много информации по этим индикаторам можно найти в интернете, поэтому приведу пример ассемблерных процедур, вставленных в код на С, для 4-х битного режима, как представляющий наибольший интерес для разработчиков.
Схема включения:
PIC RB2 — LCD RS
PIC RB3 — LCD E
PIC RB4 — LCD B4
PIC RB5 — LCD B5
PIC RB6 — LCD B6
PIC RB7 — LCD B7
Помимо этого: LCD R/W — заземлить, LCD B0…LCD B3 — подключить к плюсу питания
через резисторы.
/*-------------начало примера-------------*/
.
.
.
char lcd_data;
/* вывод старшей тетрады байта данных */
void out_nibble() {
asm {
movwf _lcd_data ; байт данных должен быть в W
bcf PORTB, 4
btfsc _lcd_data, 4
bsf PORTB, 4
bcf PORTB, 5
btfsc _lcd_data, 5
bsf PORTB, 5
bcf PORTB, 6
btfsc _lcd_data, 6
bsf PORTB, 6
bcf PORTB, 7
btfsc _lcd_data, 7
bsf PORTB, 7
}
}
/* вывод байта в 8-ми битном режиме (требуется
только для инициализации ЖКИ) */
void wr_cmd(char cmd) {
asm {
bcf PORTB, 2 ; RS - down, пишем в IR
movfw param00_wr_cmd
call _out_nibble
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E - down
call _delay
}
}
/* вывод байта команды на ЖКИ */
void wr_cmd4(char cmd) {
asm {
bcf PORTB, 2 ; RS - down, пишем в IR
movfw param00_wr_cmd4
call _out_nibble
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E - down
call _delay
swapf param00_wr_cmd4, W ; меняем тетрады байта
call _out_nibble
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E - down
call _delay
}
}
/* вывод байта данных на ЖКИ */
void wr_data4(char data) {
asm {
bsf PORTB, 2 ; RS - up, пишем в DR
movfw param00_wr_data4
call _out_nibble
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E - down
call _delay
swapf param00_wr_data4, W ; меняем тетрады байта
call _out_nibble
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E - down
call _delay
}
}
/* задержка */
void delay() {
delay_ms(1);
}
.
.
.
/*-------------окончание примера-------------*/
В приведенных примерах не отслеживается флаг занятости (busy flag) контроллера HD44780, взамен этого процедуры вывода на ЖКИ имеют задержки; на это следует обратить внимание. Ниже приводится фрагмент программы на С, выводящую фрагмент знакогенератора на экран ЖКИ формата 2 строки по 16 символов.
/*-------------начало примера-------------*/
.
.
.
char i, ch;
/* инициализация ЖКИ в 8-ми битном режиме
(рекомендуется производителем) */
wr_cmd(0x28);
delay_ms(5);
wr_cmd(0x28);
delay();
wr_cmd(0x28);
delay();
/* инициализация ЖКИ в 4-х битном режиме */
wr_cmd4(0x28);
wr_cmd4(0x0c);
wr_cmd4(0x06);
ch = 0x20;
wr_cmd4(0x80); /* переход на первую строку экрана */
for (i=0; i<16; i++) {
wr_data4(ch); /* выводим символы */
ch++;
}
wr_cmd4(0xc0); /* переход на вторую строку экрана */
for (i=0; i<16; i++) {
wr_data4(ch); /* выводим символы */
ch++;
}
.
.
.
/*-------------окончание примера-------------*/