В данной статье будет рассмотрен вариант поразрядного вывода информации через I2c интерфейс, именно в среде компилятора "Bascom". 8 разрядов по 2 проводам. Используется расширитель портов "PCF8574x". При использовании микросхем серии PCF857Xx, будьте предельно внимательны. !!! Адресация может отличаться !!!
Изучайте документацию (datasheet) именно того производителя, микросхемы которого Вы приобрели!
Исходник
'******************************************************************************* '****************** Поразрядная 7-seg LED индикация ******************** '*******************************************************************************
' Контроллер: ATMEGA8A или любой другой "AVR" с небольшими переделками исходника ' Версия компилятора: BASCOM-AVR 2.0.7.1 ' Автор: sasha_1973
'******************************************************************************* '------------------------------------------------------------------------------- '--------------- Конфигурация используемого контроллера ---------------- '------------------------------------------------------------------------------- $regfile = "m8def.dat" : $crystal = 8000000 : $hwstack = 40 : $swstack = 16 : $framesize = 32 '------------------------------------------------------------------------------- '******************************************************************************* '***************** *********************** '***************** Конфигурация шины I2c *********************** '***************** микросхема часов PCF8574x ********************* '***************** *********************** '******************************************************************************* '------------------------------------------------------------------------------- Config Sda = Portc.4 ' Конфигурация порта Config Scl = Portc.5 ' Конфигурация порта Config I2cdelay = 1 ' Задержки i2c "10 - 100кГц, 5 - 200кГц, 2 - 500кГц, 1 - 1Мгц" - для стабильной работы чем длиннее провода тем меньше частота I2cinit ' Инициализация i2c Dim Инициализация_i2c As Byte '------------------------------------------------------------------------------- '------------------------------------------------------------------ '| | PCF8574,PCF8574N, PCF8575 | PCF8574A, PCF8574AP | '|-------------|----------------------------|----------------------| '| A0 A1 A2 | Чтение | Запись | Чтение | Запись | '|-------------|-------------|--------------|-----------|----------| '| 0 0 0 | &H40 | &H41 | &H70 | &H71 | '| 1 0 0 | &H42 | &H43 | &H72 | &H73 | '| 0 1 0 | &H44 | &H45 | &H74 | &H75 | '| 1 1 0 | &H46 | &H47 | &H76 | &H77 | '| 0 0 1 | &H48 | &H49 | &H78 | &H79 | '| 1 0 1 | &H4A | &H4B | &H7A | &H7B | '| 0 1 1 | &H4C | &H4D | &H7C | &H7D | '| 1 1 1 | &H4E | &H4F | &H7E | &H7F | '------------------------------------------------------------------ '-------------------------------------------------------------------------------
Const Чтение_сегменты_pcf8574 = &H70 Const Запись_сегменты_pcf8574 = &H71
Const Чтение_разряды_pcf8574 = &H7E Const Запись_разряды_pcf8574 = &H7F
Const Разряды_set = &B11111111 Const Разряды_reset = &B00000000
' ------------------------------------------------------------------------------
' Немного отвлечемся. ' Бытует мнение, что компилятор не дружит с кирилицей. ' Исходя из личного опыта могу сказать, конфликтов не наблюдалось. ' Единсвенное ограничение - количество символов в именах. Думаю Вам хватит с избытком.
'------------------------------------------------------------------------------- '----------------- Определение переменных и констант ------------------- '------------------------------------------------------------------------------- Начальные_настройки: ' Просто метка, для удобства '-------------------------------------------------------------------------------
Dim Тип_индикатора_1_канал As Byte ' Переменная, для хранения значения типа индикатора Тип_индикатора_1_канал = 0 ' Если тип_индикатора = 1 , то ОК , если Тип_индикатора = 0 , То ОA
Dim Тип_индикатора_2_канал As Byte ' Переменная, для хранения значения типа индикатора Тип_индикатора_2_канал = 0 ' Если тип_индикатора = 1 , то ОK , если Тип_индикатора = 0 , То ОA
'-------------------------------------
Const Общее_количество_разрядов = 8 ' Переменная, для хранения значения общего количества используемых разрядов
Const Скорость_изменения_переменной = 50 ' Переменная, для хранения значения задержки "Waitms" Const Значение_регистра_tcnt0_timer0 = 250 ' Переменная, для хранения значения регистра TCNT0
'------------------------------------------------------------------------------- Dim Разряд As Byte
Dim Цикл_led As Byte ' Переменная, для хранения количества выводимых разрядов (нужна для разбивки значения на разряды) Dim Счетчик_миганий As Word ' Счетчик для обработки частоты и длительности мигания Dim Частота_мигания As Word ' Переменная, для хранения значения частоты мигания при Флаг_мигание(n) = 1 Dim Счетчик_разрядов As Byte ' Счетчик перебора разрядов Dim Переменная_word_1 As Word ' Переменная, которую будем менять Dim Переменная_word_2 As Word ' Переменная, которую будем менять Dim Выводимая_цифра_led As Byte ' Переменная, для загрузки цифр в порт Dim Выводимые_данные_led As Word ' Переменная, для хранения выводимых данных Dim Копия_выводимые_данные_led As Word ' Переменная, для временного хранения выводимых данных (нужна для разбивки значения на разряды) Dim 1_канал_выводимые_данные_led As Word ' Переменная, для хранения выводимых данных Dim 2_канал_выводимые_данные_led As Word ' Переменная, для хранения выводимых данных Dim Длительность_горения_при_мигании As Word ' Переменная, для хранения значения длительности горения знакоместа при "Флаг_мигание(n) = 1" Dim Цифра(общее_количество_разрядов) As Byte ' Значение разряда для 8-ми разрядов Dim Флаг_точка(общее_количество_разрядов) As Byte ' Флаг точки для 8-ми разрядов Dim Флаг_гашение(общее_количество_разрядов) As Byte ' Флаг гашения нужного разряда для 8-ми разрядов Dim Флаг_мигание(общее_количество_разрядов) As Byte ' Флаг мигания нужного разряда для 8-ми разрядов Dim Дополнительный_символ(общее_количество_разрядов) As Byte ' Переменная, для хранения значения дополнительного символа при Флаг_дополнительный_символ(n) = 1 Dim Флаг_дополнительный_символ(общее_количество_разрядов) As Byte ' Флаг сигнализирующий о выводе дополнительных символов для 8-ми разрядов
'------------------------------------------------------------------------------- '---------------------- Определение подпрограмм ------------------------ '-------------------------------------------------------------------------------
Declare Sub Гашение_разрядов() Declare Sub Индикация_7seg_led() Declare Sub Обработка_прерывания_timer0()
'------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------ Настройка таймера для обновления LED индикации ----------- '-------------------------------------------------------------------------------
Config Timer0 = Timer , Prescale = 64 , Clear Timer = 0
'-------------------------------------------------------------------------------
' Даём понять компилятору, что будем использовать таймер в режиме таймера (простите за каламбур), ' с предварительным делителем "PRESCALE = 1024". ' и что же мы имеем: f(тактовая частота - 4МГц) / 1024(настраиваемый делитель таймера ' (возможные варианты - 1 , 8 , 64 , 256 , 1024)) = 3906.25 тактов МК будет проходить, 'пока сработает прерывание от переполнения таймера. так, как перед этим мы проштудировали Datasheet 'и выяснили, что "TIMER0" , считает до 256, то 3 906,25 / 256 ~ 15,26 раз в секунду 'будет обновлятся наша Led индикация (при 8-ми разрядной динамической индикации мы получим ~ 15,26 / 8 = "пшик", 'Это Просто Катастрофа). К нашей великой радости, разработчики "Atmel" продумали этот момент, 'у таймера есть различные регистры, которыми можно манипулировать. 'В данном, конкретном случае, нас интересует регистр "TCNT0". Tcnt0 - 8-ми разрядный(от 0 До 255) регистр таймера - счетчика(TIMER0). 'именно он используетя таймером для счета. Вот его мы, и будем использовать.
'------------------------------------------------------------------------------- ' Настройка дополнительного делителя таймера для обновления LED индикации '-------------------------------------------------------------------------------
' Tcnt0 = Значение_регистра_tcnt0_timer0 ' Настройка дополнительного делителя таймера (значение = 250)
'--------------------------------------------------------------------------------
'И чего мы добились, да просто "TIMER0" будет считать не с "0", а с нашего значения. 'Посчитаем ещё раз: 4000000 / 1024 / (256-(значение Tcnt0)) = 3 906,25 / 6 ~ 651 'прерывание "TIMER0" в секунду, или 1000(ms) / 651 ~ 1,536 ms, 'это и будет частотой обновления нашей 7-seg LED индикации.
'Идем дальше.
'Итак, что мы имеем: порты настроены, периодичность обновления установлена, 'а вот, что будет происходить после прерывания "TIMER0", мы не написали, 'исправляемся.
'Назначим подпрограмму, которая будет выполняться после каждого прерывания таймера.
'------------------------------------------------------------------------------- '----------- Подпрограмма выполняемая после прерывания TIMER0 ---------- '-------------------------------------------------------------------------------
On Timer0 Обработка_прерывания_timer0 ' Переход на подпрограмму после каждого прерывания TIMER0
'----------------------- Первоначальные установки ----------------------- '-------------------------------------------------------------------------------
Переменная_word_1 = 0 ' Значение, которое будем увеличивать Переменная_word_2 = 50 ' Значение, которое будем уменьшать
Частота_мигания = 300 ' Значение частоты мигания знакоместа на LED дисплее при "Флаг_мигание(n) = 1" Длительность_горения_при_мигании = Частота_мигания / 2 ' Значение длительности горения знакоместа на LED дисплее при "Флаг_мигание(n) = 1"
'------------------------------------------------------------------------------- '------------------------ Работа с прерываниями ------------------------ '-------------------------------------------------------------------------------
Enable Timer0 ' Разрешаем работу прерывания по ПЕРЕПОЛНЕНИЮ таймера
Enable Interrupts ' Разрешаем работу всех прерываний
'------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '-------------------------- Начало программы --------------------------- '-------------------------------------------------------------------------------
Do : Nop ' Крутимся между Do и Loop, ожидая прерывания TIMER0, для обновления LED индикации
'--------------------------
Incr Переменная_word_1 ' Считаем, просто для примера If Переменная_word_1 > 9999 Then Переменная_word_1 = 0 ' Если досчитали до 9999, сбрасываем счетчик 1_канал_выводимые_данные_led = Переменная_word_1 ' Будем выводить в 1 канал (первые 4 разряда)
Decr Переменная_word_2 ' Уменьшаем переменную 2_канал_выводимые_данные_led = Переменная_word_2 ' Будем выводить в 2 канал (первые 4 разряда)
If Переменная_word_2 = 0 Then ' Если досчитали до 0, выводим "stop", и мигаем Флаг_дополнительный_символ(5) = 1 : Дополнительный_символ(5) = 5 ' символ "S" Флаг_дополнительный_символ(6) = 1 : Дополнительный_символ(6) = 14 ' символ "t" Флаг_дополнительный_символ(7) = 1 : Дополнительный_символ(7) = 15 ' символ "o" Флаг_дополнительный_символ(8) = 1 : Дополнительный_символ(8) = 28 ' символ "P"
Флаг_мигание(5) = 1 ' Мигаем 5 разрядом Флаг_мигание(6) = 1 ' Мигаем 6 разрядом Флаг_мигание(7) = 1 ' Мигаем 7 разрядом Флаг_мигание(8) = 1 ' Мигаем 8 разрядом
End If
Waitms Скорость_изменения_переменной ' Задержка, для частоты смены показаний индикаторов
'-------------------------- Loop End '------------------------------------------------------------------------------- '******************************************************************************* '***************** Подпрограмма обработки прерывания TIMER0 **************** '***************** происходит каждые 1,536 ms **************** '******************************************************************************* '------------------------------------------------------------------------------- Обработка_прерывания_timer0: '------------------------------------------------------------------------------- ' Stop Timer0 Rcall Индикация_7seg_led ' Start Timer0 '------------------------------------------------------------------------------- ' Делитель TIMER0 = 1000/(4000000/1024/(256-250))=1000/(3 906,25 / 6) = 1,536 ms '-------------------------------------------------------------------------------
' Tcnt0 = Значение_регистра_tcnt0_timer0
'------------------------------------------------------------------------------- Return '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '***************** Подпрограмма для обработки LED индикации **************** '******************************************************************************* '------------------------------------------------------------------------------- Индикация_7seg_led: '------------------------------------------------------------------------------- '---------- Смотрим, что будем выводить и делаем копию переменной --------- '------------------------------------------------------------------------------- Выводимые_данные_led = 1_канал_выводимые_данные_led
Копия_выводимые_данные_led = Выводимые_данные_led '------------------------------------------------------------------------------- '------------------ В цикле разбиваем на разряды, с 4 по 1 ----------------- '------------------------------------------------------------------------------- For Цикл_led = 4 To 1 Step -1 ' цикл в котором разбивается переменная на 4 числа Выводимые_данные_led = Копия_выводимые_данные_led Mod 10 Цифра(цикл_led) = Выводимые_данные_led ' Копия_выводимые_данные_led = Копия_выводимые_данные_led / 10 ' Next '------------------------------------------------------------------------------- '---------- Смотрим, что будем выводить и делаем копию переменной --------- '------------------------------------------------------------------------------- Выводимые_данные_led = 2_канал_выводимые_данные_led '
Копия_выводимые_данные_led = Выводимые_данные_led '------------------------------------------------------------------------------- '------------------ В цикле разбиваем на разряды, с 8 по 5 ----------------- '------------------------------------------------------------------------------- For Цикл_led = 8 To 5 Step -1 ' цикл в котором разбивается переменная на 4 числа Выводимые_данные_led = Копия_выводимые_данные_led Mod 10 Цифра(цикл_led) = Выводимые_данные_led ' Копия_выводимые_данные_led = Копия_выводимые_данные_led / 10 ' Next '------------------------------------------------------------------------------- '---------------------- Гасим все разряды индикатора ----------------------- '------------------------------------------------------------------------------- If Тип_индикатора_1_канал = 1 Then I2csend Запись_разряды_pcf8574 , Разряды_set ' Переход к подпрограмме гашения индикаторов Else I2csend Запись_разряды_pcf8574 , Разряды_reset ' Переход к подпрограмме гашения индикаторов End If
If Тип_индикатора_2_канал = 1 Then I2csend Запись_разряды_pcf8574 , Разряды_set ' Переход к подпрограмме гашения индикаторов Else I2csend Запись_разряды_pcf8574 , Разряды_reset ' Переход к подпрограмме гашения индикаторов End If '------------------------------------------------------------------------------- '---- Перебираем разряды, в каждом прерывании выводим следующий разряд ----- '------------------------------------------------------------------------------- Incr Счетчик_разрядов '------------------------------------------------------------------------------- '----- Выбираем разряд для загрузки в обработчик вывода на 7-seg LED ------ '------------------------------------------------------------------------------- If Счетчик_разрядов > Общее_количество_разрядов Then Счетчик_разрядов = 1 End If '------------------------------------------------------------------------------------ ' Участок кода отвечающий за мигание, тушение разрядов и выводит точку в нужном месте '------------------------------------------------------------------------------------ '------------------------------------------------------------------------------- '---------------------------- Подготовка к миганию -------------------------- '------------------------------------------------------------------------------- Incr Счетчик_миганий
If Счетчик_миганий > Частота_мигания Then Счетчик_миганий = 1 '------------------------------------------------------------------------------- '------------------ Если надо, то мигаем в нужных разрядах ------------------ '------------------------------------------------------------------------------- If Флаг_мигание(счетчик_разрядов) = 1 And Счетчик_миганий > Длительность_горения_при_мигании Or Флаг_гашение(счетчик_разрядов) = 1 Then ' Если флаг мигания этого разряда выставлен и счетчик > 200 Select Case Счетчик_разрядов Case 1 To 4 If Тип_индикатора_1_канал = 1 Then Выводимая_цифра_led = Lookup(11 , Цифры_ok) ' Выводим пустое место в 1 - 4 разрядах Else Выводимая_цифра_led = Lookup(11 , Цифры_oa) ' Выводим пустое место в 1 - 4 разрядах End If Case 5 To 8 If Тип_индикатора_2_канал = 1 Then Выводимая_цифра_led = Lookup(11 , Цифры_ok) ' Выводим пустое место в 5 - 8 разрядах Else Выводимая_цифра_led = Lookup(11 , Цифры_oa) ' Выводим пустое место в 5 - 8 разрядах End If End Select Else '------------------------------------------------------------------------------- '----------------------- Выводим дополнительные симвоы --------------------- '------------------------------------------------------------------------------- If Флаг_дополнительный_символ(счетчик_разрядов) = 1 Then Select Case Счетчик_разрядов Case 1 To 4 If Тип_индикатора_1_канал = 1 Then Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_ok) ' Выводим дополнительный_символ в 1 - 4 разрядах Else Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_oa) ' Выводим дополнительный_символ в 1 - 4 разрядах End If Case 5 To 8 If Тип_индикатора_2_канал = 1 Then Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_ok) ' Выводим дополнительный_символ в 5 - 8 разрядах Else Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_oa) ' Выводим дополнительный_символ в 5 - 8 разрядах End If End Select Else '------------------------------------------------------------------------------- '------- Если не мигаем и ничего другого не выводим, выводим основное ------ '------------------------------------------------------------------------------- Выводимая_цифра_led = Цифра(счетчик_разрядов) Select Case Счетчик_разрядов Case 1 To 4 If Тип_индикатора_1_канал = 1 Then Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_ok) ' Если не выводим дополнительную информацию, выводим основную в 1 - 4 разрядах Else Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_oa) ' Если не выводим дополнительную информацию, выводим основную в 1 - 4 разрядах End If Case 5 To 8 If Тип_индикатора_2_канал = 1 Then Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_ok) ' Если не выводим дополнительную информацию, выводим основную в 5 - 8 разрядах Else Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_oa) ' Если не выводим дополнительную информацию, выводим основную в 5 - 8 разрядах End If End Select End If '------------------------------------------------------------------------------- '------------- Если необходимо, выводим точку в нужном разряде ------------- '------------------------------------------------------------------------------- If Флаг_точка(счетчик_разрядов) = 1 Then Выводимая_цифра_led = Выводимая_цифра_led Xor &H80 '&H80 или &B10000000 добавляем к выводимой цифре точку End If End If '------------------------------------------------------------------------------- '--------------------- Загружаем в порт код цифры ---------------------- '------------------------------------------------------------------------------- I2csend Запись_сегменты_pcf8574 , Выводимая_цифра_led '------------------------------------------------------------------------------- '--------------- Включаем соответствующий разряд индикатора ---------------- '------------------------------------------------------------------------------- Select Case Счетчик_разрядов Case 1 : If Тип_индикатора_1_канал = 0 Then Разряд = &B00000001 Else Разряд = &B11111110 Case 2 : If Тип_индикатора_1_канал = 0 Then Разряд = &B00000010 Else Разряд = &B11111101 Case 3 : If Тип_индикатора_1_канал = 0 Then Разряд = &B00000100 Else Разряд = &B11111011 Case 4 : If Тип_индикатора_1_канал = 0 Then Разряд = &B00001000 Else Разряд = &B11110111 Case 5 : If Тип_индикатора_2_канал = 0 Then Разряд = &B00010000 Else Разряд = &B11101111 Case 6 : If Тип_индикатора_2_канал = 0 Then Разряд = &B00100000 Else Разряд = &B11011111 Case 7 : If Тип_индикатора_2_канал = 0 Then Разряд = &B01000000 Else Разряд = &B10111111 Case 8 : If Тип_индикатора_2_канал = 0 Then Разряд = &B10000000 Else Разряд = &B01111111 End Select '------------------------------------------------------------------------------- '--------------------------- Загружаем в PCF8574 --------------------------- '------------------------------------------------------------------------------- I2csend Запись_разряды_pcf8574 , Разряд ' Короткий вариант записи данных в PCF8574 Выход '------------------------------------------------------------------------------- Return '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Цифры_ok: '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '---------------------------- Можно написать так --------------------------- '------------------------------------------------------------------------------- ' Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F '0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ' Data &H40 , &H00 , &H63 , &H39 , &H78 , &H5C , &H38 , &H74 , &H5E , &H77 '"-", "", "значек градуса", "С", "t", "o", "L", "h", "d", "A" ' Data &H58 , &H31 , &H76 , &H79 , &H50 , &H71 , &H1C , &H73 , &H37 , &H80 '"c", "Г", "Н", "E", "r", "F", "U", "u", "P", "П". "." ' Data &H54 ', &H , &H , &H , &H , &H , &H , &H , &H , &H '"n", "", "", "", "", "", "", "", "", "". "" '------------------------------------------------------------------------------- '------- а можно так, выглядит нагляднее, но работать будет одинаково ------ '------------------------------------------------------------------------------- Data &H3F ' 0 "0" Data &H06 ' 1 "1" Data &H5B ' 2 "2" Data &H4F ' 3 "3" Data &H66 ' 4 "4" Data &H6D ' 5 "5" Data &H7D ' 6 "6" Data &H07 ' 7 "7" Data &H7F ' 8 "8" Data &H6F ' 9 "9" Data &H40 ' 10 "_" Data &H00 ' 11 "Пустое место" Data &H63 ' 12 "Значек градуса" Data &H39 ' 13 "С" Data &H78 ' 14 "t" Data &H5C ' 15 "o" Data &H38 ' 16 "L" Data &H74 ' 17 "h" Data &H5E ' 18 "d" Data &H77 ' 19 "A" Data &H58 ' 20 "c" Data &H31 ' 21 "Г" Data &H76 ' 22 "H" Data &H79 ' 23 "E" Data &H50 ' 24 "r" Data &H71 ' 25 "F" Data &H3E ' 26 "U" Data &H1C ' 27 "u" Data &H73 ' 28 "P" Data &H37 ' 29 "П" Data &H80 ' 30 "Точка" Data &H54 ' 31 "n" '------------------------------------------------------------------------------- Цифры_oa: '------------------------------------------------------------------------------- ' Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 '0,1,2,3,4,5,6,7,8,9 ' Data &HBF , &HFF , &H9C , &HC6 , &H87 , &HA3 , &HC7 , &H8B , &HA1 , &H88 '"-", "", "значек градуса", "С", "t", "o", "L", "h", "d", "A" ' Data &HA7 , &HCE , &H89 , &H86 , &HAF , &H8E , &HC1 , &HE3 , &H8C , &HC8 '"c", "Г", "Н", "E", "r", "F", "U", "u", "P", "П" ' Data &H7F , &HAB ', &H , &H , &H , &H , &H , &H , &H , &H , &H ' "." , "n", "", "", "", "", "", "", "", "", "". "" '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------- а можно так, выглядит нагляднее, но работать будет одинаково ------ '------------------------------------------------------------------------------- Data &HC0 ' 0 "0" Data &HF9 ' 1 "1" Data &HA4 ' 2 "2" Data &HB0 ' 3 "3" Data &H99 ' 4 "4" Data &H92 ' 5 "5" Data &H82 ' 6 "6" Data &HF8 ' 7 "7" Data &H80 ' 8 "8" Data &H90 ' 9 "9" Data &HBF ' 10 "_" Data &HFF ' 11 "Пустое место" Data &H9C ' 12 "Значек градуса" Data &HC6 ' 13 "С" Data &H87 ' 14 "t" Data &HA3 ' 15 "o" Data &HC7 ' 16 "L" Data &H8B ' 17 "h" Data &HA1 ' 18 "d" Data &H88 ' 19 "A" Data &HA7 ' 20 "c" Data &HCE ' 21 "Г" Data &H89 ' 22 "H" Data &H86 ' 23 "E" Data &HAF ' 24 "r" Data &H8E ' 25 "F" Data &HC1 ' 26 "U" Data &HE3 ' 27 "u" Data &H8C ' 28 "P" Data &HC8 ' 29 "П" Data &H7F ' 30 "Точка" Data &HAB ' 31 "n" '------------------------------------------------------------------------------- '*******************************************************************************
'-------------------------------------------------------------------------------
Адресация PCF8574, PCF8574N, PCF8574A, PCF8575 производитель "Philips"
| PCF8574,PCF8574N, PCF8575 | PCF8574A, PCF8574AP | A0 | A1 | A2 | Чтение | Запись | Чтение | Запись | 0 | 0 | 0 | &H40 | &H41 | &H70 | &H71 | 1 | 0 | 0 | &H42 | &H43 | &H72 | &H73 | 0 | 1 | 0 | &H44 | &H45 | &H74 | &H75 | 1 | 1 | 0 | &H46 | &H47 | &H76 | &H77 | 0 | 0 | 1 | &H48 | &H49 | &H78 | &H79 | 1 | 0 | 1 | &H4A | &H4B | &H7A | &H7B | 0 | 1 | 1 | &H4C | &H4D | &H7C | &H7D | 1 | 1 | 1 | &H4E | &H4F | &H7E | &H7F |
Адресация PCF8574 производитель "Texas Instruments"
Эмуляция в "Протеус", исходник, документация Видео работы в "Протеус" Видео работы в железе
|