Для ознакомления:
GSM СССР - тема на родном городе форум.
GSM СССР - на форуме bascomavr.3bb.ru
Альбом - в Вконтакте.
Это звонок телефона:

Это тот самый телефон:

Автограф )

Всё используется и уже работает, переделываю прошивку.

Начало кода:
Код: Выделить всё
$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
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 Integer
Dim Tbuf As Integer 'антизависание в чтение буфера
Dim Zvonok As Byte
' Если Zvonok:
'0-трубка положена
'1-трубка снята без поступления звонка
'2-поступление звонка при положенной трубки
'3-трубка снята в ответ на звонок
'4-трубка положена после ответа на звонок
'5-режим набора номера
'
'
'
Dim Modem As String * 30
Dim S As String * 30
Dim Text1 As String * 16
Call Nokia_text(1 , 1 , "-==[GSM СССР]==-" , 1)
'Disable Urxc
Call Nokia_init()
Call Nokia_text(1 , 2 , ">AT" , 1)
Text1 = "AT"
Gosub Inicilizacija
Call Nokia_text(1 , 3 , ">ОК" , 1)
Print "AT"
Text1 = "AT+CHFA=1"
Call Nokia_text(1 , 4 , ">AT+CHFA=1" , 1) '0-телефон, 1-гарнитура (выходы у модема)
Gosub Inicilizacija
Call Nokia_text(1 , 5 , ">OK" , 1)
Text1 = "AT+CLVL=100"
Call Nokia_text(1 , 6 , ">AT+CLVL=100" , 1)
Gosub Inicilizacija
Call Nokia_text(1 , 7 , ">ОК" , 1)
Wait 1
Call Nokia_clear
Goto Programma:
'====== ПОДПРОГРАММА ===
'блок, которому в переменную Text1 указать команду можема, он будет ждать ответ ОК и повторять через каждые 25000 циклов комманду в переменной Text1 - пока не дождётся ОК
Inicilizacija:
Do
B = Inkey()
If B > 0 Then Gosub Sim300
If Modem = "OK" Then Exit Do
T1 = T1 + 1
If T1 = 25000 Then Print Text1
Loop
Return
'== Звонок ============
Zumer:
If Zvonok = 1 Then
Waitms 1 'общая задержка для 4х сек.
T1 = T1 + 1
If T1 <= 30 Then
Faza1 = 1
Faza2 = 0
Pitanienabiratela = 0
Waitms 35 'пауза фазы +
Faza1 = 0
Faza2 = 1
Pitanienabiratela = 1
Waitms 35 'пауза фазы -
Faza2 = 0
End If
If T1 = 4000 Then T1 = 0 'пауза между звонком (в литре сказано должно 4 сек. но опрос буфера выгребает секунду-две
End If
Return
'=================== Подрограмма набора номера (заранее лучше обнулить N - номер ячейки массива N1 - кол-во тактов набирателя Nabor - шаг набора цифры/номера, запоминает 11 цифр в Cifra(n)
Nabornomera:
Pitanienabiratela = 1 'включение питания номеронабирателя
If Nabor = 0 And Naborcifri = 1 Then
If Prerivanienabiratela = 0 Then
N1 = N1 + 1
Nabor = 1
Waitms 50
End If
End If
If Prerivanienabiratela = 1 And Nabor = 1 Then
Nabor = 2
Waitms 50
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
'==== ВЫВОД ГРАФИЧЕСКОЙ ИНФОРМАЦИИ ===
Informacia:
'Call Nokia_clear()
Call Nokia_text(1 , 1 , "-==[GSM СССР]==-" , 1)
Call Nokia_text(1 , 2 , "Данные с модема:" , 0)
Call Nokia_text(1 , 3 , " " , 0)
Call Nokia_text(1 , 8 , "=RADIOKSTOVO.RU=" , 1)
'тех.информация для отладки набора номера /переменные N/N1/порт Ц2/порт Ц4
If Left(modem , 6) = "+CLIP:" Then
Text1 = Mid(modem , 8 , 12)
Call Nokia_text(1 , 3 , Text1 , 0)
End If
Text1 = Left(modem , 16) + Str(tbuf)
Text1 = Text1 + " "
Call Nokia_text(1 , 6 , Text1 , 0)
'===вывод номера
Call Nokia_text(1 , 4 , "Набранный номер" , 0)
For P = 1 To 11
Text1 = Str(cifra(p))
Call Nokia_text(p , 5 , Text1 , 0)
Next P
Return
'============== РАБОТА С БУФЕРОМ И ОПРОСОМ МОДЕМА ====
Sim300:
Tbuf = 0
Do
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
B = Inkey()
Loop
Return
'================ Подпрограмма режима ожидания=========
Ozhidanie:
If Left(modem , 4) = "RING" Or Left(modem , 5) = "+CLIP" Then 'поступление звонка
If Zvonok = 2 Then Zvonok = 0 'если звонок появился и трубка положена, перевести в 1
If Zvonok = 5 Then Print "ATH" 'если в режиме набирания номера
End If
If Trubka = 1 And Zvonok = 0 Then Zvonok = 1
If Zvonok = 1 Then 'если снята трубка, то идём в набор номера
Gosub Nabornomera
Gosub Pravilanabora
Return
Pravilanabora:
If Zvonok = 0 Then
Text1 = "ATH"
Gosub Inicilizacija
End If
If Zvonok = 1 Then
Text1 = "ATH"
Gosub Inicilizacija
N1 = 0 'Сбрасываю разные данные.
N = 0
Zvonok = 5
Gosub Nabornomera
End If
If Zvonok = 5 Then
Gosub Nabor Nomera 'зацикливаем
Return
'================ Подпрограмма режима разговора=======================
Razgovor:
Return
'================
'================
'================
'================
Programma:
Do
'B = Ischarwaiting()
B = Inkey()
If B > 0 Then Gosub Sim300 'Getline Modem
Tbuf = 0
T = T + 1
If T = 254 Then
T = 0 'тупй=ой внутренний таймер, так, нужен для
If Zvonok <> 5 Then Gosub Informacia
End If
'Waitms 1
Loop
$include "Nokia-1100 Library.inc"
End


