Главная страница
Навигация по странице:

  • Data. 2Q •

  • 4.17. ВЫВОД ИНФОРМАЦИИ НА ЖИДКОКРИСТАЛЛИЧЕСКИЙ ДИСПЛЕЙ

  • Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro


    Скачать 6.79 Mb.
    НазваниеУстройствауправления роботамисхемотехника и микроконтроллеров picmicro
    АнкорУстройства управления роботами, схемотехника и программирование (М. Предко, 2004).pdf
    Дата29.08.2017
    Размер6.79 Mb.
    Формат файлаpdf
    Имя файлаУстройства управления роботами, схемотехника и программирование .pdf
    ТипРеферат
    #8441
    КатегорияПромышленность. Энергетика
    страница17 из 33
    1   ...   13   14   15   16   17   18   19   20   ...   33
    VCC
    Vcc
    К выводу 3 ЖКИ
    (регулировка
    контрастности)
    Рис. 4.43
    Регулировка контрастности
    отображаемых символов
    ЖКИ
    Сдвиговый регистр
    Л
    Out6 1 К
    А
    L
    Г
    г
    4 RS
    Рис. 4.44. Двухпроводной интерфейс
    для подключения ЖКИ к микроконтроллеру

    Подключение к микроконтроллеру периферийных устройств 201
    В качестве сдвигового регистра можно использовать микросхему подключенный к старшему выходу регистра, и резистор сопротивлением 1 кОм,
    включенный между входом Data и выводом Е жидкокристаллического дисплея.
    Эти два элемента образуют соединение «Монтажное И».
    Приведенная схема подключения ЖКИ позволяет свести к минимуму количе- ство используемых выводов микроконтроллера, освобождая их для целей.
    Я предпочитаю использовать микросхему вместо специализирован- ного сдвигового регистра с последовательным входом/параллельным выходом,
    как раз предназначенного для применения в подобных случаях. Следует иметь в виду, что защелкивание входных данных в микросхеме происходит по переднему фронту тактовых импульсов.
    На рис. 4.45 показаны временные диаграммы сигналов в обсуждаемой схеме.
    Перед тем как начать запись данных, надо очистить регистр, установив все его выходы в нулевое состояние. Затем на вход Data подается бит который обеспе- чит подачу строба Е после заполнения регистра. После этого записываются бит
    R/S и, наконец, четыре бита данных (или команды), начиная со старшего. Для за- щелкивания в регистре очередного бита, действующего на входе подается импульс на линию Clock, с передним фронтом которого бит данных записывается в младший (на рис. 4.45 - верхний) разряд регистра, а все остальные разряды сдвигаются в сторону старшего (на рис. 4.45 — вниз). После записи последнего
    (младшего) бита на 6-м выходе регистра устанавливается строб Е; к этому време- ни все остальные выходные сигналы регистра примут правильные значения, ко- торые и будут записаны в
    Data.
    2Q

    3Q
    2Qo
    4Q
    3Qo
    4Qo
    2Qo
    6Q
    E _
    5Qo 4Qo
    Очистка регистра Загрузка регистра Строб
    Рис. 4.45.
    диаграммы сигналов интерфейса
    Применяется также трехпроводная схема подключения ЖКИ к микроконтрол- леру. Ее преимущество заключается в том, что нет необходимости очищать ре-
    | гистр побитно каждый раз перед началом записи очередного полубайта. В резуль- тате скорость записи возрастает более чем вдвое.
    Отечественный аналог -
    - Прим. перев.
    Подача строба Е осуществляется автоматически после заполнения регистра, для этого предназначен диод 1N914. Можно использовать любой диод, например, КД521. - Прим. перев.

    202 Устройства управления роботами
    При программировании микроконтроллера следует помнить, что импульс Е
    должен действовать не менее 450
    Нет необходимости запрещать обработку пре- рываний, пока микроконтроллер производит запись в регистр (если, разумеется,
    процедура обработки прерываний не изменяет состояния тех выводов микроконтрол- лера, к которым подключены линии Data и Clock нашей схемы). Заметим, что для подключения линий Data и Clock нельзя использовать выходы с открытым стоком.
    В документации указывается, какой фронт сигнала Е является активным: пе- редний (положительный) или задний (отрицательный). Если тактирование про- изводится задним фронтом, то в самом начале записи очередного полубайта вме- сто 1 на вход Data надо подавать 0.
    4.17. ВЫВОД ИНФОРМАЦИИ
    НА ЖИДКОКРИСТАЛЛИЧЕСКИЙ ДИСПЛЕЙ
    Здесь мы разработаем программу, управляющую выводом информации на жид- кокристаллический дисплей. Для подключения дисплея к микроконтроллеру бу- дем использовать простой двухпроводной интерфейс, аналогичный рассмотрен- ному в предыдущем разделе.
    В нашей схеме жидкокристаллический дисплей будет единственным перифе- рийным устройством, но для использования того же способа подключения в ре- альных конструкциях не придется переделывать ни схему, ни управляющую про- грамму.
    Принципиальная схема представлена на рис. 4.46, размещение элементов на макетной плате показано на рис. 4.47, а список элементов приведен в табл. 4.9.
    Vcc
    С2, С2 =
    Vcc
    МГц
    Vc
    OK
    П.
    с
    14
    +
    4 15 5
    U1
    PIC16F627/PIC16F84
    Vdd
    RB1
    RB2
    Osc1
    Vss
    V
    8 1,16
    77
    7 3
    Vcc/ CLR
    Q2/3C
    Q3/4D
    Q4/5D
    D1
    Gnd
    I
    5,6 7,11 10,13 12,14
    CR1 1N914
    R2 1 К
    жк и
    Рис. 4.46. Схема к микроконтроллеру

    Подключение к микроконтроллеру периферийных устройств 203
    Vcc
    /
    PIC16F627/
    а а а а а а а а в
    D п п
    а D
    п а аа
    Рис. 4.47. Схема размещения элементов на макетной плате
    4.9. Список использованных
    Обозначение
    CR1
    КЗ
    Элемент
    10
    0,25 Вт
    кОм; 0,25 Вт
    кОм,
    Примечание
    Микроконтроллер
    Сдвиговый регистр
    Любой кремниевый диод
    Для «подтягивания» напряжения на выводе
    до напряжения положительной шины питания
    Для регулирования контрастности
    Для фильтрации напряжения питания микросхем
    Жидкокристаллический
    дисплей
    выводов),
    совместимый с Hitachi 44780
    Керамический резонатор
    на 4 МГц, со встроенными
    конденсаторами
    Для генератора тактовых импульсов микроконтроллера
    Материалы
    Макетная плата, монтажные провода, источник
    питания +5 В
    * В скобках указаны отечественные
    добавленные при переводе. -
    перев.
    В качестве сдвигового регистра можно использовать микросхемы
    74LS374, 74LS373, 74LS573,
    По сравнению с вышеописанными конструкциями здесь появились новые эле- менты: диод и резистор, образующие соединение «Монтажное И», а также под- для регулировки контрастности. Кроме того, на плате при- аналоги К555ТМ9, ИР23, ИР22, ИРЗЗ. - Прим. перев.

    204 Устройства управления роботами шлось разместить жидкокристаллический дисплей. Чтобы можно было сэконо- мить на соединительных проводах, дисплей располагается вблизи резистора, используя те же шины Vcc и Gnd. Монтаж получился довольно плот- ным (по сравнению с предыдущими схемами), но все сделано для того, чтобы не затенять разводку соединений габаритными элементами.
    Текст управляющей программы вы найдете в файле Code\Lcd\lcd.c:
    // 27 января 2002 - вывод на жидкокристаллический дисплей
    // приветствия: "Hello
    //
    // Для подключения дисплея к микроконтроллеру используется
    // двухпроводной интерфейс на основе сдвигового регистра 74LS174.
    //
    // Используемые аппаратные средства:
    // микроконтроллер PIC16F84/PIC16F627,
    // тактовая частота 4 МГц,
    // используется керамический резонатор,
    //
    - линия Clock (тактирование),
    //
    - линия Data (данные).
    // Глобальные переменные и константы:
    int RTC = 0; // Счетчик реального времени.
    int static volatile bit Clock static volatile bit static volatile bit Data static volatile bit DataTRIS
    // Длительность задержки.
    @
    9
    9 (unsigned)&PORTB*8+2;
    char Message[13] = "Hello
    // Строка сообщения,
    // выводимого на дисплей.
    // Слово defined
    «warning PIC16F84
    PIC16F627
    CONFIG(Ox03F61);
    Unsupported selected
    // Для
    PIC16F84:
    // кварцевый тактовый генератор,
    // таймер PWRT включен,
    // сторожевой таймер выключен,
    // защита кода отключена.
    with internal oscillator selected
    // Для МК PIC16F627:
    // внешний тактовый генератор XT,
    // RA6/RA7 используются для ввода-вывода,
    // внешний сигнал сброса,
    // таймер включен,
    // сторожевой таймер выключен,
    // защита кода отключена,
    // детектор BODEN включен.
    selected
    // Обработчик прерывания:

    Подключение к микроконтроллеру периферийных устройств 205
    void if
    { // Обработчик прерывания от таймера TMRO.
    TOIF = 0; // Сбросить флаг прерывания от таймера TMRO.
    RTC++; // Инкремент счетчика реального времени.
    // Здесь можно разместить дополнительный код для обработки
    // прерываний от таймера TMRO.
    } // Конец обработчика прерываний от таймера TMRO.
    // Здесь можно разместить дополнительные обработчики прерываний.
    // Конец обработчика прерываний. • -
    // Служебные
    LCDNybble(char Nybble, char RS) {
    unsigned i;
    Data = 0;
    for i < 6; i++) {
    Clock = 1; Clock = 0;
    // Запись полубайта в
    // Очистка сдвигового регистра.
    // Повторить шесть раз.
    // Строб Clock
    // для записи нулевых разрядов.
    Data = 1;
    Clock = 1; Clock
    0;
    Data = RS;
    Clock 1; Clock
    0;
    for (i
    = 0; i < 4; i++)
    if
    & 0x008) != 0)
    Data = 1;
    else
    Data
    0;
    Clock =
    Clock = 0;
    Nybble = Nybble
    1;
    // Строб Е.
    //
    Clock.
    // Бит R/S.
    // Записать 4 бита.
    // Строб Clock.
    // Сдвиг перед записью
    // нового полубайта.
    Data = 1; Data = 0;
    } // Конец подпрограммы LCDNybble.
    LCDByte(char Byte, char RS) {
    LBDlay;
    // Строб
    // Запись байта в ЖКИ.
    LCDNybble((Byte
    4) & OxOOF, RS); // Старшая тетрада.
    LCDNybble(Byte & OxOOF, RS); // Младшая тетрада.
    // Выясняем тип команды.
    // Задержка на 5 мс.
    if
    < 4) && (RS ==
    LBDlay = RTC + 6;
    else
    LBDlay = RTC + 2; // Задержка на 1 мс.
    while(LBDlay != RTC); // Закончить выполнение задержки.
    } // Конец подпрограммы LCDByte.
    // Главная программа:

    206 Устройства управления роботами void
    <
    int i;
    OPTION = OxOD1;
    0;
    = 1;
    = 1;
    //
    работает с таймером TMRO,
    // коэффициент деления равен 4.
    // Начальный таймера.
    // Разрешить прерывания от таймера.
    // Разрешить обработку прерываний.
    // Здесь можно выполнить инициализацию других периферийных устройств.
    Clock = 0; Data = 0; // На обеих линиях двухпроводного интерфейса
    // установлены сигналы низкого уровня.
    ClockTRIS = 0;
    DataTRIS = 0;
    = RTC + 20;
    while (Dlay != RTC);
    0);
    Dlay = RTC + 6;
    while (Dlay != RTC);
    LCDNybble(Ox003, 0);
    Dlay = RTC + 1;
    while (Dlay != RTC);
    0);
    Dlay = RTC + 1;
    while (Dlay != RTC);
    LCDNybble(Ox002, 0);
    Dlay = RTC + 1;
    while (Dlay != RTC);
    LCDByte(Ox028, 0);
    0);
    0);
    LCDByte(Ox006, 0);
    0);
    // Оба вывода, к которым подключен
    // интерфейс переведены
    // в режим выходных.
    // Шаг 1 - ждать более 15 мс
    // после включения питания.
    // Шаг 2 - полубайт для инициализации
    // и задержка на 5 мс.
    // Шаг 3 - полубайт
    // для инициализации и задержка
    // более 160 мкс (1 мс).
    // Шаг 4 - в третий раз повторяем
    // инициализирующий полубайт
    // и задержку.
    // Шаг 5 - устанавливаем
    // курсор в начальную позицию.
    // Задержка.
    // Шаг 6 - устанавливаем режим
    // (4-битные данные, одна строка,
    // размер символов 5x7).
    // Шаг 7 - выключение дисплея.
    // Шаг 8 - очистка экрана.
    // Шаг 9 - режим смещения
    // (сдвиг курсора включен,
    // смещение изображения выключено).
    // Шаг 10 - включение дисплея.
    for (i = 0; i < 12; i++) // Вывод сообщения "Hello
    1);
    while (1 1) { // Бесконечный цикл.
    Здесь можно разместить код верхнего уровня.
    } // Конец главной программы.

    Подключение к микроконтроллеру периферийных устройств 207 \
    Приведенный программы не должен вызвать затруднений, так как он мало отличается от наших предыдущих приложений. Как и прежде, для реализа- ций функций электронного уровня мы используем прерывания от таймера TMRO,
    генерируемые каждую миллисекунду.
    Но загружать эту программу в микроконтроллер было бы преждевременно.
    Здесь мы ошибку, разместив часть кода, работающего с дис- плеем, в главной программе, то есть там, где должны располагаться операторы, ре- ализующие функции биологического уровня. В результате программа будет ра- ботоспособна только в том случае, если жидкокристаллический дисплей является единственным периферийным устройством. Обеспечить возможность выполне- ния этим приложением каких-либо других функций будет затруднительно.
    Решить проблему можно, используя модель конечного автомата. Каждый раз при вызове обработчика прерываний мы будем проверять текущее состояние ко- нечного автомата и выполнять действия, необходимые на данном этапе.
    Измененный текст программы вы найдете в файле Code\Lcd\lcd2.c:
    // 17 февраля 2002 - программа управления жидкокристаллическим
    // дисплеем, измененная в с правилами "трех уровней".
    //
    // Для подключения дисплея к микроконтроллеру используется
    //
    интерфейс на основе сдвигового регистра 74LS174.
    //
    // Используемые аппаратные средства:
    // микроконтроллер PIC16F84/PIC16F627,
    // тактовая частота 4 МГц,
    // используется керамический резонатор,
    // RB1 - линия Clock
    //
    - линия Data (данные).
    // Глобальные переменные и константы:
    int RTC
    = 0;
    volatile char LCDDlay = 20;
    volatile char LCDState = 1;
    static volatile bit Clock static volatile bit ClockTRIS
    static volatile bit Data static volatile bit DataTRIS
    // Счетчик реального времени.
    // Длительность задержки.
    // Номер текущего состояния
    // конечного автомата.
    (unsigned)&TRISB*8+1;
    char
    // Указатель на строку выводимого volatile char
    = 0; // Смещение, указывающее позицию
    // выводимого символа.
    char
    = "Hello
    // Текст char
    =
    Line";
    // Слово defined
    PIC16F84 selected
    CONFIG(Ox03FF1); // Для
    PIC16F84:
    // кварцевый тактовый генератор,

    208 Устройства управления роботами
    // таймер включен,
    // сторожевой таймер
    // защита кода
    PIC16F627 with internal oscillator selected
    _CONFIG(Ox03F61); // Для
    PIC16F627:
    // внешний тактовый генератор XT,
    // RA6/RA7 используются для ввода-вывода,
    // внешний сигнал сброса,
    // таймер включен,
    • // сторожевой таймер выключен,
    // защита кода отключена,
    // детектор BODEN включен.
    Unsupported
    MCU selected
    // Служебные
    LCDNybble(char Nybble, char RS) {
    unsigned i;
    Data
    0;
    for (i
    = 0; i < 6; i++) {
    Clock = 1; Clock = 0;
    // Запись полубайта в ЖКИ.
    // Очистка сдвигового регистра.
    //
    шесть раз.
    // Строб Clock
    // для записи нулевых разрядов.
    Data = 1;
    Clock = 1; Clock = 0;
    Data
    RS;
    Clock = 1; Clock = 0;
    for (i
    = 0; i < 4; i++) {
    if
    & 0x008) != 0)
    Data = 1;
    else
    Data = 0;
    Clock = 1; Clock = 0;
    Nybble = Nybble
    1;
    // Строб Е.
    // Строб Clock.
    // Бит R/S.
    // Записать 4 бита.
    // Строб Clock.
    // Сдвиг перед записью
    // нового полубайта.
    Data = 1; Data = 0;
    } //
    подпрограммы
    LCDByte(char Byte, char RS) {
    int
    // Строб Е.
    // Запись байта в ЖКИ.
    4) & OxOOF, RS); // Старшая тетрада.
    LCDNybble(Byte & OxOOF, RS); // Младшая тетрада.
    // Обратите внимание, что текст подпрограммы изменился.
    } // Конец подпрограммы
    // Инициализация ЖКИ. ,

    Подключение к микроконтроллеру периферийных устройств 209
    Clock = 0; Data = 0; // На обеих двухпроводного интерфейса
    // установлены сигналы низкого уровня.
    ClockTRIS = 0; // Оба вывода, к которым подключен
    DataTRIS = 0; // интерфейс переведены в
    // режим выходных.
    } // Конец подпрограммы инициализации.
    * const LCOString) // Вывод строки на ЖКИ.
    {
    while (LCDState); // Ждать, когда можно будет начать запись.
    =
    // Загрузка строки для вывода.
    LCDState = 100; // Начинаем запись строки на ЖКИ.
    } // Конец подпрограммы
    // Обработчик прерываний:
    void interrupt
    <
    char temp;
    if
    { // Обработчик прерываний от таймера TMRO.
    = 0; // Сбросить флаг прерываний от таймера
    RTC++; // Инкремент счетчика реального времени.
    // Здесь можно разместить дополнительный код
    // для обработки прерываний от таймера TMRO.
    // Конечный автомат:
    { // В зависимости от текущего состояния:
    case
    // Начать инициализацию ЖКИ.
    if
    == 0)
    LCDState++;
    break; // Ждать 20 мс.
    case 2: // Шаг 2.
    LCDNybble(Ox003, 0);
    LCDDlay = 5;
    case 3: // Ждать выполнения команды.
    if break;
    case 4:
    LCDNybble(Ox003, 0); // Шаг 3.
    LCDState++;
    break;
    case
    LCDNybble(Ox003, 0); // Шаг 4.
    break;
    case 6:
    LCDNybble(Ox002, 0); // Шаг 5.
    break;

    210 Устройства управления роботами case 7:
    0); // Шаг 6.
    LCDState++;
    break;
    case 8:
    LCDByte(Ox008, 0); // Шаг 7.
    LCDState++;
    break;
    case 9:
    0); // Шаг 8.
    LCDDlay
    // Ждать 5
    break;
    case 10: // Ждать выполнения команды.
    if
    == 0)
    LCDState++;
    break;
    case
    LCDByte(Ox006, 0); // Шаг 9.
    LCDState++;
    break;
    case 12:
    0); // Шаг 10.
    LCDState = 0; // Все готово.
    break;
    case 100: // Вывод сообщения switch (temp =
    {
    case
    // Конец сообщения?
    LCDState =
    //
    теперь свободен.
    = 0;
    // Возврат индекса
    // на начало break;
    case
    // Очистка экрана.
    LCDByte(Ox001, 0);
    LCDState++;
    LCDDlay = 5;
    break;
    case 254: // Перед записью команды.
    if
    =
    0)
    LCDState = 0;
    else {
    if (temp < 4) {
    LCDState++;
    LCDDlay = 5;
    } // endif
    0);
    >
    break;
    default: // Все другие символы.
    LCD8yte(temp, 1);
    } // Конец внутреннего оператора break;
    case 101: // Задержка.

    Подключение к микроконтроллеру периферийных устройств 211
    if
    == 0)
    LCDState--;
    break;
    } //
    внешнего оператора switch.
    } // Конец оператора if.
    // Здесь можно разместить другие обработчики прерываний.
    ) // Конец обработчика прерываний.
    // Главная программа:
    void
    {
    OPTION
    OxOD1; //
    работает с таймером TMRO,
    // коэффициент деления равен 4.
    , // Начальный сброс таймера TMRO.
    TOIE = 1; // Разрешение прерываний от таймера TMRO.
    GIE = 1; // Разрешение обработки прерываний.
    // Инициализация порта, к которому подключен
    // Здесь можно проинициализировать другие периферийные устройства.
    // Передача строки для вывода на дисплей.
    // Вторая строка while (1 == 1)
    // Бесконечный цикл.
    // Здесь можно разместить код биологического уровня.
    }
    } // Конец главной программы.
    Как видим, текст подпрограммы LCDNybble не изменился, а из подпрограм- мы LCDByte исчезли все вызовы функции задержки.
    Появилась новая подпрограмма LCDOut, предназначенная для вывода строки на жидкокристаллический дисплей. В этой подпрограмме после того, как конеч- ный автомат закончил запись предыдущей строки, выполняется копирование ука- зателя на новую строку. Заметим, что при раннем вызове функции LCDOut суще- ствует опасность зависания главной программы, поэтому читатель, возможно,
    захочет добавить к приведенному тексту еще одну подпрограмму для опроса те- кущего состояния конечного автомата, управляющего процессом записи строк на жидкокристаллический дисплей:
    LCDPoll () // Опрос состояния конечного автомата.
    {
    if (LDState)
    return 0; // ЖКИ занят или еще не проинициализирован.
    else return 1; // Можно начинать запись следующей строки.
    >
    Эта функция возвращает 1, если дисплей пока не проинициализирован или еще не закончена запись предыдущей строки. Теперь вызов LCDOut можно стить в условный оператор, который обращается к функции LCDPoll.

    212 Устройства управления роботами
    Обратите внимание еще на несколько отличий от предыдущей программы. Во- первых, здесь мы используем строки в формате ASCIIZ, то есть применяем нуле- вой байт в качестве терминатора строки. Во-вторых, строка сообщения теперь содержит управляющие коды. Символ \ f feed) используется для перехода на новую строку, что для нашего однострочного дисплея эквивалентно очистке экрана. Перед записью таких команд необходимо послать в контроллер ЖКИ байт с кодом
    (то есть OxOFE). Этот байт воспринимается большинством жидко- дисплеев как указатель что за ним последует не ASCII-код символа, а код команды (как вы помните, первые 32 символа, соответствующие обычным управляющим кодам, не являются таковыми для жидкокристалличес- ких дисплеев, поэтому приходится использовать какой-то условный сигнал для подачи команд управления экраном).
    В программе на языке С самый простой способ подачи таких команд - предва- рять каждый управляющий код символом
    (как нетрудно проверить, это восьмеричная запись числа 254). Например, команда очистки экрана, эквивалент- ная команде 0x001, запишется в виде строки из двух символов: \376\001.
    В табл. 4.10 приведены некоторые часто используемые команды.
    Таблица
    Строковый формат некоторых команд ЖКИ
    Команда
    Очистка экрана
    Перемещение курсора начальную позицию экрана
    Выключение дисплея
    Включение дисплея, курсор спрятан
    Включение дисплея, видимый курсор
    Перемещение
    на позицию, адрес которой —
    Строка
    \376\001
    \376\002
    \376\014
    \376\016
    \376\300
    Допустим, мы хотим очистить экран, вывести в двух строках сообщение о том,
    что робот движется вперед:
    Robot Moving
    Forward и спрятать курсор. Для этого в программе на языке С надо использовать строку,
    содержащую управляющие символы:
    Возможно, вы полагаете, что метод проектирования, основанный на вынесении интерфейсных функций в процедуру обработки прерываний, эффективен только с точки зрения расширяемости программ, но требует большего объема памяти мик- роконтроллера. Пора развеять это заблуждение. Если вы сравните размер машинно- го кода, полученного в результате компиляции обоих вариантов нашей программы,
    то будете немало удивлены. Хотя исходный текст программы на языке С за- нимает больше места и содержит дополнительные функции (в частности, добавле- ны новые ветви оператора выбора для обработки управляющих символов), размер

    Подключение к микроконтроллеру периферийных устройств 213
    машинного кода после всех изменений даже чуть меньше, чем в резуль- тате компиляции программы
    Разумеется, вы захотите использовать описанные в этой главе методы работы с периферийными устройствами при проектировании реальных приложений,
    в которых должны будут уживаться друг с другом разные интерфейсы. Поэтому за основу следующих проектов будет взята описанная в этом разделе конструк- ция, чтобы можно было продемонстрировать, как работает предложенный метод в ситуации, когда новые функциональные возможности добавляются к уже рабо- тающему устройству. Для экономии места в следующих программах будут приво- диться только заголовки тех функций, которые обеспечивают вывод информации на жидкокристаллический дисплей, а пропущенные фрагменты кода — обозна- чаться многоточием.
    1   ...   13   14   15   16   17   18   19   20   ...   33


    написать администратору сайта