Я программирую PIC18F94K20 для совместной работы с кораблем MCC7941X I2C RTCC и 24AA128 I2C CMOS Serial EEPROM. В настоящее время у меня есть код, который успешно выполняет инициализацию секунд/дней/etc значений RTCC и запускает таймер, переключая светодиод на оборот каждой секунды.логические операторы и вычисление разрядности в C (программирование ПИК)
Я пытаюсь увеличить код, чтобы прочитать правильные данные для этих значений, однако я столкнулся с трудностями, когда пытаюсь объяснить различные «лишние» биты в значениях. Карта памяти может помочь прояснить мою проблему несколько:
Взятие, например, столбец часов, или адрес 02h. Бит 6 устанавливается как 1 для переключения 12-часового времени, добавляя 01000000 к бит времени. Я могу прочитать все содержимое байта по этому адресу, но я хочу использовать оператор if, чтобы определить, установлено ли 12 или 24 часа, и соответствующим образом скорректировать. Я не беспокоюсь о 10-часовых битах, так как я могу рассчитать это достаточно легко с циклом преобразования BCD (я думаю).
Ранее я использовал побитовый оператор OR в C, чтобы увеличить исходные данные часов до 24. Я инициализировал часы в этом конкретном случае 0x11 и установил 12-часовой бит управления, равный 0x64. При установке времени:
WriteI2C(0x11|0x64);
который, как вы видите, использует побитовое ИЛИ.
При чтении часов, как я могу включить операторов в свой код, чтобы отделить лишние биты от фактических битов времени? Я попытался сделать что-то вроде этого:
current_seconds = ReadI2C();
current_seconds = ST & current_seconds;
но это полностью разрушает все. Он компилируется, но устройство «застревает» в этой последовательности.
Как отделить бит ST/AMPM/VBATEN от фактических данных, которые мне нужны, и что бы хороший метод реализовать для циклов для различных условий, которые они представляют (например, чтение 12-часового времени, если бит 6 = 0 и 24 часа, если бит6 = 1 и т. Д.).
Я немного новичок C, и это мой первый набег на электронику, поэтому я очень ценю любую помощь. Благодарю.
Я не думаю, что этот вопрос подходит здесь. просто прочитайте о побитовых операторах (|, &, <<) и бит-манипуляции. –
Вы рекомендуете где угодно, что может быть более уместным? Извините, если я потерял его. – samanthapants
Маскировка бит, который вы хотите посмотреть, выполняется с помощью оператора & и бит, установленного в 1, который вы хотите разделить. Итак, если вы смотрите на мои прочитанные секунды, возможно, просто конвертированы с помощью (((regdata & 0x7) * 10) + (regdata & 0xf), я думаю, – kenny