Листинг 16.15

Gcykle

        cpi temp,0xA1  ;установить RTC + 6 байт BCD, начиная с секунд

        breq ргос_А1

        cpi temp,0xA2  ;читать часы в комп.

        breq ргос_А2

rjmp Gcykle

proc_A1:  ;А1 установка часов

              rcall SetTime

rjmp Gcykle

proc_A2:  ;А2 читать часы в комп. из памяти

              rcall ReadTime;

rjmp Gcykle

              ;Процедура преобразования BCD в HEX, специально для времени HEX_time:

;на входе в ZL адрес секунды, часы или минуты на выходе в temp hex-значение,

                     ld temp,Z;

                     andi temp,0b11110000  ;распаковываем — старший

                     swap temp  ;старший в младшей тетраде

                     mul temp,mult10  ; умножаем на 10 в r0 результат

                     ld temp,Z;

                     andi temp,0b00001111  ; младший

                     add temp,r0  ;получили hex

ret

Sclock:  ;получить из компьютера 6 байт и записать в память

             ldi ZH, 0x01  ;старший RAM

             ldi ZL,Sek  ;Ram

         rcall in_com

         st Z+,temp  ;sek

         rcall in_com

         st Z+,temp  ;min

         rcall in_com

         st Z+,temp  ;hour

         rcall in_com

         st Z+,temp  ;data

         rcall in_com

         st Z+,temp  ;month

         rcall in_com

         st Z,temp  ;year

push cnt  ;сохраняем cnt на всякий случай

              rcall SetClk  ;переписываем в часы

pop cnt

ret

Setclk:  ;установить часы

              sbis PinC,pSDA  ;линия занята

              rcall err_i2c

              ldi ZH,0x01

              ldi ZL,Sek  ;адрес секунд в памяти

          ldi ClkA,0  ;регистр секунд ld DATA,Z+ ;извлекаем секунды

          rcall write_i2c  ;секунды записываем

          brcs stops

          ldi ClkA,1  ;регистр минут

          ld DATA,Z+  ;извлекаем минуты

          rcall write_i2c  ;минуты записываем

          brcs stopS

          ldi ClkA,2  ;регистр часов

          ld DATA,Z+

          rcall write_i2c  ;записываем часы

          brcs stopS

          ldi ClkA,4  ;регистр даты (день недели пропускаем)

          ld DATA,Z+

          rcall write_i2c  ;записываем дату

          brcs stopS

          ldi ClkA,5  ;регистр месяца

          ld DATA,Z+

          rcall write_i2c  ;месяц записываем

          brcs stopS

          ldi ClkA,6  ;регистр года

          ld DATA,Z

          rcall write_i2c  ;год записываем

          brcs stopS

          ldi ClkA,7  ;регистр установок — на всякий случай

          ldi DATA, 0Ь00010000

          rcall write_i2c

          brcs stopS

          ldi temp,$AA  ;все отлично

          rcall out_com

   ret

stopS:

                 ldi temp,$EE  ;подтверждение не получено

                 rcall out_com

ret

SetTime:  ;установка текущих значений в МК

cli

           rcall Sclock  ;записали из компьютера BCD-значения

                 ldi ZL,Sek  ;упакованные секунды

                 rcall HEX_time  ;имеем hex-секунды в temp

                 mov count_sek,temp  ;переписываем в счетчик

           ;далее распаковываем для индикации: часы-минуты

                 ldi ZL,Hour  ;распакованные в память

                 ld temp,Z

                 mov data,temp

                 andi temp,0b00001111  ;младший часов

                 ldi ZL,DeH

                 st Z,temp

                 andi data, 0b11110000  ;старший часов

                 swap data  ;старший в младшей тетраде

                 ldi ZL,DdH

                 st Z,data

                 ldi ZL,Min  ;распакованные в память

                 ld temp,Z

                 mov data,temp

                 andi temp,0b00001111  ;младший минут

                 ldi ZL,DeM

                 st Z,temp

                 andi data,0b11110000  ;старший минут

                 swap data  ;старший в младшей тетраде

                ldi ZL,DdM

                st Z,data

sei

ret

ReadTime:  ;чтения часов из памяти в порядке ЧЧ: ММ ДД. мм. ГГ

cli

           rcall ReadClk  ;сначала читаем из часов

           ldi ZH,1  ;старший RAM

           ldi ZL,Hour

           ld temp,Z

           rcall out_com  ;hour

           ldi ZL,Min

           ld temp,Z;

           rcall out_com  ;min

           ldi ZL,Sek

           ld temp,Z;

           rcall out_com  ;sek

           ldi ZL,Date

           ld temp,Z+;

           rcall out_com  ;data

           ld temp,Z+;

           rcall out_com  ;month

           ld temp,Z;

           rcall out_com  ;year

sei

ret

Перейти на страницу:

Поиск

Похожие книги