$regfile = "m8def.dat"
$crystal = 14745600
$hwstack = 16
$swstack = 64
$framesize = 32
$baud = 19200
'Config Timer0 = Timer , Prescale = 1024 , Compare A = Set , Clear Timer = 1
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 0
'Config Serialin = Buffered , Size = 32
Declare Sub Nokia_init()
Declare Sub Nokia_clear()
Declare Sub Nokia_text(byval Nokia_x As Byte , Byval Nokia_y As Byte , Byval Nokia_text As String , Byval Nokia_inversion As Byte)
Nokia_spi_data Alias Portb.1 'MOSI - можно задать любую ножку
Nokia_spi_clock Alias Portb.2 'SCK - можно задать любую ножку
Nokia_cs Alias Portb.0 'CS - можно задать любую ножку
Display_reset Alias Portd.7 'LCD_RESET - можно задать любую ножку
Display_reset = 1
Nokia_cs = 1
Dim W As Iram Word At 8 Overlay
Dim Nokia_data_9 As Integer
Dim X As Byte
'порты экрана
Config Portd.7 = Output
Config Portb.0 = Output
Config Portb.2 = Output
Config Portb.1 = Output
Config Portc.3 = Output 'подсветка и питание набирателя
Config Portc.4 = Input 'начало набора номера
Config Portd.2 = Output ' питание микрофона и звуки
Config Portd.4 = Output ' Таймер Звука Занято И Т.п.
'порт положения трубки
Config Portd.3 = Input
'порты звонка
Config Portd.5 = Output
Config Portd.6 = Output
'алиасы
Faza1 Alias Portd.5
Faza2 Alias Portd.6
Faza2 = 0
Trubka Alias Pind.3
Naborcifri Alias Pinc.2
Pitanienabiratela Alias Portc.3
Prerivanienabiratela Alias Pinc.4
Microfon Alias Portd.2
Dinamik Alias Portd.4
Dinamik = 0
Dim Pause1 As Integer
Dim Kodgoroda As String * 10
Dim Gorodcifri As Byte
'========================================================================================================================
Kodgoroda = "883145" 'тут внесите код города
Gorodcifri = Len(kodgoroda) - 1 ' можно просто приравнять к числу цифр городского местного номера если он меньше 7ми
Pause1 = 16000 'подстройка паузы, если набираете 5значный номер, то до продолжения набора другой цифры по истечении этой паузы телефон начинает набор.
'========================================================================================================================
Dim Eror As Byte
Dim P As Byte
Dim O As Byte
Dim N As Byte 'переменные для набирателя
Dim N1 As Byte 'переменные для набирателя
Dim Buff As Byte
Dim B As Byte
Dim Cifra(11) As Byte
'Dim Trubka As Byte
Dim Nabor As Byte 'состояние положена/снята трубка
Dim T As Byte
Dim T1 As Byte
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As Byte
Dim Tbuf As Integer 'антизависание в чтение буфера
Dim Zvonok As Byte
' Если Zvonok:
'0-трубка положена
'1-трубка снята без поступления звонка
'2-поступление звонка при положенной трубки
'3-трубка снята в ответ на звонок
'4-трубка положена после ответа на звонок
'5-режим набора номера
'
'
'
Dim Modem As String * 255
Dim S As String * 255
Dim Text1 As String * 16
Call Nokia_init()
Call Nokia_text(1 , 1 , ">Модем АУ" , 1)
Text1 = "AT"
Gosub Inicilizacija
Call Nokia_text(10 , 1 , "-Я тут" , 1)
Call Nokia_text(1 , 2 , "Как состояние-" , 1)
Do
Gosub Sim300
If Left(modem , 1) = "+" Then Exit Do
Loop
Call Nokia_text(15 , 2 , "ОК" , 1)
Call Nokia_clear
Waitms 1
Call Nokia_text(1 , 1 , "-==[GSM СССР]==-" , 1)
'Disable Urxc
Waitms 270
Print "AT"
Text1 = "AT+CHFA=1"
Call Nokia_text(1 , 2 , ">AT+CHFA=1" , 1) '0-телефон, 1-гарнитура (выходы у модема)
Gosub Inicilizacija
Call Nokia_text(1 , 3 , ">OK" , 1)
Text1 = "AT+CLVL=100"
Call Nokia_text(1 , 4 , ">AT+CLVL=100" , 1)
Gosub Inicilizacija
Call Nokia_text(1 , 5 , ">ОК" , 1)
Wait 1
Call Nokia_clear
Goto Programma:
'======================== ПОДПРОГРАММА =====================
'блок, которому в переменную Text1 указать команду можема, он будет ждать ответ ОК и повторять через каждые 25000 циклов комманду в переменной Text1 - пока не дождётся ОК
Inicilizacija:
Modem = ""
Do
Call Nokia_text(1 , 7 , Text1 , 0)
T4 = T4 + 1
Gosub Sim300
If T4 > 250 Then
' Text1 = Left(s , 16)
'Text1 = Str(t4)
'Call Nokia_text(1 , 5 , Text1 , 0)
Print Text1
T4 = 0
End If
If Modem <> "" Then
If Modem = "OK" Then
Eror = 0
Exit Do
End If
If Left(modem , 3) = "ERR" Then
Eror = 1
Exit Do
End If
'Waitms 1
End If
Loop
Return
'Error:
'If Mid(modem , 6 , 12) = ":SIMERR" Then
' If N > 0 Then
' For P = 1 To 25
' Sound Dinamik , 50 , 140
' Next P
' Eror = 1
' End If
'End If
Return
'============================= конец блока мозгоёбной части.
'==================== Звонок ==============================
Zumer:
Waitms 1 'общая задержка для 4х сек.
T2 = T2 + 1
If T2 <= 30 Then
Faza1 = 1
Faza2 = 0
Pitanienabiratela = 0
Waitms 35 'пауза фазы +
Faza1 = 0
Faza2 = 1
Pitanienabiratela = 1
Waitms 35 'пауза фазы -
Faza2 = 0
End If
If T2 = 4000 Then T2 = 0 'пауза между звонком (в литре сказано должно 4 сек. но опрос буфера выгребает секунду-две
Return
'====================== ВЫВОД ГРАФИЧЕСКОЙ ИНФОРМАЦИИ =====================
Informacia:
'Call Nokia_clear()
Call Nokia_text(1 , 1 , "-==[GSM СССР]==-" , 1)
Call Nokia_text(1 , 2 , "Данные с модема:" , 0)
'Call Nokia_text(1 , 3 , " " , 0)
'Text1 = "Zvonok:" + Str(zvonok)
'Call Nokia_text(1 , 4 , Text1 , 1)
Call Nokia_text(1 , 8 , "=RADIOKSTOVO.RU=" , 1)
'тех.информация для отладки набора номера /переменные N/N1/порт Ц2/порт Ц4
If Zvonok = 0 Then Call Nokia_text(1 , 4 , "0Ожидание " , 0)
If Zvonok = 1 Then Call Nokia_text(1 , 4 , "1Ожидан.действия" , 0)
If Zvonok = 2 Then Call Nokia_text(1 , 4 , "2Вам звонят! " , 0)
If Zvonok = 3 Then Call Nokia_text(1 , 4 , "3Разговор " , 0)
If Zvonok = 4 Then Call Nokia_text(1 , 4 , "4Трубка положена" , 0)
If Zvonok = 5 Then Call Nokia_text(1 , 4 , "5Набор номера " , 0)
Text1 = Left(modem , 16)
Call Nokia_text(1 , 3 , Text1 , 0)
Text1 = "T3:" + Str(t3)
Call Nokia_text(1 , 6 , Text1 , 0)
'===вывод номера
'Call Nokia_text(1 , 4 , "Набранный номер" , 0)
Text1 = ""
Gosub Sbornomera
Text1 = ">" + Text1
Call Nokia_text(1 , 5 , Text1 , 0)
Return
'================================ РАБОТА С БУФЕРОМ И ОПРОСОМ МОДЕМА ========================================
Sim300:
'B = Inkey()
'If B > 0 Then
Tbuf = 0
If Ischarwaiting() = 1 Then
Do
B = Inkey()
Tbuf = Tbuf + 1
Select Case B
Case 10 : If S <> "" Then
Modem = S
S = ""
Do
B = Inkey()
Loop Until B = 0
Exit Do
End If
Case Else
If B > 32 Then
Tbuf = 0
S = S + Chr(b) :
End If
End Select
If Tbuf > 25000 Then
If Len(s) > 30 Then
S = ""
Do
B = Inkey()
Loop Until B = 0
Exit Do
End If
Exit Do
End If
Loop
End If
Return
'
'End If
Return
'================ Подпрограмма режима ожидания===============================================================
Ozhidanie:
'Text1 = Left(modem , 4)
If Modem = "RING" Or Text1 = "+CLI" Then 'поступление звонка
Print "AT+CHFA=1"
If Zvonok = 5 Then Gosub Antitrubka
If Trubka = 0 Or Zvonok = 4 Then Zvonok = 2
End If
If Zvonok = 1 And N = 1 Then Zvonok = 5
If Zvonok = 3 Then
If T < 125 Then
Pitanienabiratela = 0
Else
Gosub Pitanie
End If
End If
If Zvonok = 4 Then Zvonok = 0
If Zvonok = 1 Or Zvonok = 5 Then '================= ОЗВУЧКА ГУДОК и Т.П.
If N = 1 Or N = 0 Then Sound Dinamik , 1 , 220
If N = 2 And Cifra(1) = 8 Then Sound Dinamik , 1 , 200
End If
Gosub Sim300
If Zvonok = 5 Then ' ========== начало 5го правила "Режим набора номера"
Gosub Nabornomera
If N = 11 Then
Text1 = "ATD" 'Если городской 7 значный, то не добавляем
Gosub Sbornomera
Text1 = Text1 + ";"
Print Text1
Zvonok = 3
End If
If Cifra(1) <> 8 And Cifra(1) <> 0 Then
If N < 3 And N = 6 Then T3 = 0
If N > 7 Then T3 = 0
If N = Gorodcifri Or N = 7 Then T3 = T3 + 1
If N = 3 Then T3 = T3 + 1
If T3 = Pause1 Then
Text1 = "ATD" 'задержка набора 5ти значного номера
If N = Gorodcifri Then Text1 = Text1 + Kodgoroda 'Если городской пятизначный, добавляем префикс
Gosub Sbornomera
Text1 = Text1 + ";"
print Text1
Zvonok = 3 'переходим В Режим "трубка снята"
End If
End If
End If
Return
'=================== Подрограмма набора номера (заранее лучше обнулить N - номер ячейки массива N1 - кол-во тактов набирателя Nabor - шаг набора цифры/номера, запоминает 11 цифр в Cifra(n)
'==== Подпрограмма сбора номера из массива, желательно переменную Text1 обнулить=======================================================
Sbornomera:
For P = 1 To N
Text1 = Text1 + Str(cifra(p))
B = Cifra(p) * 10
B = B + 150
Next P
Return
Sbros:
For P = 1 To 11
Cifra(p) = 0
Next P
N = 0
N1 = 0
Eror = 0
T3 = 0
Call Nokia_clear
Return '========================================================================
Antitrubka: 'положить вызов
Text1 = "ATH"
Gosub Inicilizacija
Return
Nabornomera:
Pitanienabiratela = 1 'включение питания номеронабирателя
If Nabor = 0 And Naborcifri = 1 Then
If Prerivanienabiratela = 0 Then
N1 = N1 + 1
Sound Dinamik , 150 , 40 'украшение
Nabor = 1
Waitms 20
End If
End If
If Prerivanienabiratela = 1 And Nabor = 1 Then
Nabor = 2
Waitms 20
End If
If Nabor = 2 And Naborcifri = 1 Then Nabor = 0
If N1 <> 0 And Naborcifri = 0 Then
If Prerivanienabiratela = 1 Then
If N1 = 10 Then N1 = 0
N = N + 1
Cifra(n) = N1
If N = 12 Then
N = 1
For P = 1 To 11
Cifra(p) = 0
Next P
End If
Gosub Informacia
Nabor = 0
N1 = 0
End If
End If
Return
Pitanie:
If Trubka = 1 Then
Microfon = 1
Pitanienabiratela = 1
Else
Microfon = 0
Pitanienabiratela = 0
End If
Return
'================ Подпрограмма режима разговора===========================================================
Razgovor:
Return
'========================================================================================
'========================================================================================
'========================================================================================
'========================================================================================
Programma:
Do
If Trubka = 1 Then
If Zvonok = 0 Then
Gosub Pitanie
Zvonok = 1
End If
If Zvonok = 2 Then
Gosub Pitanie
Zvonok = 3
Text1 = "ATA"
Gosub Inicilizacija
If T2 <= 30 Then 'Украшение
For P = 1 To 20
Sound Dinamik , 50 , 25
Waitms 40
Next P
End If
End If
End If
If Trubka = 0 Then
If Zvonok = 3 Or Zvonok = 5 Or Zvonok = 1 Then
Gosub Pitanie
Gosub Antitrubka
Gosub Sbros
Zvonok = 0
End If
End If
If Zvonok = 2 Or Zvonok = 4 Then Gosub Zumer
'Getline Modem
If Zvonok = 1 Or Zvonok = 5 Then Gosub Nabornomera
'If Zvonok = 3 Then Gosub Ozhidanie 'на всякий случай.
If Zvonok = 0 Then Gosub Sim300
If Naborcifri = 0 Then
Gosub Ozhidanie
T = T + 1
If T = 255 Then 'испоняем то, что нужно исполнять редко с периодичностью
T = 0
If Ischarwaiting() = 0 Then 'если буфер пуст, то вывести на экран (иначе задержка будет начительная)
Gosub Informacia
Else
Gosub Sim300
End If
End If
End If
'СТРОГОЕ ПРАВИЛО ТРУБКИ==================
'Waitms 1
Loop
$include "Nokia-1100 Library.inc"
End