Оглавление:

Учебник по ассемблеру AVR 9: 7 шагов
Учебник по ассемблеру AVR 9: 7 шагов

Видео: Учебник по ассемблеру AVR 9: 7 шагов

Видео: Учебник по ассемблеру AVR 9: 7 шагов
Видео: Лекция 4. Архитектура AVR. Ассемблер 2024, Июль
Anonim
Учебник по ассемблеру AVR 9
Учебник по ассемблеру AVR 9

Добро пожаловать в Урок 9.

Сегодня мы покажем, как управлять 7-сегментным и 4-значным дисплеями, используя наш код языка ассемблера ATmega328P и AVR. В ходе этого нам придется отвлечься от того, как использовать стек, чтобы уменьшить количество регистров, которые нам нужно связать. Мы добавим пару конденсаторов (фильтры нижних частот), чтобы попытаться уменьшить шум на нашей клавиатуре. Мы создадим усилитель напряжения из пары транзисторов, чтобы наш переключатель прерывания INT0 лучше работал с кнопками более низкого напряжения в нижнем ряду клавиатуры. И мы будем немного биться головой об стену, пытаясь найти правильные резисторы, чтобы эта штука работала правильно.

Мы будем использовать клавиатуру из Урока 7.

Для этого урока, помимо стандартных вещей, вам понадобятся:

  1. 7-сегментный дисплей

    www.sparkfun.com/products/8546

  2. 4-значный дисплей

    www.sparkfun.com/products/11407

  3. Кнопка

    www.sparkfun.com/products/97

  4. Таблицы данных для дисплея, которые можно загрузить с соответствующих страниц, указанных выше.
  5. Керамический конденсатор 68 пФ, пара конденсаторов 104, связка резисторов, два транзистора 2N3904 NPN.

Вот ссылка на полную коллекцию моих руководств по ассемблеру AVR:

Шаг 1. Подключение 7-сегментного дисплея

Подключение 7-сегментного дисплея
Подключение 7-сегментного дисплея
Подключение 7-сегментного дисплея
Подключение 7-сегментного дисплея
Подключение 7-сегментного дисплея
Подключение 7-сегментного дисплея

Мы собираемся использовать тот же код, который мы использовали в Уроке 7 для клавиатуры, чтобы управлять 7-сегментным дисплеем. Так что вам нужно будет сделать копию, и мы изменим ее.

Мы сопоставим сегменты с контактами нашего микроконтроллера следующим образом:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

где буквы сегментов показаны на картинке вместе с распиновкой, соответствующей общему напряжению 5 В, и каждому из сегментов светодиода, включая десятичную точку (dp) в правом нижнем углу дисплея. Причина этого в том, что мы можем ввести все число в один регистр и вывести этот регистр на порты B и D, чтобы осветить сегменты. Как вы можете видеть, биты пронумерованы последовательно от 0 до 7, поэтому они будут отображаться на правильные контакты без необходимости устанавливать и очищать отдельные биты.

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

Добавлю, что между общим анодом дисплея и шиной 5В нужно поставить резистор. Я выбрал резистор на 330 Ом, как обычно, но если хотите, вы можете рассчитать минимальное сопротивление, необходимое для получения максимальной яркости дисплея, не поджаривая его. Вот как это сделать:

Сначала посмотрите на лист данных и обратите внимание, что на первой странице он дает различные свойства дисплея. Важными величинами являются «прямой ток» (I_f = 20 мА) и «прямое напряжение» (V_f = 2,2 В). Они говорят вам, что падение напряжения на дисплее будет, если ток равен прямому току. Это максимальный ток, который выдержит дисплей без жарки. Следовательно, это также максимальная яркость, которую вы можете получить из сегментов.

Итак, давайте воспользуемся законом Ома и правилом петли Кирхгофа, чтобы выяснить, какое минимальное сопротивление нам нужно будет последовательно подключить к дисплею, чтобы получить максимальную яркость. Правило Кирхгофа гласит, что сумма изменений напряжения вокруг замкнутого контура в цепи равна нулю, а закон Ома гласит, что падение напряжения на резисторе с сопротивлением R составляет: V = I R, где I - ток, протекающий через резистор.

Итак, учитывая напряжение источника V и обход нашей схемы, мы имеем:

V - V_f - I R = 0

что означает (V - V_f) / I = R. Итак, сопротивление, необходимое для получения максимальной яркости (и, вероятно, поджаривания сегментов), будет:

R = (V - V_f) / I_f = (5,0 В - 2,2 В) / 0,02 A = 140 Ом

Так что, если вы хотите, вы можете без проблем использовать 150 Ом. Однако я думаю, что 140 Ом делает его слишком ярким на мой вкус, поэтому я использую 330 Ом (что является своего рода моим личным сопротивлением Златовласки для светодиодов).

Шаг 2: код сборки и видео

Приложил код сборки и видео, показывающее работу клавиатуры с дисплеем. Как вы можете видеть, мы просто сопоставили клавишу повторного набора с буквой «r», флэш-клавишу с буквой «F», звездочку с буквой «А», а знак решетки - с буквой «H». Их можно сопоставить с различными операциями, такими как возврат, ввод и т. Д., Если вы хотите и дальше использовать клавиатуру для ввода чисел на ЖК-дисплеях или 4-значных дисплеях. На этот раз я не буду рассматривать код построчно, поскольку он очень похож на то, что мы уже делали в предыдущих уроках. Различия в основном заключаются в том, что мы уже знаем, как делать прерывания и справочные таблицы. Вам нужно просто просмотреть код, посмотреть на новые вещи, которые мы добавили и что мы изменили, и понять это оттуда. Мы вернемся к построчному анализу в следующем руководстве, когда представим новые аспекты кодирования на языке ассемблера на микроконтроллерах AVR.

Давайте теперь посмотрим на 4-значный дисплей.

Шаг 3: Подключение 4-значного дисплея

Подключение 4-значного дисплея
Подключение 4-значного дисплея
Подключение 4-значного дисплея
Подключение 4-значного дисплея

Согласно таблице данных, 4-значный дисплей имеет прямой ток 60 мА и прямое напряжение 2,2 вольта. Итак, по тем же расчетам, что и раньше, я мог бы использовать резистор 47 Ом, если бы захотел. Вместо этого я собираюсь использовать… хм… позвольте мне посмотреть… как насчет 330 Ом.

Способ подключения 4-значного дисплея заключается в том, что имеется 4 анода, по одному для каждой цифры, а другие контакты определяют, какой сегмент появляется в каждом. Вы можете отображать 4 цифры одновременно, потому что они мультиплексированы. Другими словами, так же, как мы сделали для пары игральных костей, мы просто циклически включаем питание через каждый из анодов по очереди, и они мигают один за другим. Он будет делать это так быстро, что наши глаза не будут видеть мигания, и будет выглядеть так, как будто все четыре цифры включены. Однако, чтобы быть уверенным, мы будем кодировать это, чтобы установить все четыре цифры, а затем циклически переключать аноды, а не устанавливать, перемещать, устанавливать, перемещать и т. Д. Таким образом мы можем получить точное время между загоранием каждой цифры.

А пока давайте проверим, все ли сегменты работают.

Поместите резистор 330 Ом между положительной шиной макетной платы и первым анодом на дисплее. В таблице данных говорится, что контакты пронумерованы от 1 до 16 против часовой стрелки, начиная с нижнего левого угла (когда вы смотрите на дисплей в обычном режиме … с десятичными точками внизу), и в нем указано, что аноды имеют номера контактов 6., 8, 9 и 12.

Итак, мы подключаем контакт 6 к 5 В, а затем берем отрицательный провод от вашей шины GND и вставляем его во все другие контакты и видим, что все сегменты загораются на цифре, которой он соответствует (которая на самом деле является второй цифрой из право). Убедитесь, что загорелись все 7 сегментов и десятичная точка.

Теперь вставьте провод GND в один из контактов, чтобы загорелся один из сегментов, и на этот раз переместите резистор к другим 3 анодам и посмотрите, что тот же сегмент загорается на каждой из других цифр.

Что-нибудь необычное?

Оказывается, распиновка в даташите неправильная. Это потому, что это таблица данных и распиновка для 12-контактного 4-значного дисплея. Т.е. один без двоеточия или верхнего десятичного разделителя. Дисплей, который я получил, когда я его заказал, представляет собой 16-контактный, 4-значный дисплей. Фактически, у меня сегментные аноды находятся на контактах 1, 2, 6 и 8. Анод толстой кишки - это контакт 4 (катодный контакт 12), а верхний анод dp - это контакт 10 (катод - контакт 9).

Упражнение 1. Используйте свой резистор и провод заземления, чтобы определить, какой вывод соответствует сегменту и десятичной запятой на дисплее, чтобы мы могли получить правильные сегменты, когда мы его кодируем.

Способ, которым мы хотим закодировать карту сегментов, точно такой же, как мы делали с однозначным 7-сегментным дисплеем выше - нам не нужно ничего менять в коде, единственное, что мы меняем, - это способ подключения проводов. на борту. Просто подключите правильный вывод порта на микроконтроллере к соответствующему выводу на 4-значном дисплее, чтобы, например, PB0 все еще перешел к выводу, соответствующему сегменту a, PB1 перешел к сегменту B и т. Д.

Единственная разница в том, что теперь нам нужно 4 дополнительных контакта для анодов, поскольку мы больше не можем просто перейти на шину 5V. Нам нужен микроконтроллер, чтобы решить, какая цифра получит сок.

Таким образом, мы будем использовать PC1, PC2, PC3 и PD4 для управления анодами 4-х разрядов.

Вы могли бы также пойти дальше и подключить провода. (не забудьте резисторы 330 Ом на анодных проводах!)

Шаг 4: Кодирование 4-значного дисплея

Кодирование 4-значного дисплея
Кодирование 4-значного дисплея

Давайте подумаем, как мы хотим кодировать этот дисплей.

Мы хотели бы, чтобы пользователь нажимал кнопки клавиатуры, и числа последовательно появлялись на дисплее при нажатии каждой кнопки. Итак, если я нажму 1, а затем 2, на дисплее отобразится 12. Я также хотел бы сохранить это значение, 12, для внутреннего использования, но мы вернемся к этому чуть позже. А пока я просто хочу написать новый макрос, который будет отображать ваши нажатия клавиш. Однако, поскольку у нас всего 4 цифры, я хочу убедиться, что он позволяет вводить только четыре цифры.

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

Мы также хотим, чтобы он перемещал «курсор» вправо на пробел, когда мы вводим следующую цифру. Так что, если я хочу ввести, например, 1234, после того, как я наберу 1, курсор переместится так, что следующая набираемая мной цифра появится на следующем 7-сегментном дисплее и так далее. Все время, пока это происходит, я все еще хочу видеть то, что набираю, чтобы цифры по-прежнему циклически менялись и отображались.

Звучит как сложная задача?

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

Итак, давайте начнем с небольшого упрощения, использования стека и освобождения некоторых регистров, а затем мы попытаемся выполнить задачу чтения и отображения наших чисел на 4-значном дисплее.

Шаг 5: Push 'n Pop

Push 'n Pop
Push 'n Pop

В нашем распоряжении есть только несколько «регистров общего назначения», и как только они будут использованы, их больше не будет. Поэтому хорошей практикой программирования является использование их только для пары переменных, которые используются в качестве временного хранилища, которое вам нужно для чтения и записи в порты и SRAM, или других, которые вам понадобятся в подпрограммах повсюду, и поэтому вы Назови их. Итак, что я сделал, теперь, когда мы инициализированы и учимся использовать стек, - это пройтись по коду и найти именованные регистры общего назначения, которые используются только внутри одной подпрограммы или прерывания и нигде больше в коде, и заменить их с одним из наших временных регистров и push и pop в стек. Фактически, если вы посмотрите на код, написанный для микроконтроллеров меньшего размера, или если вы вернетесь во времени, когда все микросхемы были меньше, вы увидите только пару регистров общего назначения, которые должны были использоваться для всего, поэтому вы не могли просто сохраните там значение и оставьте его в покое, так как этот регистр наверняка понадобится вам для других целей. Таким образом, вы будете видеть толчки и хлопки повсюду в коде. Возможно, мне следовало назвать наши временные регистры общего назначения AX и BX в знак уважения к тем давно минувшим дням.

Пример поможет прояснить это.

Обратите внимание, что в нашем прерывании завершения аналого-цифрового преобразования ADC_int мы используем регистр общего назначения, который мы назвали buttonH, который мы использовали для загрузки значения ADCH и сравнения его с нашей таблицей поиска аналоговых преобразований в нажатие кнопки. Мы используем этот регистр buttonH только в подпрограмме ADC_int и больше нигде. Поэтому вместо этого мы будем использовать нашу переменную temp2, которую мы используем как временную переменную, которую мы можем использовать в любой данной подпрограмме, и ее значение не повлияет ни на что за пределами этой подпрограммы (то есть значение, которое мы даем ему в ADC_int, нигде не будет использоваться. еще).

Другой пример - в нашем макросе задержки. У нас есть регистр, который мы назвали «миллисекунды», который содержит время задержки в миллисекундах. В этом случае он находится в макросе, и мы напоминаем, что способ работы макроса заключается в том, что ассемблер помещает весь код макроса в то место программы, где он вызывается. В этом случае мы хотели бы избавиться от переменной "миллисекунды" и заменить ее одной из наших временных переменных. В этом случае я сделаю это немного иначе, чтобы показать вам, как, даже если значение переменной понадобится где-то еще, мы все равно можем использовать его, используя стек. Поэтому вместо миллисекунд мы используем "temp", и чтобы мы не испортили другие вещи, которые также используют значение temp, мы просто начинаем макрос "delay", "помещая" temp в стек, а затем используем его. вместо миллисекунд, а затем в конце макроса мы «выталкиваем» его предыдущее значение обратно из стека.

В результате мы «позаимствовали» temp и temp2 для временного использования, а затем вернули их к предыдущим значениям, когда закончили.

Вот процедура прерывания ADC_int после внесения этого изменения:

ADC_int:

температура нажатия; save temp, так как мы изменяем его здесь push temp2; сохранить temp2 lds temp2, ADCH; загрузить нажатие клавиши ldi ZH, высокое (2 * числа) ldi ZL, низкое (2 * числа) cpi temp2, 0 breq return; если шумовые триггеры не меняют 7segnumber setkey: lpm temp, Z +; загрузка из таблицы и приращение поста clc cp temp2, temp; сравните нажатие клавиш с таблицей brlo PC + 4; если ADCH ниже, попробуйте еще раз lpm 7segnumber, Z; в противном случае загрузить таблицу ключевых значений с цифрой; увеличить цифру числа rjmp return; и вернуть adiw ZH: ZL, 1; инкремент Z rjmp setkey; и вернуться наверх return: pop temp2; восстановить temp2 pop temp; восстановить темп Рети

Обратите внимание, что стек работает так, что первое включение - последнее выключение. Прямо как стопка бумаг. Вы видите, что в наших первых двух строках мы помещаем значение temp в стек, затем мы помещаем temp2 в стек, затем мы используем их в подпрограмме для других вещей, и, наконец, мы снова восстанавливаем их предыдущие значения с помощью сначала отключаем temp2 (так как он был последним, он находится на вершине стека и будет первым, который мы отключаем обратно), а затем выталкивание temp.

Так что с этого момента мы всегда будем использовать этот метод. Единственный раз, когда мы фактически назначим регистр для чего-то другого, кроме временной переменной, - это когда он нам понадобится повсюду. Например, регистр «переполнение» - это регистр, который мы используем в нескольких разных местах программы, и поэтому мы хотели бы дать ему имя. Конечно, мы все еще можем использовать его так же, как и с temp и temp2, поскольку мы восстановим его значение после того, как закончим. Но это было бы слишком спагеттифицировано. Они названы по причине, и у нас уже есть temp и temp2, предназначенные для этой работы.

Шаг 6: фильтры нижних частот и усилитель напряжения

Фильтры нижних частот и усилитель напряжения
Фильтры нижних частот и усилитель напряжения
Фильтры нижних частот и усилитель напряжения
Фильтры нижних частот и усилитель напряжения

Чтобы немного убрать шум и улучшить работу клавиатуры, мы хотим добавить пару фильтров нижних частот. Они отфильтровывают высокочастотный шум и пропускают низкочастотный сигнал. По сути, способ сделать это - просто добавить конденсатор 68 пФ между нашим аналоговым входом и землей, а также конденсатор 0,1 мкФ (то есть 104) между нашим прерыванием PD4 (INT0) и землей. Если вы поиграете с ними, нажимая кнопки на клавиатуре, вы сможете увидеть, что они делают.

Далее мы хотим сделать усилитель напряжения. Оказывается, что нижний ряд клавиш на клавиатуре (а также клавиша повторного набора) выдает слишком низкое напряжение для отключения прерывания INT0. Аналоговый порт достаточно чувствителен, чтобы считывать низкие напряжения с этих клавиш, но наш вывод прерывания не получает достаточно хорошего фронта для прерывания, когда мы нажимаем эти клавиши. Следовательно, мы хотели бы каким-то образом удостовериться, что хороший фронт напряжения достигает PD4, но такое же низкое напряжение достигает ADC0. Это довольно сложная задача, поскольку оба сигнала поступают с одного и того же выходного провода нашей клавиатуры. Есть несколько изощренных способов сделать это, но мы не собираемся больше использовать нашу клавиатуру после этого урока, поэтому давайте просто объединим метод, который работает (едва ли).

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

Когда вы подключаете клавиатуру и усилитель напряжения, очень вероятно, что те же номиналы резисторов, которые я использовал, не будут работать. Поэтому вам придется поэкспериментировать, чтобы получить значения, которые работают на вас.

Если вы посмотрите на схему, которую я приложил к этому шагу, вы увидите, как будет работать усилитель напряжения. Мы используем несколько резисторов и два транзистора. Принцип работы транзисторов (см. Спецификации!) Заключается в том, что на базовый вывод транзистора (средний вывод) необходимо подавать минимальное напряжение, которое насыщает его и позволяет току течь между выводом коллектора и эмиттером. штырь. В случае транзистора 2N3904, который мы здесь используем, напряжение составляет 0,65 В. Теперь мы берем это напряжение с нашего выхода клавиатуры, и мы не хотим изменять этот выход, поэтому мы поставим большой резистор между выходом клавиатуры и базой первого транзистора (я использовал 1 МОм). Я обозначил это на схеме как R_1. Затем мы хотим настроить делитель напряжения так, чтобы база транзистора была уже «почти» на 0,65 вольт, и лишь немного больше, чтобы подтолкнуть его к верху и насыщать его. Этот крохотный кусочек будет поступать с вывода клавиатуры, когда мы нажимаем кнопку. Поскольку нижние клавиши на клавиатуре выдают лишь крошечное напряжение, нам нужно уже быть очень близкими к насыщению, чтобы их было достаточно. Резисторы делителя напряжения обозначены на схеме R_a и R_b. Я использовал R_a = 1Mohm и R_b = 560Kohm, но почти наверняка вам придется поэкспериментировать с этими числами, чтобы подобрать их для вашей настройки. Вы можете иметь рядом стену, чтобы удариться головой, и два или три стакана виски под рукой (я бы порекомендовал Laphroaig - дорого, но оно того стоит, если вы любите дым. Если все становится действительно безумным, тогда просто возьмите кувшин БВ и заселиться на ночлег)

Теперь давайте посмотрим, как транзисторы обеспечат нам хороший нарастающий фронт, входящий в ключ INT0, и сгенерируют прерывание при нажатии клавиши. Сначала давайте посмотрим, что происходит, когда я не нажимаю клавишу. В этом случае первый транзистор (обозначенный на схеме T1) выключен. Таким образом, между выводами коллектора и эмиттера нет тока. Таким образом, база другого транзистора (обозначенного T2) будет поднята на высокий уровень и, таким образом, будет насыщаться, позволяя току течь между его выводами. Это означает, что эмиттер T2 будет понижен, поскольку он подключен к коллектору, который сам подключен к земле. Таким образом, выход, который поступает на наш вывод прерывания нажатия клавиши INT0 (PD4), будет низким, и прерывания не будет.

Что происходит, когда я нажимаю клавишу? Что ж, тогда база T1 поднимается выше 0,65 В (в случае нижних клавиш она едва поднимается выше!), И тогда будет разрешено течь ток, который подтянет базу T2 к низкому напряжению, и это отключит T2. Но мы видим, что когда T2 выключен, тогда на выходе устанавливается высокий уровень, и, следовательно, мы получим сигнал 5 В, идущий на наш вывод INT0, и это вызовет прерывание.

Обратите внимание, какой здесь чистый результат. Если мы нажмем кнопку 1, мы получим 5 В, идущие на PD4, без значительного изменения выхода, идущего на ADC0, и, что более важно, даже если мы нажмем Asterisk, 0, Hash или Redial, мы также получим сигнал 5 В, идущий на INT0, а также вызывая прерывание! Это важно, поскольку если бы мы просто перешли непосредственно с выхода клавиатуры на вывод INT0, эти клавиши почти не генерируют напряжение, и их будет недостаточно для срабатывания этого вывода прерывания. Наш усилитель напряжения решил эту проблему.

Шаг 7: 4-значный код дисплея и видео

Это все для урока 9! Я приложил код и видео, показывающее операцию.

Это будет последний раз, когда мы будем использовать аналоговую клавиатуру (слава богу). Его было сложно использовать, но он также был очень полезен, чтобы помочь нам узнать об аналого-цифровом преобразовании, аналоговых портах, прерываниях, мультиплексировании, шумовых фильтрах, усилителях напряжения и многих аспектах кодирования сборки от таблиц поиска до таймеров / счетчиков. и т. д. Поэтому мы решили его использовать. (плюс это весело собирать мусор).

Теперь мы собираемся снова взглянуть на коммуникацию и заставим наши 7-сегментные и 4-значные дисплеи считывать наши броски игральных костей с нашего ролика для игры в кости так же, как мы это делали с нашим анализатором регистров. На этот раз мы будем использовать двухпроводной интерфейс, а не наш взломанный метод кода Морзе.

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

Для амбициозных людей. Вот «проект», который вы могли бы попробовать, и у вас наверняка есть знания для выполнения на этом этапе, если вы прошли все это руководство до этого момента:

Проект: Сделайте калькулятор! Используйте наш 4-значный дисплей и нашу клавиатуру и добавьте внешнюю кнопку, которая будет действовать как клавиша «ввода». Сопоставьте звездочку с «разами», хэш для «деления» повторного набора на «плюс» и вспышку с «минусом» и напишите процедуру калькулятора, которая действует как один из тех старых калькуляторов HP с «обратной полировкой», которые были у всех инженеров. день назад. Т.е. они работают так: вы вводите число и нажимаете "ввод". Это помещает это число в стек, затем вы вводите второе число и нажимаете «ввод», что помещает второе число в стек. Наконец, вы нажимаете одну из операций, например X, /, + или -, и она применяет эту операцию к двум верхним числам в стеке, отображает результат и помещает результат в стек, чтобы вы могли использовать его снова, если вы нравиться. Например, чтобы сложить 2 + 3, вы должны сделать: 2, "enter", 3, "enter", "+", и тогда на дисплее будет отображаться 5. Вы знаете, как использовать стек, дисплей, клавиатуру и вы у вас уже написана большая часть фонового кода. Просто добавьте клавишу ввода и подпрограммы, необходимые для калькулятора. Это немного сложнее, чем вы думаете на первый взгляд, но это весело и выполнимо.

Увидимся в следующий раз!

Рекомендуемые: