Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
/*------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* Функция initialize_lcd производит начальную установку режимов дисплея */
/*-----------------------------------------------------------------------*/
void initialize_lcd(void) {
delay_5ms();
delay_5ms();
delay_5ms(); //задержка 15 мс
putcommands(0x38); //команда установки формата интерфейса обмена
delay_5ms();
putcommands(0x38);
delay_l00us();
putcommands(0x38);
putcommands(0x38) ;
putcommands(0x0C);
putcommands(0x01); //очистить дисплей
putcommands(0x06); //установить режим ввода с автоматическим
//увеличением адреса
//символа на 1
putcommands(0x0E); //включить дисплей, режим курсора мигающий
putcommands(0x02); //установить курсор на первое знакоместо
}
/*---------------------------------------------------------------------*/
/* Функция putchars производит запись одного кода символа в контроллер */
/*дисплея */
/*---------------------------------------------------------------------*/
void putchars(unsigned char с) {
DDRP = 0xFF; //установить порт PORT P на вывод
DDRDLC = DDRDLC | 0x0C; //установить разряды 2 и 3 порта PORT DLC на
//вывод
PORTP = с; //Выдать в порт PORT P код символа с
PORTDLC = PORTDLC | 0x08; //установить линию RS в 1
PORTDLC = PORTDLC | 0x04; //установить линию E в 1
PORTDLC = 0; //установить E и RS в 0
delay_5ms(); //задержка 5 мс
}
/*-----------------------------------------------------------------------*/
/*Функция putcommands производит запись одного кода команды в контроллер */
/*дисплея */
/*-----------------------------------------------------------------------*/
void putcommands(unsigned char d) {
DDRP = 0xFF; //установить порт PORT P на вывод
DDRDLC = DDRDLC|0x0C; //установить разряды 2 и 3 порта PORT DLC на
//вывод
PORTDLC = PORTDLC & 0xF7; //установить линию RS в 0
PORTP = d; //Выдать в порт PORT P код команды d
PORTDLC = PORTDLC | 0x04; //установить линию E в 1
PORTDLC = 0; //установить E и RS в 0
delay_5ms(); //задержка 5 мс
}
/*-----------------------------------------------------------------*/
/*Функция lcdprint производит запись строки символов в ОЗУ дисплея */
/*-----------------------------------------------------------------*/
void lcdprint(char *string) {
putcommands(0x02); //команда установки адреса на начало строки
while(*(string) != ' ') //вывести последовательно кода символов
{ //из памяти МК
putchars(*string);
string++;
}
}
/*-------------------------------------------*/
/* Функция delay_5ms формирует задержку 5 мс */
/*-------------------------------------------*/
void delay_5ms(void) {
int i;
for(i=0; i<50; i++) {
delay_l00us();
}
}
/*-----------------------------------------------------*/
/* Функция void delay_100us формирует задержку 100 мкс */
/*Частота системной шины равна 8 МГц */
/*-----------------------------------------------------*/
void delay_100us(void) {
int i;
for(i=0; i<50; i++) {
asm("nop"); //команда nop занимает 2 цикла
}
}
/*-----------------------------------------------------*/
5.6.3 Сопряжение МК с графическим ЖК дисплеем
В этом разделе мы рассмотрим типовой графический ЖК дисплей. Следуя логике предыдущего параграфа, мы сначала обсудим информационную модель графического дисплея, затем изучим электрические характеристики и временные диаграммы обмена встроенного контроллера управления этим дисплеем, в завершении — элементы программы для передачи данных из МК в контроллер дисплея. В конце параграфа мы предложим Вам набор полезных для обслуживания графического дисплея функций. При рассмотрении мы будем использовать конкретную модель дисплея AND1391ST. Однако полученные знания Вы сможете легко применить к другим распространенным моделям дисплеев. В главе 7 мы предложим Вам подробный полностью завершенный пример с графическим дисплеем (разд. 7.).
Информационная модель. AND1391ST — ЖК дисплей с разрешающей способностью экрана 128×128 пикселов. Встроенный контроллер управления обеспечивает работу дисплея как в символьном, так и в графическом режиме отображения. Возможно также сочетание этих двух режимов работы при выводе одной и той же картинки. При использовании символьного режима поле экрана дисплея делится на 16 строк по 16 символов в каждой строке (рис. 5.14). Для отображения каждого символа предоставляется поле знакоместа размером 8×8 точек, как показано на рис. 5.15. В качестве дополнительного может быть использован режим символьного отображения, при котором поле экрана дисплея делится на 16 строк по 21 символу в строке. В этом случае каждое знакоместо будет состоять из 6×8 точек. Размер знакоместа задается уровнем сигнала на входе FS контроллера дисплея. Набор кодов для формирования образа каждого символа (знакогенератор) хранится в постоянной памяти контроллера дисплея.
Рис. 5.14. Информационная модель графического ЖК дисплея в символьном режиме
Контроллер дисплея воспроизводит на экране образы символов, коды которых хранятся в ячейках оперативной памяти контроллера. Каждому знакоместу на экране дисплея поставлена в соответствие ячейка ОЗУ с определенным адресом. В процессе инициализации контроллера дисплея МК записывает адрес начала ОЗУ экрана. На рис. 5.14 этот адрес равен $1000. Все остальные адреса для ячеек символов вычисляются посредством указанных на рис. 5.14 кодов смещения. В процессе инициализации также указывается число символов в строке. В нашем примере мы используем режим отображения с 16 символами в строке. При этом размер знакоместа для символа (8×8) уже выбран на аппаратном уровне: вход FS контроллера присоединен к общему выводу источника питания.
старший полубайт младший полубайт 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 ! " # $ % & ' ( ) * + , - . / 1 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 2 @ A B C D E F G H I J K L M N O 3 P Q R S T U V W X Y Z [ ] ^ _ 4 ` a b c d e f g h i j k l m n o 5 p q r s t u v w x y z { | } ~Рис. 5.15. Таблица кодов символов для графического ЖК дисплея