МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар.

Задание 3. Команды ввода-вывода на языке Си для подключения GRAPH_LCD_M.





Исследуется следующая модель:

 

 

 

Микроконтроллер управляется программой:

 

#include "pic.h"

 

#define bitset(var,bitno) ((var) |= 1 << (bitno))

 

#define bitclr(var,bitno) ((var) &= ~(1 << (bitno))

 

// команды для управления LCD дисплея

const int CMD_SET_CURSOR = 0x21; //установить курсор

const int CMD_TXHOME = 0x40; // добавить текст в позицию

const int CMD_TXAREA = 0x41; //прочитать область из стейка

const int CMD_GRHOME = 0x42; //добавить текст

const int CMD_GRAREA = 0x43; //сформировать текст

const int CMD_OFFSET = 0x22; //добавить текст

const int CMD_ADPSET = 0x24; //

const int CMD_SETDATA_INC = 0x0C0; // записать в EEPROM

const int CMD_AWRON = 0x0B0; //начать запись в память

const int CMD_AWROFF = 0x0B2; //повторить запись в свободные ячейки строки

const int TEXT_NUM = 35; // количество символов сообщения

 

// текст a b c

const char textTable[35] =

{ 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, \

0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, \

0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, \

0x41, 0x00, 0x42, 0x00, 0x43 };

 

// объявление цифровых пинов работы на выход

void SetPortBOutput(void)

{ PORTB = 0x00;

bitset(STATUS, RP0);

TRISB = 0X00;

bitclr(STATUS, RP0);

}

 

//Переслать команду cmd в LCD

void SendCommand(char cmd)

{ SetPortBOutput();

PORTB = cmd;

PORTA = 0x0B;// получение от LCD команды о готовности работать (1011)

bitset(PORTA, 2);

}

 

//Переслать один байт данных в LCD

void SendDataByte(char databyte)

{ SetPortBOutput();

PORTB = databyte;

PORTA = 0X0A;// запомнить команду готовности (1010)

bitset(PORTA, 2);

}

 

//Переслать двухбайтное слово в LCD

void SendData(char highbyte, char lowbyte)

{ SendDataByte(lowbyte);

SendDataByte(highbyte);

}

 

//Инициализация LCD

void init(void)

{ bitclr(STATUS, RP0); // Выбор банка 0

PORTA = 0x00;

PORTB = 0x00;

bitset(STATUS, RP0); // Выбор банка 1

OPTION_REG = 0x80; // отключение подтягивающих резисторов

TRISA = 0x00; // установка портов А в режим выхода

TRISA = 0x00; // установка портов В в режим выхода

bitclr(STATUS, RP0); // выбрать банк 0

PORTA = 0x0F; // В случае готовности жди команду

// выбор позиции курсора при отсутствии команд

SendCommand( 0x9C );

//Установить начальный адрес области графики

SendData(0,0);

SendCommand(CMD_GRHOME);

 

// выбрать диапазон значений от стартового бита до 0x2941

SendData(0x29, 0x41);

SendCommand(CMD_TXHOME);

 

// Выбор режимакоманд управления OR или встроенного CG

SendCommand(0x80);

}

// Вывести текстовое сообщение ‘a b c ’ на дисплее

// задержать на время выдержки содержимое во встроенной памяти RAM LCD
//дисплея.

void DisplayLCDText(void)

{ int nIndex = 0;

SendData(0x29, 0x7D);

SendCommand(CMD_ADPSET);

SendCommand(CMD_AWRON);

 

for( nIndex = 0; nIndex<TEXT_NUM; nIndex++ )

{

SendDataByte(textTable[nIndex]);

}

 

SendCommand(CMD_AWROFF);

}

 

// Смещение вправо содержимого текста сообщения LCD начиная с 1-го символа
//текста

// смещение начинается с функции startAddrHigh и потом начинаются команды
//startAddrLow

// расположенные после numSteps.

void MoveTextRight(int startAddrHigh, int startAddrLow, int numSteps)

{

int nIndex = 0;

for( nIndex = 0; nIndex<numSteps; nIndex++ )

{

SendData(startAddrHigh, startAddrLow);

SendCommand(CMD_TXHOME);

startAddrLow--;

}

}

 

// Смещение влево содержимого текста сообщения LCD начиная с первого символа
//текста

// смещение начинается с функции startAddrHigh и потом начинаются команды
//startAddrLow

// расположенные после numSteps.

void MoveTextLeft(int startAddrHigh, int startAddrLow, int numSteps)

{

int nIndex = 0;

for( nIndex=0; nIndex<numSteps; nIndex++ )

{

SendData(startAddrHigh, startAddrLow);

SendCommand(CMD_TXHOME);

startAddrLow++;

}

}

 

void main()

{

init();

 

DisplayLCDText();

 

while( 1 )

{

MoveTextRight(0x29, 0x41, 20);

MoveTextLeft(0x29, 0x2D, 20);

}

}

 

 

Машинный код программы составляет 2,5К и здесь не приводится.

На экране наблюдаем строковое сообщение, движущееся вправо-влево.

 

Работа графического дисплея описана в справочной системе Multisim. Перемещение текста выполняется посредством изменения начального адреса отображения текста. Остальная логика работы программы описана в комментариях и в дальнейших пояснениях не нуждается.

 





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.