$regfile = "m8def.dat"
$crystal = 8000000 'внутренний генератор
Config Portc = Output : Config Portb = Output : Config Portd = Output
Config Portd.2 = Input : Set Portd.2
A Alias Portd.7 : B Alias Portd.5 : C Alias Portd.1 : D Alias Portd.3 : E Alias Portd.4 : F Alias Portd.6 : G Alias Portd.0 ' : H Alias Portd.2
Dig1 Alias Portb.0 : Dig2 Alias Portb.1 : Dig3 Alias Portb.2 : Dig4 Alias Portb.3
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(4) As Integer , T_p As Word
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse
Enable Timer0 : Start Timer0
Config Timer1 = Timer , Prescale = 256 '8000000/256=31250 Hz
Config Int0 = Falling 'Прерывание по спаду
Stop Timer1 'останавливаем таймер
Enable Timer1 'разрешаем работу таймера0
Enable Int0 'разрешаем работу прерывания0
Enable Interrupts 'Разрешаем прерывания
On Timer1 Tikers 'работа по таймеру
On Int0 Infrared 'работа по прерыванию
Dim Tik As Word 'счётчик тиков таймера
Dim Byt As Byte 'счётчик принятых бит
Dim Repeat_flag As Bit 'флаг повтора
Dim Start_flag As Bit 'флаг стартового условия
Dim Address As Byte 'байт адреса
Dim Command As Byte 'байт команды
Dim Address_1 As Byte 'прямой байт адреса
Dim Command_1 As Byte 'прямой байт команды
Dim Address_0 As Byte 'инверсный байт адреса
Dim Command_0 As Byte 'инверсный байт команды
Dim Summa As Word
Do
Loop
End
Tikers: 'работа по таймеру
Timer1 = 65534 '31250/(256-253)=10416,66 Hz (96 мкс)
'254 - TV SAMSUNG, 253 - DVD SAMSUNG и другие NEC
Incr Tik
If Tik >= 1200 Then 'если насчитали 1200 тиков, сбросили всё в исходное состояние
Tik = 0
Repeat_flag = 0
Start_flag = 0
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
Command = 0
Address = 0
Stop Timer1 'останавливаем таймер
End If
Return
'*******************************************************************************
Infrared:
Start Timer1 'запускаем таймер
If Tik >= 139 And Tik < 150 Then 'если случилось от 139 до 150 тиков - "СТАРТ"
Address = 1
Repeat_flag = 0
Start_flag = 1
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
End If
If Tik >= 116 And Tik < 139 Then 'если случилось от 116 до 138 тиков - "ПОВТОР"
Address = 2
Repeat_flag = 1
Start_flag = 0
End If
If Tik >= 22 And Tik < 116 And Start_flag = 1 Then 'если случилось от 22 до 115 тиков - приняли "1"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
Address_1 = Address_1 + 1
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
Address_0 = Address_0 + 1
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
Command_1 = Command_1 + 1
End If
If Byt >= 25 Then
Shift Command_0 , Left
Command_0 = Command_0 + 1
End If
End If
If Tik >= 10 And Tik < 22 And Start_flag = 1 Then 'если случилось от 10 до 21 тика - приняли "0"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
End If
If Byt >= 25 Then
Shift Command_0 , Left
End If
End If
Tik = 0
If Byt = 32 Then 'если приняли 4 байта, проверяем правильность приёма команды
Address = Address_1
Command = Command_1
Byt = 0
Repeat_flag = 0
Start_flag = 0
Stop Timer1 'останавливаем таймер
End If
Pulse:
Stop Timer0
T_p = Command
For I = 4 To 1 Step -1 ' разбиваем переменную
Chislo(i) = T_p Mod 10
T_p = T_p / 10
Next I
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 ' гасим индикатор
Incr W : If W > 4 Then W = 1 ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z ' зажигаем сегменты
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Select Case W ' включаем нужную цифру (w). Подаем минус на общий провод конкретной цифры
Case 1 : ' а так же точку, где и когда надо
Reset Dig1
' H = 1
Case 2 :
Reset Dig2
' H = 1
Case 3 :
Reset Dig3
' H = 1
Case 4 :
Reset Dig4
' H = 1
End Select
Start Timer0
Return
Look:
Z = Chislo(w) * 7 : Z = Y + Z
Z = Lookup(z , Цифры)
Incr Y
Return
Цифры:
' для индикатора с общим минусом
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1 '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1 '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1 '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1 '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1 '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0 '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1 '9
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '10 "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '11 "" пусто
Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '12 E
Data 0 , 0 , 0 , 0 , 1 , 0 , 1 '13 r