62929 (588861), страница 8
Текст из файла (страница 8)
; ВЕРСИЯ 1.3
; V.1.1
; - Исправил сигнальную проблему установки
; V.1.2
; - Исправленный дефект с смятением иногда снова установка или остановка неправильного таймера
; - Приспособление за 1/4 второго утратят, когда таймер был reset смятением
; V.1.3
; - Некоторые таймеры блокировали, когда установка смятения были скорректированы
#include
__config _HS_OSC & _WDT_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON ;& _CP_OFF
#include "LCD.h"
#include "KBD.h"
; Определения байта состояния
#define TMR_ON 7 ; 0 = от, 1 = на
#define TMR_DIR 6 ; 0 = inc, 1 = dec
#define TMR_ON_ALARM_RESET 4 ; 1 = на смятении, снова установленном таймере
#define TMR_ON_ALARM_STOP 3 ; 1 = на смятении, таймере остановки
; куски 0-1: сигнальный звук
; Корректировки Нормы
#define TMR_STD_LO 0xC5
#define TMR_STD_HI 0x66
#define TMR_XTR_LO 0x18
#define TMR_XTR_HI 0x80
#define PULSES_PER_TICK 0x20
#define F_TICK 0 ; флаг тикания
#define F_BTNDOWN 1 ; 1, если кнопка была вниз от предыдущей петли, 0 иначе
#define F_TMR_LABEL_DIRTY 2 ; набор, если этикетке таймера придется обновляться на показе
#define F_VAL_DISPLAY_DIRTY 3 ; набор, если этикетке значения придется обновляться на показе
#define F_CLOCK_STOPPED 4 ; набор, если главный отмечает время остановлен
#define F_CURSOR_DIRTY 5 ; набор, если местоположению курсора нужно обновляться или reset
#define F_VALUE_ENTERED 6 ; набор, если новое значение только введено
#define MSG_ID_Clear 0xFF
ТОЧНОСТЬ #define 7
#define KBD_SCAN_DELAY 3
#define D_SEL_TIMER 0x01 ; Место назначения - отобранный таймер
#define D_SEL_TIMER_LENGTH 0x02 ; Место назначения - отобранная длина таймера
#define D_SEL_TIMER_ALARM 0x03 ; Место назначения - отобранное сигнальное время таймера
#define D_SEL_TIMER_COPY 0x04 ; Место назначения - отобранный таймер; потребительная стоимость как таймер ID к значению таймера lookup
#define B_LED 0 ; RA0
#define B_SPK 1 ; RA1
#define SND_SILENT 0x00 ; не нет звука
#define SND_PIP 0x01 ; звук: "косточка"
#define SND_PEEP 0x02 ; звук: "чирикание"
#define SND_WHIP 0x03 ; звук: "кнут"
; макрокоманда math
Макрокоманда M_StorStatus, ГДЕ
movf STATUS,w
movwf , ГДЕ
endm
Макрокоманда M_RetrStatus, ГДЕ
movf WHERE,w
СТАТУС movwf
endm
; макрокоманда государственного аппарата
Макрокоманда IfJump BTN,ADDR
movlw BTN
subwf BTN_ID,w
btfsc STATUS,Z
goto ADDR
ENDM
; макрокоманда государственного аппарата
Макрокоманда AnyBtnJump ADDR
btfss BTN_ID,7
goto ADDR
ENDM
Макрокоманда IfState BTN,STATE
movlw BTN
subwf BTN_ID,w
btfss STATUS,Z
goto $+5
высокий ШТАТ movlw
movwf STATE_HI
низкий ШТАТ movlw
movwf STATE_LO
ENDM ; goto здесь
ШТАТ макрокоманды AnyBtnState
btfsc BTN_ID,7
goto $+5
высокий ШТАТ movlw
movwf STATE_HI
низкий ШТАТ movlw
movwf STATE_LO
ENDM ; goto здесь
ШТАТ макрокоманды GoToState
высокий ШТАТ movlw
movwf STATE_HI
низкий ШТАТ movlw
movwf STATE_LO
ENDM
Макрокоманда SetMsg NEW_MSG_ID
movlw NEW_MSG_ID
movwf MSG_ID
ENDM
cblock 0x20
; главные записи таймеров
LOOP_TIMER
ФЛАГИ
EE_ADDR
EE_DATA
CTR1
CTR2
TMP
TMP1
TMP2
TMP3
РЕДЖ
; отобранный таймер
SEL_TMR
SEL_TMR_SETTINGS
SEL_TMR_LEN:4
; сигнальные переменные
СМЯТЕНИЕ; 0, если смятение есть, сигнальный ID иначе
ALARM_TIMER; пересчитывает untill тиканий сигнальные переключатели от
; данные кнопочного пресса
BTN_ID
BTN_DOWN
; записи государственного аппарата
STATE_LO
STATE_HI
; записи показа
LCD_CURSOR_POSITION ; местоположение (куски 0-6) курсора и статус (кусок 7: 1=on; 0=off)
DISP:6
MSGL
MSGH
MSGDAT
MSG_ID; ID сообщения, которое должно показываться на втором ряду
MSG_ID_CURRENT; ID сообщения, в настоящий момент показанного на втором ряду
; записи math
REG_X:PRECISION
REG_Y:PRECISION
REG_Z:PRECISION
REG_COUNTER
REG_STATUS
REG_T1
REG_T2
REG_ROT_COUNTER
; записи ввода значения
VAL_STAT; статус - место назначения значения, которое введено (позже может использоваться, чтобы запомнить также формат в верхнем откусывании)
VAL_IND; индекс - индекс в настоящий момент введенного существования цифры
VAL_DIGIT; место, чтобы запомнить единую цифру, пока другие действия выполняются
VAL:6; значение непосредственно (может находиться в десятичном представлении или непосредственно в шестнадцатиричном)
endc
; прерывание отмечается в разделенном пространстве
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