@ device PIC16F876, HS_OSC, WDT_OFF, PWRT_ON,PROTECT_OFF
Data @0,
Word 030
'
Data @2,
Word 000
' Заносим в EEPROM при программировании
Data @4, 00
' нужные нам показания
Data @5,
Word 960
' одометров
Data @7, 60 '
Data @8, 0
ADCON1 = %00000110
TrisA = %00101000
PortA = %00100000
TrisB = %00000001
PortB = %00000000
TrisC = %00000001
PortC = %00000010
Cifra var Byte ' Для вывода нужной цифры на индикациюацию
Time var Word ' Для отсчета времени для спидометра
ImpSpedo var Byte ' Для хранения кол-ва импульсов спидометра
ImpOdo var Byte ' Для хранения кол-ва импульсов одометра
Sped var Byte ' Для хранения скорости движения
Odo123Km var Word ' Для хранения километров одометра (тысячи)
Odo456Km var Word ' Для хранения километров одометра (сотни)
OdoMetr var Byte ' Для хранения десятков метров без сброса
OdoTripKm var Word ' Для хранения количества километров суточного пробега
OdoTripM var Byte ' Для хранения десятков метров суточного пробега
OdoPR var Byte ' Для переключения и сброса одометра
SelOdo var Bit ' Для выбора одометра
Tme Con 294 ' Время для
Time = Tme ' отсчета скорости
ImpSpedo = 0
ImpOdo = 60 ' Считаем по 10 метров пути (60 импульсов на 10 метров)
OdoTripKm = 0
OdoTripM = 0
OdoPR = 200 ' Пауза для кнопки
'SelOdo = 0
Read 0, Odo123Km.byte0
Read 1, Odo123Km.byte1
Read 2, Odo456Km.byte0
Read 3, Odo456Km.byte1
Read 4, OdoMetr
Read 5, OdoTripKm.Byte0
Read 6, OdoTripKm.Byte1
Read 7, OdoTripM
Read 8, SelOdo
Option_REG = %11000011
Intcon = %10110000
TMR0 = 5
Pause 1000 ' Для стабилизации МК
On Interrupt Goto myint ' Если произошло прерывание, переходим к обработке этого прерывания
Main:
if PortA.5 = 0 then Save ' Если зажигание выключено то - переходим к сохранению данных
if PortA.3 = 0 then ' Если кнопка одометра нажата
OdoPR = OdoPR - 1 ' Уменьшаем время паузы кнопки
endif
if OdoPR < 180 then ' Если кнопку держали
if PortA.3 = 1 then ' короткое время
OdoPr = 200 ' Сбрасываем время паузы кнопки
SelOdo = SelOdo + 1 ' Заносим 1цу в переменную выбора одометра
endif
endif
if OdoPR < 100 then ' Если кнопку
if PortA.3 = 0 then ' держим долгое время
OdoPR = 200 ' Сбрасываем время паузы кнопки
OdoTripM = 0 ' Сбрасываем
OdoTripKm = 0 ' суточный одометр
endif
endif
' ----------------------------- [ Spedometr ] -----------------------------
Cifra = Sped Dig 0 ' Spedometr Cifra 1
GoSub Look
PortA = %00000001
Pause 4
PortA = $10
if Sped < 10 then Odo
Cifra = Sped Dig 1 ' Spedometr Cifra 2
GoSub Look
PortA = %00000010
Pause 4
PortA = $10
if Sped < 100 then Odo
Cifra = Sped Dig 2 ' Spedometr Cifra 3
GoSub Look
PortA = %00000100
Pause 4
PortA = $10
' --------------------------- [ End Spedometr ] ---------------------------
' -------------------------- [ Vibiraem odometr ] -------------------------
Odo:
if SelOdo = 1 then
GoTo SytOdo
endif
' ------------------------ [ End Vibiraem odometr ] -----------------------
' ------------------------------ [ Одометр Общий ] ------------------------
Cifra = Odo123Km Dig 2 ' Odometr Cifra 1
GoSub Look
PortC = %10000010
Pause 4
PortC = $02
Cifra = Odo123Km Dig 1 ' Odometr Cifra 2
GoSub Look
PortC = %01000010
Pause 4
PortC = $02
Cifra = Odo123Km Dig 0 ' Odometr Cifra 3
GoSub Look
PortC = %00100010
Pause 4
PortC = $02
Cifra = Odo456Km Dig 2 ' Odometr Cifra 4
GoSub Look
PortC = %00010010
Pause 4
PortC = $02
Cifra = Odo456Km Dig 1 ' Odometr Cifra 5
GoSub Look
PortC = %00000110
Pause 4
PortC = $02
Cifra = Odo456Km Dig 0 ' Odometr Cifra 6
GoSub Look
PortC = %00001010
Pause 4
PortC = $02
Goto Main
' ---------------------------- [ End Одометр Общий ] ----------------------------
' ------------------------------ [ Одометр Суточный ] ---------------------------
SytOdo:
Cifra = OdoTripKm Dig 2 ' Odometr Cifra 2
GoSub Look
PortC = %01000010
Pause 4
PortC = $02
Cifra = OdoTripKm Dig 1 ' Odometr Cifra 3
GoSub Look
PortC = %00100010
Pause 4
PortC = $02
Cifra = OdoTripKm Dig 0 ' Odometr Cifra 4
GoSub Look
PortC = %00010010
PortA.4 = 0
Pause 4
Pauseus 350
PortC = $02
PortA.4 = 1
Cifra = OdoTripM Dig 1 ' Odometr Cifra 5
GoSub Look
PortC = %00000110
Pause 4
PortC = $02
Cifra = OdoTripM Dig 0 ' Odometr Cifra 6
GoSub Look
PortC = %00001010
Pause 4
PortC = $02
GoTo Main
' ---------------------------- [ End Одометр Суточный ] -------------------
' ------------------------- [ Obrobotka Impulsov ] ------------------------
Disable
myint:
if intcon.1=1 then ' Если прерывание произошло по входу INT считаем счетчики
ImpSpedo = ImpSpedo + 1 ' Счетчик скорости
ImpOdo = ImpOdo - 1 ' Счетчик одометра (основной)
INTCON.1 = 0
endif
if ImpOdo = 0 then ' Если проехали 10 метров пути
ImpOdo = 60 ' Начали сначала осчет 10 метров пути
OdoMetr = OdoMetr + 1 ' Заносим в переменную количество пройденных метров (общий одометр)
OdoTripM = OdoTripM + 1 ' Заносим в переменную количество пройденных метров (суточный одометр)
endif
if OdoMetr = 100 then ' Если проехали 1000 метров
OdoMetr = 0 ' Обнуляем счетчик метров
Odo456Km = Odo456Km + 1 ' Заносим 1цу в счетчик сотен километров
endif
if Odo456Km = 1000 then ' Если счетчик сотен километров одометра заполнился
Odo456Km = 0 ' Обнуляем счетчик сотен километров
Odo123Km = Odo123Km + 1 ' Заносим 1цу в счетчик тысячь километров одометра
endif
if Odo123Km = 1000 then ' Если счетчик тысячь километров одометра заполнился
Odo123Km = 0 ' Обнуляем счетчик тысячь километров одометра
Odo456Km = 0 ' Обнуляем счетчик сотен километров одометра
endif
if OdoTripM = 100 then ' Если проехали 1000 метров (суточный)
OdoTripM = 0 ' Обнуляем счетчик метров (суточный)
OdoTripKm = OdoTripKm + 1 ' Заносим 1цу в счетчик сотен километров (суточный)
endif
if OdoTripKm = 1000 then ' Если счетчик сотен километров одометра заполнился (суточный)
OdoTripKm = 0 ' Обнуляем счетчик сотен километров одометра (суточный)
endif
if intcon.2=1 then ' Если прерывание по переполнению TMR0
Time = Time - 1 ' Уменьшаем счетчик времени
if Time = 0 then ' Если счетчик времени отсчитал нужный промежуток времени
Time = Tme ' Начинаем отсчет времени заново
Sped = ImpSpedo ' Заносим в переменную полученную скорость
ImpSpedo = 0 ' Обнуляем счетчик импульсов скорости
endif
TMR0 = 5
intcon.2=0
endif
Resume
Enable
' ----------------------- [ End Obrobotka Impulsov ] ----------------------
' ----------------------- [ End Zajigaem cifry ] ----------------------
Look:
LookUp Cifra, [$02, $BA, $24, $A0, $98, $C0, $40, $B2, $00, $80], PortB
Return
' ----------------------- [ End Zajigaem cifry ] ----------------------
' ----------------------------- [ Save Data ] -----------------------------
Disable
Save:
PortA = $00
PortC = $02
Pause 200
Write 0, Odo123Km.byte0
Write 1, Odo123Km.byte1
Write 2, Odo456Km.byte0
Write 3, Odo456Km.byte1
Write 4, OdoMetr
Write 5, OdoTripKm.Byte0
Write 6, OdoTripKm.Byte1
Write 7, OdoTripM
Write 8, SelOdo
Pause 50
PortC = $00
End
Enable
' ---------------------------- [ End Save Data ] ---------------------------
End