Главная » Статьи » Proton PICBasic |
Применение динамической индикации. Пример 3 - Управление по трем проводам
В этом примере попытаемся еще больше сократить количество выводов для индикации, задействованных у МК. Для этого нам понадобятся два сдвиговых регистра 74HC595 и маленький микроконтроллер PIC12F675. Сначала в качестве примера я не хотел внедрять в программу работу АЦП, но ввиду иногда возникающих сложностей с настройкой АЦП у данного пика решил организовать еще и вольтметр (для желающих есть еще свободный вывод для амперметра). Итак, чем отличается управление в данном примере от предыдущего, где задействован только один сдвиговый регистр? В принципе ничем: алгоритм один и тот же. Разница лишь в том, что разрядами управляют теперь не порты микроконтроллера непосредственно, а один из сдвиговых регистров. Схема приведена ниже: Переходим сразу к делу: 'Цифровой вольтметр с возможностью добавления амперметра Device 12F675 Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, BODEN_ON, MCLRE_OFF Declare Xtal = 4 Declare Reminders NO Set_OSCCAL OSCCAL '--------------------------------------------------------------------------------------------------- Symbol SH_CP = GPIO.2 Symbol But = GPIO.3 Symbol DS = GPIO.4 Symbol ST_CP = GPIO.5 '--------------------------------------------------------------------------------------------------- Dim AD_RESULT As ADRESL.Word'Переменная для хранения результата преобразования АЦП Dim j As Word 'Переменная для хранения цифрового значения числа Dim n As Byte 'Число для вывода на индикатор ССИ Dim Value As Byte 'Переменная для осуществления табличного конвертирования цифры Dim Dot As Byte 'Символ точки для вывода на ССИ Dot = 128 '-------------------------------Инициализация микроконтроллера-------------------------------------- DelayMS 500 'Задержка для стабилизации микроконтроллера GoTo OVER_ADC_SUBS 'Переход на конфигурацию портов '-----------------------------------Старт преобразования-------------------------------------------- ADC: ADCON0.0 = 1 'Включим АЦП DelayUS 50 'Задержка для заряда внутреннего конденсатора ADCON0.1 = 1 'Разрешение преобразования While ADCON0.1 = 1: Wend 'Опрос флага GO_DONE для завершения преобразования ADCON0.0 = 0 'Выключим АЦП Return '----------------------------Инициализация регистров АЦП-------------------------------------------- OVER_ADC_SUBS: GPIO = %000000 TRISIO = %001011 'GP0, GP1 - АЦП; GP2, GP4, GP5 - выходы; GP3 - 10к на +5В ANSEL.4 = 1 ' \ ANSEL.5 = 1 ' FRC ANSEL.6 = 0 ' / ADCON0.6 = 0 'Источник опорного напряжения - +5В от шины питания ADCON0.7 = 1 ' ANSEL.0 = 1 'Установим GPIO.0 аналоговым входом ANSEL.1 = 1 'Установим GPIO.1 аналоговым входом ANSEL.2 = 0 'Установим GPIO.2 цифровым выходом ANSEL.3 = 0 'Установим GPIO.3 цифровым выходом '-----------------------------------Главная программа----------------------------------------------- Start: 'Бесконечный цикл ADCON0.2 = 1 'Выбор канала АЦП (см. 43 страницу даташита) ADCON0.3 = 0 'Выбор канала АЦП GoSub ADC 'Выполним преобразование АЦП j = AD_RESULT / 0.2048 GoSub Ind GoTo Start '--Подпрограмма динамической индикации с использованием двух сдвиговых регистров 74HC595 и 4-x ССИ-- Ind: '---------------Зажигание первого справа разряда индикатора и вывод на него цифры------------------- n = Dig j, 0 'Выделяем из числа единицы GoSub Convert 'и конвертируем в код ССИ SHOut DS, SH_CP, msbfirst, [8] 'Проталкиваем в нижний регистр бит для зажигания разряда № 4 SHOut DS, SH_CP, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для единиц ST_CP = 1 'Защелкиваем данные ST_CP = 0 'Обнуляем защелку данных '---------------Зажигание второго справа разряда индикатора и вывод на него цифры------------------- n = Dig j, 1 'Выделяем из числа десятки GoSub Convert 'и конвертируем в код ССИ SHOut DS, SH_CP, msbfirst, [4] 'Проталкиваем в нижний регистр бит для зажигания разряда № 3 SHOut DS, SH_CP, msbfirst, [Value] ST_CP = 1 'Защелкиваем данные ST_CP = 0 'Обнуляем защелку данных '---------------Зажигание третьего справа разряда индикатора и вывод на него цифры------------------ n = Dig j, 2 'Выделяем из числа сотни GoSub Convert 'и конвертируем в код ССИ SHOut DS, SH_CP, msbfirst, [2] 'Проталкиваем в нижний регистр бит для зажигания разряда № 2 SHOut DS, SH_CP, msbfirst, [Value + Dot] 'Проталкиваем в верхний регистр сконвертированный код для сотен ST_CP = 1 'Защелкиваем данные ST_CP = 0 'Обнуляем защелку данных '---------------Зажигание четвертого справа разряда индикатора и вывод на него цифры---------------- n = Dig j, 3 'Выделяем из числа тысячи GoSub Convert 'и конвертируем в код ССИ SHOut DS, SH_CP, msbfirst, [1] 'Проталкиваем в нижний регистр бит для зажигания разряда № 1 SHOut DS, SH_CP, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для тысяч ST_CP = 1 'Защелкиваем данные ST_CP = 0 'Обнуляем защелку данных Return '---------------Зажигание первого справа разряда индикатора и вывод на него цифры------------------- Convert: Value = LookUp n, [192,249,164,176,153,146,130,248,128,144,156] Return '--------------------------------------------------------------------------------------------------- End Из комментариев ясно, что сначала зажигаем разряд - проталкиваем байт, содержащий один единственный включенный бит, который подает единицу на разряд. Поскольку данный байт пошел на сдвиговые регистры первым, он поселится в самом нижнем регистре, т.е. во втором. Далее отсылаем байт, содержащий переконвертированное значение цифры для индикации. Теперь уже на ноги индикаторов проскочила настоящая цифра. Остается только защелкнуть данные и смотреть на результат работы. В примерах на сдвиговых регистрах я не устанавливал задержки на индикацию, поэтому можете поиграться с ними сами (смотрите как это сделано в первом примере) Как видите - нечего сложного, когда разберешься как это делается. | |
Просмотров: 15808 | Комментарии: 4 | |
Всего комментариев: 4 | ||||
| ||||