Задание 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. Перемещение текста выполняется посредством изменения начального адреса отображения текста. Остальная логика работы программы описана в комментариях и в дальнейших пояснениях не нуждается. |