Смекни!
smekni.com

Разработка многофункциональных астрономических часов (стр. 10 из 12)

cblock 0x78

INT_W

INT_STATUS

INT_PCLATH

INT_FSR

INT_PULSECTR

INT_TIMER

endc

cblock 0xA0

ТИМ:16*4

endc

cblock 0x120

LEN:16*4

endc

cblock 0x1A0

ALM:16*4

endc

cblock 0x1E0

TMR_SETTINGS:16*1

endc

org 0x00

Запуск goto

org 0x04

nop ; код прерывания следует - избегать потенциальных страниц проблем нумерации

Прерывание

movwf INT_W

swapf STATUS,W

СТАТУС clrf

movwf INT_STATUS

movf PCLATH,w

movwf INT_PCLATH

clrf PCLATH

movf FSR,w

movwf INT_FSR

;banksel T1CON; таймер остановки

bcf T1CON,TMR1ON

banksel TMR1H ; установленный TMR1 counter

decf INT_PULSECTR,f

btfss STATUS,Z

goto Interrupt_std_len

movlw TMR_XTR_LO

movwf TMR1L

movlw TMR_XTR_H

movwf TMR1H

movlw PULSES_PER_TICK

movwf INT_PULSECTR

incf INT_TIMER,f

goto Interrupt_continue

Interrupt_std_len

movlw TMR_STD_LO

movwf TMR1L

movlw TMR_STD_HI

movwf TMR1H

Interrupt_continue

banksel PIR1 ; очистите кусок избытка TMR1

bcf PIR1,TMR1IF

banksel PIE1 ; разрешите прерывание TMR1

bsf PIE1,TMR1IE

banksel T1CON ; стартовый таймер

bsf T1CON,TMR1ON

banksel PORTC

;movf INT_FSR,w

movwf FSR

movf INT_PCLATH,w

movwf PCLATH

swapf INT_STATUS,w

СТАТУС movwf

swapf INT_W,F

swapf INT_W,W

retfie

TMR_Init

banksel INTCON

bsf INTCON,PEIE

bsf INTCON,GIE

banksel T1CON

movlw b'00000000'

banksel PORTC

movlw PULSES_PER_TICK

movwf INT_PULSECTR

banksel PIR1 ; очистите кусок избытка TMR1

bcf PIR1,TMR1IF

banksel PIE1 ; разрешите прерывание TMR1

bsf PIE1,TMR1IE

banksel T1CON ; стартовый таймер

bsf T1CON,TMR1ON

banksel PORTC

возврат

SM_Init

movlw низкий S00_TimerSelectLoop

movwf STATE_LO

movlw высокий S00_TimerSelectLoop

movwf STATE_HI

возврат

Запуск

ФЛАГИ clrf

clrf INT_TIMER

clrf LOOP_TIMER

clrf LCD_CURSOR_POSITION

вызовите EEPROM_CheckInit

вызовите PORTS_Init

вызовите LCD_Init

вызовите SM_Init

вызовите ReadTimerDataFromEEPROM

clrf SEL_TMR

вызовите LCD_UpdateTimerLabel

вызовите TMR_Init

вызовите SPK_Whip

MainLoop

вызовите IfPlaySound

btfsc FLAGS,F_VALUE_ENTERED

вызовите ProcessEnteredValue

btfsc FLAGS,F_TMR_LABEL_DIRTY

вызовите LCD_UpdateTimerLabel

movf MSG_ID,w

subwf MSG_ID_CURRENT,w

btfss STATUS,Z

вызовите LCD_UpdateSecondRowMessage

btfsc FLAGS,F_VAL_DISPLAY_DIRTY

вызовите LCD_UpdateValDisplay

вызовите IfTick

вызовите KBD_Scan

movf STATE_HI,w

movwf PCLATH

movf STATE_LO,w

movwf PCL; идите к государственному аппарату

SM_Rtn; возвратная точка государственного аппарата

movlw высокий SM_Rtn

movwf PCLATH

movlw 0xFF

movwf BTN_ID

btfsc FLAGS,F_CURSOR_DIRTY

вызовите LCD_UpdateCursor

btfsc FLAGS,F_TICK

goto MainLoop_Tick

clrf TMP

MainLoop_Delay ; клавиатура debounce

decf TMP,f

nop

nop

btfss STATUS,Z

goto MainLoop_Delay

goto MainLoop

MainLoop_Tick

movf SEL_TMR,w

movwf CTR1

вызовите LoadSelTmrSettingsAndLen

вызовите MC_Normalize

вызовите MC_NormalizedTo86400

вызовите MC_86400toHMS

вызовите LCD_UpdateTimer

movf MSG_ID,w

sublw MSG_ID_Clear

btfss STATUS,Z

goto MainLoop

movf SEL_TMR,w

movwf CTR1

вызовите LoadSelTmrSettingsAndLen

вызовите MC_Normalize

вызовите MC_NormalizedToJulianNormalized

вызовите MC_NormalizedToDecimal

вызовите LCD_UpdateTimerDecimalPt

bcf FLAGS,F_TICK

goto MainLoop

ProcessEnteredValue

bcf FLAGS,F_VALUE_ENTERED

movf VAL_STAT,w

sublw D_SEL_TIMER_LENGTH

btfsc STATUS,Z

goto ProcessEnteredValue_STLEN

movf VAL_STAT,w

sublw D_SEL_TIMER

btfsc STATUS,Z

goto ProcessEnteredValue_ST

movf VAL_STAT,w

sublw D_SEL_TIMER_ALARM

btfsc STATUS,Z

goto ProcessEnteredValue_STALM

sublw D_SEL_TIMER_COPY

btfsc STATUS,Z

goto ProcessEnteredValue_COPY

возврат

ProcessEnteredValue_STALM

bsf STATUS,IRP; копируйте VAL в смятение

ProcessEnteredValue_ST

movf REG,w; копируйте VAL в таймер (или смятение, если STATUS,IRP является набором)

movwf FSR

movf VAL,w

movwf INDF

incf FSR,f

movf VAL+1,w

movwf INDF

incf FSR,f

movf VAL+2,w

movwf INDF

incf FSR,f

movf VAL+3,w

movwf INDF

bcf STATUS,IRP

возврат

ProcessEnteredValue_COPY

; НЕ ВЫПОЛНЯЮТ В ЭТОЙ ВЕРСИИ

; - получить таймер ID от данных часа

; - значение таймера груза

; - нормализировать значение

; - de-нормализировать отобранный ряд таймера значения

; - значение таймера копии к отобранному таймеру

возврат

ProcessEnteredValue_STLEN ; копируйте VAL в отобранную длину таймера

movf SEL_TMR,w

movwf CTR1

вызовите CalculateEEPROMAddressFromCTR1

incf EE_ADDR,f

вызовите CalculateFileAddressFromCTR1

clrf TMP

ProcessEnteredValue_STLEN_1

movf TMP,w

addlw VAL

movwf FSR

movf INDF,w

movwf VAL_DIGIT

bsf STATUS,IRP

movf REG,w

andlw 0x7F

addwf TMP,w

movwf FSR

movf VAL_DIGIT,w

movwf INDF

bcf STATUS,IRP

movwf EE_DATA

вызовите EEPROM_Write

incf EE_ADDR,f

incf TMP,f

movf TMP,w

sublw 0x04

btfss STATUS,Z

goto ProcessEnteredValue_STLEN_1

вызовите LoadSelTmrSettingsAndLen

возврат

PORTS_Init

banksel PORTA

clrf PORTA

clrf PORTB

clrf PORTC

clrf PORTD

clrf PORTE

banksel TRISA

movlw b'00000110'

movwf ADCON1

movlw b'11111100' ; RA0=LED, RA1=SPK

movwf TRISA

movlw b'11110000' ; KBD

movwf TRISB

bcf OPTION_REG,7; ; разрешите слабые натяжения PORTB

clrf TRISC ; LCD: DB0-DB7

movlw 0xFF

movwf TRISD ; не используют - все входы

movlw b'0000000' ; LCD: RE0=RS, RE1=R/W; RE2=E

movwf TRISE

movlw b'11000000' ; разрешите прерывания

movwf INTCON

banksel PORTA

возврат

CalculateEEPROMAddressFromCTR1

; Высчитайте адрес данных таймера в EEPROM

movf CTR1,w

movwf EE_ADDR

bcf STATUS,C

rlf EE_ADDR,f

rlf EE_ADDR,f

rlf EE_ADDR,f

addwf EE_ADDR,f

возврат

CalculateFileAddressFromCTR1

; Адрес offsett таймера в РЕДЖЕ

movf CTR1,w

РЕДЖ movwf

bcf STATUS,C

rlf REG,f

rlf REG,f

ТИМ movlw

addwf REG,f

возврат

ReadTimerDataFromEEPROM

clrf CTR1

ReadTimerDataFromEEPROM_loop

вызовите CalculateEEPROMAddressFromCTR1

вызовите CalculateFileAddressFromCTR1

; Установки таймера груза

movf CTR1,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

вызовите EEPROM_Read

movwf INDF

; Длины груза

incf EE_ADDR,f

movf REG,w

andlw 0x7F

movwf FSR

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

bcf STATUS,IRP

; Offsetts груза (начальные значения)

incf EE_ADDR,f

movf REG,w

movwf FSR

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf CTR1,f

movf CTR1,w

sublw 0x10

btfss STATUS,Z

goto ReadTimerDataFromEEPROM_loop

возврат

EEPROM_CheckInit

movlw 0xFE

movwf EE_ADDR

вызовите EEPROM_Read

movlw 0xA5

subwf EE_DATA,w

btfss STATUS,Z

goto InitEEPROM

incf EE_ADDR,f

вызовите EEPROM_Read

movlw 0x5A

subwf EE_DATA,w

btfsc STATUS,Z

возврат

InitEEPROM

clrf EE_ADDR

clrf CTR1

clrf CTR2

InitEEPROM_loop

movf CTR2,w

lcall LOOKUP_StdTmr

movwf EE_DATA

movlw высокий InitEEPROM_loop

movwf PCLATH

вызовите EEPROM_Write

incf EE_ADDR,f

incf CTR2,f

movf CTR2,w

sublw 0x09

btfss STATUS,Z

goto InitEEPROM_loop

clrf CTR2

incf CTR1,f

movf CTR1,w

sublw 0x10

btfss STATUS,Z

goto InitEEPROM_loop

movlw 0xFE

movwf EE_ADDR

movlw 0xA5

movwf EE_DATA

вызовите EEPROM_Write

incf EE_ADDR,f

movlw 0x5A

movwf EE_DATA

вызовите EEPROM_Write

возврат

EEPROM_Read

banksel EE_ADDR

movf EE_ADDR,w

banksel EEADR

movwf EEADR

banksel EECON1

bcf EECON1, EEPGD

bsf EECON1, RD

banksel EEDATA

movf EEDATA,w

banksel EE_DATA

movwf EE_DATA

возврат EEPROM_Write

banksel EE_ADDR

movf EE_ADDR,w

banksel EEADR

movwf EEADR

banksel EE_DATA

movf EE_DATA,w

banksel EEDATA

movwf EEDATA

banksel EECON1

bcf EECON1, EEPGD

bsf EECON1, WREN

bcf INTCON, GIE

movlw 0x55

movwf EECON2

movlw 0xAA

movwf EECON2

bsf EECON1, WR

bsf INTCON, GIE

EEPROM_Write_WaitForConfirmation

btfsc EECON1, WR

goto EEPROM_Write_WaitForConfirmation

bcf EECON1, WREN

banksel EE_ADDR

возврат

IfTick

movf INT_TIMER,w

btfss FLAGS,F_CLOCK_STOPPED

goto IfTick_Continue

movwf LOOP_TIMER

возврат

IfTick_Continue

subwf LOOP_TIMER,w

btfsc STATUS,Z

возврат

Тикание; вызванные 4 раза за вторые

incf LOOP_TIMER,f

movlw 0x01

xorwf PORTA,f

clrf CTR1

Tick_next_ctr

вызовите LoadSelTmrSettingsAndLen

btfss SEL_TMR_SETTINGS,TMR_ON

goto Tick_continue

btfss SEL_TMR_SETTINGS,TMR_DIR

goto Tick_increase

; Tick_decrease

вызовите DecTimer

goto Tick_checkAlarm

Tick_increase

вызовите IncTimer

Tick_checkAlarm

вызовите CheckTimerAlarm

Tick_continue

incf CTR1,f

movlw 0x10

subwf CTR1,w

btfss STATUS,Z

goto Tick_next_ctr

bsf FLAGS,F_TICK

возврат LoadSelTmrSettingsAndLen ; грузы выбрали установки таймера и длину к SEL_TMR_SETTINGS и SEL_TMR_LEN

; установки груза

movf CTR1,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

movf INDF,w

movwf SEL_TMR_SETTINGS

; длина груза

вызовите CalculateFileAddressFromCTR1

movf REG,w

andlw 0x7F

movwf FSR

movf INDF,w

movwf SEL_TMR_LEN

incf FSR,f

movf INDF,w

movwf SEL_TMR_LEN+1

incf FSR,f

movf INDF,w

movwf SEL_TMR_LEN+2

incf FSR,f

movf INDF,w

movwf SEL_TMR_LEN+3

bcf STATUS,IRP

возврат

IncTimer; приращение таймер; убедитесь, что LoadSelTmrLen вызван перед movf REG,w

movwf FSR

incf INDF,f

btfss STATUS,Z

goto IncTimer_check

incf FSR,f

incf INDF,f

btfss STATUS,Z

goto IncTimer_check

incf FSR,f

incf INDF,f

btfss STATUS,Z

goto IncTimer_check

incf FSR,f

incf INDF,f

IncTimer_check

movf REG,w

movwf FSR

movf INDF,w

subwf SEL_TMR_LEN,w

btfss STATUS,Z

возврат

incf FSR,f

movf INDF,w

subwf SEL_TMR_LEN+1,w

btfss STATUS,Z

возврат

incf FSR,f

movf INDF,w

subwf SEL_TMR_LEN+2,w

btfss STATUS,Z

возврат

incf FSR,f

movf INDF,w

subwf SEL_TMR_LEN+3,w

btfss STATUS,Z

возврат

clrf INDF

decf FSR,f

clrf INDF

decf FSR,f

clrf INDF

decf FSR,f

clrf INDF

возврат

DecTimer ; уменьшение таймер; убедитесь, что LoadSelTmrLen вызван перед

movf REG,w

movwf FSR

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

incf FSR,f

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

incf FSR,f

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

incf FSR,f

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

movf SEL_TMR_LEN+3,w

movwf INDF

decf FSR,f

movf SEL_TMR_LEN+2,w

movwf INDF

decf FSR,f

movf SEL_TMR_LEN+1,w

movwf INDF

decf FSR,f

movf SEL_TMR_LEN,w

movwf INDF

DecTimer_continue

movf REG,w

movwf FSR

decf INDF,f

movlw 0xFF

subwf INDF,w

btfss STATUS,Z

возврат

incf FSR,f

decf INDF,f

movlw 0xFF

subwf INDF,w

btfss STATUS,Z

возврат

incf FSR,f

decf INDF,f

movlw 0xFF

subwf INDF,w

btfss STATUS,Z

возврат

incf FSR,f

decf INDF,f

возврат

CheckTimerAlarm

movlw 0x04

movwf TMP

movf REG,w

movwf FSR

CheckTimerAlarm_0

bsf STATUS,IRP

movf INDF,w

bcf STATUS,IRP

subwf INDF,w

btfss STATUS,Z

возврат ; не нет смятения

incf FSR,f

decf TMP,f

btfss STATUS,Z

goto CheckTimerAlarm_0

movf SEL_TMR_SETTINGS,w

andlw 0x03

СМЯТЕНИЕ movwf

clrf ALARM_TIMER

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_STOP

goto CheckTimerAlarm_1

; Таймер остановки на смятении

;movlw 0x01<<TMR_ON

;lcall ToggleTimerSettings

movf CTR1,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

movlw 0x01<<TMR_ON

xorwf INDF,f

bcf STATUS,IRP

CheckTimerAlarm_1

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_RESET

возврат

; Снова установленный таймер на смятении

;movf SEL_TMR,w

;movwf CTR1

вызовите CalculateFileAddressFromCTR1

movf REG,w

movwf FSR

movlw 0x01

movwf INDF

incf FSR,f

clrf INDF

incf FSR,f

clrf INDF

incf FSR,f

clrf INDF

возврат

IfPlaySound

movlw SND_PIP

subwf ALARM,w

btfsc STATUS,Z

goto PlayPip

movlw SND_PEEP

subwf ALARM,w

btfsc STATUS,Z

goto PlayPeep

movlw SND_WHIP

subwf ALARM,w

btfsc STATUS,Z

goto PlayWhip

PlayContinue

СМЯТЕНИЕ clrf

возврат

PlayPip

lcall SPK_Pip

goto PlayContinue

PlayPeep

lcall SPK_Peep

goto PlayContinue

PlayWhip

lcall SPK_Whip

goto PlayContinue

ToggleTimerSettings ; коленчатый байт установок таймера

movwf TMP

movf SEL_TMR,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

movf TMP,w

xorwf INDF,f

bcf STATUS,IRP

возврат CopyDispToVal; копируйте в настоящий момент показанное значение таймера в VAL