Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:отчеты по лабораторным работам / драйвер жки / lab_mello / lcd
.c/**
* @file lcd.c
* @brief
* @author h0rr0rr_drag0n <h0rr0rr_drag0n@vindekapets.ru
* @date 03 Ноябрь 2010 14:11:11
*
* Набор функций для работы с ЖКИ SDK1.1
*/
#include "define.h"
/**
* @brief Значение BF
*
* Функция возвращает значение флага занятости - BF
*/
unsigned char lcd_bfstate() {
unsigned char retval = 0x00;
write2plis(C_IND_ADDR, 0x03); /* RS=0 RW=1 E=1 */
retval = read_from_plis(DATA_IND_ADDR);
write2plis(C_IND_ADDR, 0x02); /* RS=0 RW=1 E=0 */
retval = retval >> 7;
return retval;
}
/**
* @brief Значение AC
*
* Функция возвращает значение счетчика адреса для DDRAM
*/
unsigned char lcd_acstate() {
unsigned char retval = 0x00;
write2plis(C_IND_ADDR, 0x03); /* RS=0 RW=1 E=1 */
retval = read_from_plis(DATA_IND_ADDR);
write2plis(C_IND_ADDR, 0x02); /* RS=0 RW=1 E=0 */
retval = retval & 0x7f;
return retval;
}
/**
* @brief Установка адреса в DDRAM
*/
void lcd_set_ddram_addr(const unsigned char addr) {
while(lcd_bfstate()) {}
write2plis(DATA_IND_ADDR, addr | 0x80);
write2plis(C_IND_ADDR, 0x01);
write2plis(C_IND_ADDR, 0x00);
return;
}
/**
* @brief Функция для очистки экрана ЖКИ
*
* В данной функции происходит очистка экрана и
* возврат курсора в начало строки.
*/
void lcd_clear() {
while(lcd_bfstate()) {}
write2plis(DATA_IND_ADDR, 0x01);
write2plis(C_IND_ADDR, 0x01);
write2plis(C_IND_ADDR, 0x00);
while(lcd_bfstate()) {}
write2plis(DATA_IND_ADDR, 0x06);
write2plis(C_IND_ADDR, 0x01);
write2plis(C_IND_ADDR, 0x00);
while(lcd_bfstate()) {}
write2plis(DATA_IND_ADDR, 0x0f);
write2plis(C_IND_ADDR, 0x01);
write2plis(C_IND_ADDR, 0x00);
return;
}
/**
* @brief Возврат курсора
*
* Возврат курсора в левый верхний угол экрана (координаты
* X: 0 и Y: 0)
*/
void lcd_creturn() {
while(lcd_bfstate()) {}
write2plis(DATA_IND_ADDR, 0x02);
write2plis(C_IND_ADDR, 0x01);
write2plis(C_IND_ADDR, 0x00);
return;
}
/**
* @brief Вывод символа на дисплей
*/
void lcd_putchar(const char c) {
unsigned char ddram_addr = lcd_acstate();
if ((ddram_addr > 0x0f) && (ddram_addr < 0x40)) {
lcd_set_ddram_addr(0x40);
}
while(lcd_bfstate()) {}
write2plis(DATA_IND_ADDR, c);
write2plis(C_IND_ADDR, 0x05);
write2plis(C_IND_ADDR, 0x04);
return;
}
/**
* @brief Вывод строки на дисплей
*
* Данная функция выводит С-строку символов на дисплей.
* Если строка "не влезает" в ЖКИ, то печатается лишь ее часть
*/
void lcd_puts(const char * s) {
unsigned char wr_chars = 0;
while ((s[wr_chars] != '\0') && (wr_chars <= 32)) {
lcd_putchar(s[wr_chars++]);
}
return;
}
/**
* @brief Переход в заданную позицию дисплея
*
* Функция для перевода курсора в заданные координаты.
* Если они некорректны, то ничего не происходит.
*/
void lcd_movcur(const unsigned char x,
const unsigned char y) {
if ((x > 15) || (y > 1)) {
return;
}
lcd_set_ddram_addr(x + 0x40 * y);
return;
}
Соседние файлы в папке lab_mello