Скачиваний:
26
Добавлен:
09.05.2014
Размер:
3.59 Кб
Скачать
/**
 * @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
  • #
    09.05.20140 б25ChangeLog
  • #
    09.05.201435.15 Кб25COPYING
  • #
    09.05.20141.08 Кб25define.h
  • #
    09.05.20140 б25INSTALL
  • #
    09.05.201412.75 Кб25lcd.asm
  • #
    09.05.20143.59 Кб26lcd.c
  • #
    09.05.201426.57 Кб25lcd.lst
  • #
    09.05.20144.82 Кб25lcd.rel
  • #
    09.05.201426.57 Кб25lcd.rst
  • #
    09.05.201429.01 Кб25lcd.sym
  • #
    09.05.201435.15 Кб25LICENSE