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