Задание 3.1. Вывести сообщение «smart students». Рабочая схема та же, что в задании 3. За основу возьмем рассотренную выше программу. #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 = 14; // количество символов сообщения // текст smart students const char textTable[35] = {0x53, 0x4D, 0x41, 0x52, 0x54, 0x00, 0x53, 0x54, 0x55, 0x44, \ 0x45, 0x4E, 0x54, 0x53}; // объявление цифровых пинов работы на выход 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); } } Текст сообщения содержится в массиве textTable. Внеся в него необходимые изменения, получим требуемый результат. В остальном логика работы программы остается неизменной. Задание 3.2. Написать на транслите (латинскими буквами) выражение длительностью до 35 символов. Будем использовать схему из задания 3. Транслит – это представление русских букв с помощью латинских Задание полностью аналогично предыдущему, поэтому приведем только необходимый фрагмент программы. Передвижение строки отключено за ненадобностью. const int TEXT_NUM = 23; // количество символов сообщения // текст «eto stoka na translite” const char textTable[23] = { 0x45, 0x54, 0x4F, 0x00, 0x53, 0x54, 0x52, 0x4F, 0x4B, 0x41, \ 0x00, 0x4E, 0x41, 0x00, 0x54, 0x52, 0x41, 0x4E, 0x53, 0x4C, 0x49, \ 0x54, 0x45 }; |