Интерфейсы периферийных устройств. Параллельный интерфейс ввода-вывода. Принципы построения параллельных портов ввода/вывода микроконтроллеров, страница 7

unsigned char RecvByte(void) // ввод байта{...}

void main(void)

unsigned char ch, ch1, ch2;

int I;

init(); // инициализация COM-порта

while(1);

{        I2CM=1; // режим мастера

start();

ch=0xAO;

SendByte(ch); // передача адреса

ch=0x02; // адрес регистра с секундами

SendByte(ch);

start();

ch=0xA1; // прием информации

SendByte(ch);

ch=RecvByte; // прием байта с секундами

Noack(); // нет ответа от МК

stop();

ch1=((ch>>4)&0xF)+0x30; // перевод двоично-десятичного кода в ASCII

ch2=(ch&0xF)+0x30; // выделяем только младшие байты

Wsio(ch1);Wsio(ch2);

for(I=0; I<10000; I++)

Delay();

}

Часы реального времени PCF8583

4.3.7. Подключение жидкокристаллического индикатора к миктроконтроллеру.

Жидкокристаллический индикатор WH1602D-NGK-CP

Для работы ЖКИ используются 2 регистра:

  • регистр управления

Находится по адресу 080006h (внешняя память)

Биты регистра управления

Бит

Название

Описание

0

E

Наличие положительного импульса на входе E фиксирует данные на шине данных (сигналы RW, RS к этому моменту должны быть установлены)

1

RW

Переключение шины данных ЖКИ

1 – чтение

0 – запись 

2

RS

0 – переключение в режим команд

1 – переключение в режим данных 

3

Reserved

Необходимо при каждой записи в разряд установить 1

  • регистр шины данных

Адрес 080001h во внешней памяти. 8битные данные и команды.

В модуле ЖКИ встроен контроллер, который имеет два 8битных регистра:

  • регистр команд (хранит коды операций(очистка, перемещение курсора) и информацию об адресах памяти отображаемых данных)
  • регистр данных

Там же есть память данных DDRAM для хранения данных, выводимых на экран. Счетчик адреса назначает адрес памяти DDRAM.

Схема соответствия между адресом DDRAM и позициями ЖКИ

00     01     02     03     04     05     06     07     08     09     0A    0B    0C     0D    0E    0F                  

40     41     42     43     44     45     46     47     48     49     4A    4B    4C     4D    4E    4F

 
Две строки по 16 символов в каждой

R/W – всегда 0 – только записываем

RS – запись данных в память

I/D – 0 или 1 – сдвиг вправо или влево

sh – 1 – разрешает сдвиг

D – включить/выключить

C – 1 – курсор отображается

0 – не отображается

L – 0 низкий уровень

H – 1 высокий уровень

Символ 1: в шестнадцатеричном коде 0x31

Функции работы с ПЛИС MAX3064

  1. Запись в регистр regnum

void WriteMax(unsigned char xdata *regnum, unsigned char val)

{

DPP=0x8;

*regnum=val;}

  1. Чтение из регистра

unsigned char ReadMax(unsigned char xdata *regnum)

{

unsigned char val=0;

DPP=0x8; // 8 страница внешней памяти

val=*regnum;

return val; }

  1. Формирование импульса на входе E ЖКИ. По этому импульсу происходит передача команд или данных.

void strobe(char c)

{unsigned int i;

WriteMax(0x6, c | 0x1); // E=1

WriteMax(0x6, c&0xFF); // E=0

for(i=0; i<300; i++) continue; // пауза 2 мс

}

c – const если с=0x8 (RS = 1000) – запись команды;

если c=0xc (RS = 1100)– запись данных.

  1. Функция очистки

void LCD_clear(void)

{int i;

WriteMax(0x1, 0x1); // выставить код на шине данных 00000001 (команда очистки)

strobe(0x8); // запись команды

for(i=1; i<300; i++) continue; }

  1. Установка текущей позиции символа

void LCD_GotoXY(unsigned char x, bit y)

{int i;

WriteMax(0x1, 0x80 | (x+((y)?0x40:0))); // 0х1-адрес во внешней памяти, 0х80-единица в 7м бите определяет команду записи адреса, x – номер позиции, y – строка 0 или 1

strobe(0x1);

for(i=1; i<6000; i++) continue; // пауза на время выполнения команды

}

  1. Вывод символа на дисплей

void LCD_Putch(char ch)

{WriteMax(0x1, ch);

strobe(0xC); }

  1. Установка режима дисплея

D – 1 – включить дисплей

0 – выключить дисплей

C – 1 – отображать курсор

0 – выключить курсор