$PAGEWIDTH=120 ;********************************************************************* ; программа для организации охраны с использованием GSM ; V 1.07 02-01-2009 ;--------------------------------------------------------------------- ;простое охранное устройство с 4-я барьерами P3.4-P3.7, в случае замыкания ;на 0 выдается (в "активном" режиме) СМС вида: ; "SIG=1000=0000=ON " - шлейф 1 переход из "сработал" в "нормально" ; "SIG=0204=1204=ON " - шлейфы 2 и 4 "сработал", 1 - из "норма" в "сработало" ;анализ шлейфа в прерываниях, через постановку события в очередь ;управление СМС: P3.2=0 - +CMGS, P3.2=1 - +CMGW (запись в память) ;добавлен анализ принятой СМС по команде опроса новых СМС +CMGL=0 ;проверка наличия принятых команд (кодировка 7 и 8 бит): ;#*RD - опрос состояния (выдается СМС - формат см выше) ;#*ON - включить "активный" режим работы ;#*FF - включить "пассивный" режим (по событиям СМС не отправляются) ;после включения: ;- мигание контрольного светодиода быстро ;- вывод в телефон ATZ и настройки памяти телефона ;начало цикла ;- мигание медленно ;- анализ наличия события в очереди (состояния шлейфов) ;- если есть событие - включение светодиода (вывод СМС) ;- если есть команда СМС - мигание светодиода быстро (вывод СМС) ;конец цикла ;********************************************************************* ; DefSeg All,Absolute Seg All ;========================================================= ; константы ;========================================================= ; ;========================================================= ; определение ячеек в памяти ;========================================================= Reg0 equ 0 ;R0 Reg1 equ 1 ;R1 Reg4 equ 4 ;R4 Steck equ 7 ;вершина стека BufSR equ 30h ;буфер приема (32 байт) BufSRLng equ 32 ;длина буфера PTA equ 50h ;таймер (см обработку прерываний TC0) PTB equ 51h ;счетчик 30мс импульсов AdrBufSR equ 52h ;указатель места в буфере приема OldDat equ 53h ;состояние шлейфов в прежнем цикле BufEvnt equ 54h ;буфер очереди событий (БОС) BufEvntLng equ 10 ;длина буфера iBufEv equ 5Fh ;указатель первого свободного байта ;при вводе данных в БОС oBufEv equ 60h ;указатель первого свободного байта ;при выводе данных из БОС ;========================================================= ;R0 - адресация к памяти ;R1 - косвенная адресация в прерывании ;R2 - вспомогательный ;R3 - ;R4 - анализируется при формировании СМС D4-шлейф 1...D7-ш4 ;R5 - ;R6 - ;R7 - ;------- биты ------------ bKntFl equ 20h.0 ;0 - мигание контрольного светодиода ;1 - не мигает bKntSp equ 20h.1 ;0 - нормальное мигание (при bKntFl=0) ;1 - ускоренное (в 4 раза) мигание bTxRdy equ 20h.2 ;0 - буфер передатчика пуст (готов к передаче) ;1 - идет процесс передачи байта ErrSR equ 20h.3 ;1 - ошибка переполнения приемного буфера bSost equ 20h.4 ;0 - пассивная охрана без отсылки СМС по событию 'OFF' ;1 - активная - при событии отсылается СМС 'ON ' ;========================================================= ; определение ввода/вывода ОМЭВМ ;========================================================= ; P3.0 ;RxD - in данные прием из С60 ; P3.1 ;TxD - out данные в С60 pAll equ P1.0 ;0-анализ всех принятых СМС (CMGL=4); 1-только новых (CMGL=0) pSel equ P3.2 ;режим отправки СМС (0-отправить,1-в память) Kontr equ P3.3 ;светодиод (1-горит) pShl1 equ P3.4 ;шлейф 1 (0)-сработал pShl2 equ P3.5 ;шлейф 2 (0)-сработал pShl3 equ P3.6 ;шлейф 3 (0)-сработал pShl4 equ P3.7 ;шлейф 4 (0)-сработал ;========================================================= ; текст программы ;========================================================= ORG 0 LJMP Begin ; ; ORG 3 ;обработка прерывания по INT0 ; db ' GSM107 ' ;версия программы ; ORG 0BH ;Timer counter TF0 Interrapt LJMP TimInt ; ORG 13H ;Пpеpывания по INT1 reti ; ORG 1BH ;Timer counter TF1 Interrapt reti ORG 23H ;Прерывания от последоват. порта LJMP Serial ; ;====== далее сегмент должен располагаться в пределах 0-0FFh ====== ; ;------------------------------------------------------ ;вывод строки символов с адреса в ACC до байта 0 ;------------------------------------------------------ StrTX: add A,#Low(-st01) ;смещение mov R2,A st02: mov A,R2 movc A,@A+PC st01: jz st03 ;выход lcall ByteTX ;вывод байта inc R2 ajmp st02 ;не конец - дальше st03: ;lcall ClrBuf ;очистим буфер приема ret sCPMS: db 'AT+CPMS="MT"',0Dh,0 ;команда смены области хранения СМС sCMGL: db 'AT+CMGL=0',0Dh,0 ;команда чтения всех непрочитанных СМС sCMGL4: db 'AT+CMGL=4',0Dh,0 ;команда чтения всех СМС (для проверки) sCMGS: db 'AT+CMGS=',0 ;команда вывода СМС через телефон sCMGW: db 'AT+CMGW=',0 ;команда записи СМС в память sLng: db '31',0Dh,0 ;длина сообщения 17 (+14) = 31 десятичное sMsg: db '0011000B819899999999F90004A8' ;начало PDU на номер 8-999-999-99-99,8 бит db '11' ;длина самого сообщения (HEX) = 17 символов db '5349473D',0 ;сам текст сообщения PDU 'SIG=' (начало) SIG=0000=0000=OFF sATZ: db 'ATZ',0Dh,0 ;команда ATZ sON: db '4F4E20',26,0 ;состояние "активный" : "ON " Ctrl-Z sOFF: db '4F4646',26,0 ;состояние "активный" : "OFF" Ctrl-Z ;строки, содержащие искомые последовательности символов (могут быть за пределами 100h) AdrOK: db 'OK',0 ;строка проверки ответа ОК AdrRDY: db '> ',0 ;строка "приглашение к вводу" Adr7RD: db '23959408',0 ;#*RD - команда чтения состояния (кодировка 7 бит) Ad_7RD: db '1AA9A444',0 ;#*RD - команда чтения состояния (кодировка 7 бит в2) ;вариант для поиска второй копии команды (#*RD #*RD) Adr8RD: db '232A5244',0 ;#*RD - команда чтения состояния (кодировка 8 бит) Adr7ON: db '23D5D309',0 ;#*ON - команда включения активного режима (кодировка 7 бит) Ad_7ON: db '1AA99E4E',0 ;#*ON - команда включения активного режима (кодировка 7 бит в2) ;вариант для поиска второй копии команды (#*ON #*ON) Adr8ON: db '232A4F4E',0 ;#*ON - команда включения активного режима (кодировка 8 бит) Adr7OF: db '2395D108',0 ;#*FF - команда вкл пассивного состояния (кодировка 7 бит) Ad_7OF: db '1AA98C46',0 ;#*FF - команда вкл пассивного состояния (кодировка 7 бит в2) ;вариант для поиска второй копии команды (#*FF #*FF) Adr8OF: db '232A4646',0 ;#*FF - команда вкл пассивного состояния (кодировка 8 бит) ; ;====== конец сегмента располагаемого в пределах 0-0FFh ====== ;********************************************** ; обработка прерывания от T/C0 (30 мс) ;********************************************** TimInt: push ACC push PSW push Reg4 MOV TH0,#0B1H ;период прерываний T/C0 = 30мс MOV TL0,#0E0H ;30 ms (0B1E0h) при 8МГц ;перезагрузить таймер на новый цикл mov A,PTA ;отработка таймера jz ti01 ;стоит - обходим dec PTA ;иначе -1 на 30мс ti01: dec PTB ;делитель (60мс,120,240,0.5с,1,2,4,8) mov A,PTB ;управление контрольным светодиодом jb bKntFl,ti03 ;1-не мигать mov C,ACC.2 ;быстро jb bKntSp,ti02 ;скорость мигания mov C,ACC.4 ;нормально ti02: mov Kontr,C ti03: ; ;вариант для постановки события "скопом". Событие трактуется: ;старшая тетрада - старое состояние шлейфов, младшая - новое mov A,P3 ;читаем состояние шлейфов anl A,#11110000b ;оставим состояние шлейфов mov R4,A xrl A,OldDat ;сравним с прежним состоянием шлейфа jz ti07 ;изменений нет - выходим mov A,R4 swap A orl A,OldDat ;это и есть событие: Hi=Old, Lo=New lcall SetEvnt ;постановка события в очередь mov A,R4 mov OldDat,A ;обновим состояние в памяти ti07: pop Reg4 pop PSW pop ACC RETI ;*************************************************** ; обработка прерываний от последовательного порта ;*************************************************** Serial: push ACC push PSW jnb RI,ser0 ;проверим приемник clr RI ;сбросим приемник mov A,SBUF ;принятый байт mov R1,AdrBufSR ;достать адрес свободной ячейки буфера mov @R1,A ;положить по этому адресу принятый байт inc R1 ;двигаемся по буферу mov A,R1 ;проверим на конец буфера cjne A,#(BufSR+BufSRLng-1),ser1 ;один байт оставим =0 setb ErrSR ;признак ошибки переполнения mov R1,#BufSR ;ставим в начало ser1: mov AdrBufSR,R1 ;сохраняем адрес свободной ячейки буфера ajmp ser2 ser0: clr TI ;сброс передатчика clr bTxRdy ;передача окончена ser2: pop PSW pop ACC reti ;****************************************************** ; подпрограммы ;****************************************************** ;------------------------------------------------------ ; постановка события (АСС) в очередь (в БОС) ;------------------------------------------------------ SetEvnt: push Reg0 mov R0,iBufEv ;указатель ввода mov @R0,A ;в память (в буфер) inc iBufEv mov A,#(BufEvnt+BufEvntLng+1) cjne A,iBufEv,se01 mov iBufEv,#BufEvnt ;зацикливаем буфер se01: pop Reg0 ret ;------------------------------------------------------ ; чтение события (в АСС) из очереди (из БОС) ; если АСС=0, то событий в очереди нет ;------------------------------------------------------ GetEvnt: push Reg0 mov A,oBufEv cjne A,iBufEv,ge01 ;указатели не совпадают - есть данные clr A ;совпадают - признак "данных нет" ajmp ge02 ge01: mov R0,oBufEv ;указатель считывания mov A,@R0 mov R0,A ;считанное событие inc oBufEv mov A,#(BufEvnt+BufEvntLng+1) cjne A,oBufEv,ge03 mov oBufEv,#BufEvnt ;зацикливаем буфер ge03: mov A,R0 ge02: pop Reg0 ret ;------------------------------------------------------ ; инициализация очереди событий (сброс указателей и ; очистка буфера (все 0) ;------------------------------------------------------ ResEvnt: push Reg0 mov iBufEv,#BufEvnt ;указатель ввода на начало mov oBufEv,#BufEvnt ;указатель вывода на начало mov R0,iBufEv ;указатель ввода re01: mov @R0,#0 ;0 в память (в буфер) inc R0 cjne R0,#(BufEvnt+BufEvntLng+1),re01 pop Reg0 ret ;------------------------------------------------------ ;пауза 3 сек (используются прерывания) ;------------------------------------------------------ Pause: mov PTA,#100 pa01: mov A,PTA jnz pa01 ret ;------------------------------------------------------ ;вывод байта (из АСС) через посл порт ;------------------------------------------------------ ByteTX: jb bTxRdy,ByteTX ;ждем готовности передатчика ;тут бы можно проверку на время добавить (5 мс) mov SBUF,A ;вывод байта setb bTxRdy ;передатчик занят ret ;------------------------------------------------------ ;очистка буфера приема ;------------------------------------------------------ ClrBuf: clr ES ;запрет прерывания посл.порта mov R0,#BufSR ;начало буфера mov R2,#BufSRLng ;длина буфера cb01: mov @R0,#0 ;0 в буфер inc R0 djnz R2,cb01 mov AdrBufSR,#BufSR ;ставим в начало адрес свободной ячейки буфера setb ES ;разрешить прерывания посл.порта ret ;------------------------------------------------------ ;анализ ответа (сравнение строк, поиск вхождения строки) ;вход: DPTR - указывает на начало искомой строки (0-конец) ;выход: C=1 - что-то принято, но не то ; С=0,А=0 - принят ответ ОК ; С=0,А<>0 - буфер пуст (ничего не принято) ;------------------------------------------------------ CompStr: mov R0,#BufSR ;буфер приема cs01: mov A,@R0 ;берем байт из буфера jz cs02 ;конец буфера (0) - выход clr A movc A,@A+DPTR ;байт из искомой строки xrl A,@R0 ;сравниваем буфер и искомое jnz cs03 ;не совпали inc DPTR ;совпали - к следующему clr A movc A,@A+DPTR ;байт из искомой строки (на 0 - конец) clr C ;строка поиска jz cs04 ;конец - выходим cs03: inc R0 ;к следующему байту буфера ajmp cs01 ;повтор cs02: mov A,R0 ;проверим, а не было ли add A,#(-BufSR-1) ;чего в буфере (R0>BufSR) cs04: ret ;------------------------------------------------------ ;вывод в телефон продолжения PDU (4 цифры и знак "=") ;R4 - состояние линий, D4-D7 0 - сработало ;"0000" - все в норме - все 1 ;"1004" - сработали линии 1(D4) и 4(D7) ;------------------------------------------------------ StrDat: push Reg4 mov A,#'3' ;первая пара цифр lcall ByteTX ;вывод байта mov A,R4 swap A rrc A ;R4.4->C mov R4,A mov A,#'0' ;зависит от D4 jc sd01 mov A,#'1' ;D4 = 0 - '31' sd01: lcall ByteTX ;вывод байта mov A,#'3' ;вторая пара цифр lcall ByteTX ;вывод байта mov A,R4 rrc A ;R4.5->C mov R4,A mov A,#'0' ;зависит от D5 jc sd02 mov A,#'2' ;D5 = 0 - '32' sd02: lcall ByteTX ;вывод байта mov A,#'3' ;вторая пара цифр lcall ByteTX ;вывод байта mov A,R4 rrc A ;R4.6->C mov R4,A mov A,#'0' ;зависит от D6 jc sd03 mov A,#'3' ;D6 = 0 - '33' sd03: lcall ByteTX ;вывод байта mov A,#'3' ;вторая пара цифр lcall ByteTX ;вывод байта mov A,R4 rrc A ;R4.7->C mov R4,A mov A,#'0' ;зависит от D7 jc sd04 mov A,#'4' ;D7 = 0 - '34' sd04: lcall ByteTX ;вывод байта mov A,#'3' ;"=" lcall ByteTX ;вывод байта mov A,#'D' ;"=" lcall ByteTX ;вывод байта pop Reg4 ret ;------------------------------------------------------ ;вывод в телефон окончания PDU (состояние и Ctrl-Z) ;состояние - это бит bSost: ; 0 - пассивная охрана без отсылки СМС по событию 'OFF' ; 1 - активная - при событии отсылается СМС 'ON ' ;------------------------------------------------------ StrSost: mov A,#Low(sOFF) ;вывод окончания PDU (OFF пассивно) jnb bSost,ss01 ;к пассивному состоянию mov A,#Low(sON) ;вывод окончания PDU (ON активно) ss01: ljmp StrTX ;вывод в телефон сообщения и Ctrl-Z ;****************************************************** ; начало программы ;****************************************************** Begin: mov SP,#Steck ;установка стека ;------------- последовательный вывод ------------- mov SCON,#01110000b ;посл порт в режим 1 ;------------- таймеры ------------ MOV TMOD,#00100001b ;режимы работы таймеров: ;T/C0: от внутренней синхронизации работает по TR0 ; 16 битный таймер/счетчик ;T/C1: от внутренней синхронизации работает по TR1 ; 8 битный автоперезагружаемый таймер/счетчик ; для задания скорости посл.порта 2400 mov TH1,#239 ;для скорости 2400 бод mov TL1,#239 ;8МГц, SMOD=1 mov PCON,#10000000b ;SMOD=1 MOV TH0,#0B1H ;период прерываний T/C0 = 30мс MOV TL0,#0E0H ;30 ms (0B1E0h) при 8МГц SETB TR1 ;пуск T/C1 SETB TR0 ;пуск T/C0 SETB PT0 ;приоритет T/C0 MOV IE,#00010010b ;прерыв разрешены от T/C0 ;и последовательного интеpфейса setb bKntFl ;не мигать clr Kontr ;выкл светодиод clr bTxRdy ;передачик пуст (готов) lcall ClrBuf ;очистим буфер приема lcall ResEvnt ;сброс очереди событий mov A,P3 anl A,#11110000b mov OldDat,A ;определим "старое" состояние шлефов clr bSost ;изначально "пассивный" режим работы SETB EA ;разрешить прерывания ; ;============================================================== ;после инициализации вывод в телефон ATZ для его сброса и проверки наличия clr bKntFl ;мигать setb bKntSp ;быстро lcall Pause ;выдержка паузы 3 сек (светодиод быстро мигает) mov A,#Low(sATZ) ;вывод ATZ (для определения наличия и ответа телефона) lcall StrTX ;вывод в телефон ATZ lcall ClrBuf ;очистим буфер приема lcall Pause ;ждем ответа еще 3 сек mov DPTR,#AdrOK ;строка искомых символов (OK) lcall CompStr ;проверка ответа jc Begin ;что-то принято, но не то - пробуем снова jnz Begin ;нет ответа - пробуем снова ;========== посылка команды AT+CPMS="MT" ============ ;команда необходима для работы CMGL, т.к. по умолчанию теефон настроен на чтение СМС ;с СИМ карты, а полученные СМС помещаются в основную ("МТ") память mov A,#Low(sCPMS) ;вывод sCPMS="МТ" (для смены памяти телефона) lcall StrTX ;вывод в телефон ATZ lcall ClrBuf ;очистим буфер приема lcall Pause ;ждем ответа еще 3 сек mov DPTR,#AdrOK ;строка искомых символов (OK) lcall CompStr ;проверка ответа jc Begin ;что-то принято, но не то - пробуем снова jnz Begin ;нет ответа - пробуем снова ;============================================================== ; проверка и настройка прошла нормально, начинаем основной цикл программы mp2: clr bKntFl ;мигать clr bKntSp ;медленно lcall Pause ;выдержка паузы 3 сек (светодиод медленно мигает) ;======================================================================= ;анализ состояния очереди событий и отработка события ;======================================================================= lcall GetEvnt ;считать событие jz mp100 ;в очереди событий нет ;есть событие (в АСС), надо отработать ;отразить состояние наличия события (включить светодиод) setb bKntFl ;не мигать setb Kontr ;вкл светодиод ;отправляем первую часть команды записи СМС в телефон (с очисткой буфера приема) mov R4,A ;событие здесь mov A,#Low(sCMGW) ;P3.2=1 - запись СМС в память телефона jb pSel,mp101 jnb bSost,mp100 ;"пассивная" охрана - СМС не отсылаются mov A,#Low(sCMGS) ;P3.2=0 - отправка СМС через телефон mp101: lcall StrTX ;вывод в телефон +CMG_ lcall ClrBuf ;очистим буфер приема mov A,#Low(sLng) ;длина сообщения lcall StrTX ;вывод в телефон параметра 1 (длина сообщения) lcall Pause ;ждем ответа 3 сек (должно быть '>') mov DPTR,#AdrRDY ;строка искомых символов (>) lcall CompStr ;проверка ответа jc Begin1 ;что-то принято, но не то jnz Begin1 ;буфер пуст mov A,#Low(sMsg) ;вывод сообщения (начало) lcall StrTX ;вывод в телефон lcall StrDat ;вывод продолжения сообщения PDU (4hi цифры R4 "старый шлейф") mov A,R4 swap A ;подготовим к выводу Low R4 mov R4,A lcall StrDat ;вывод продолжения сообщения PDU (4Lo цифры R4 "новый шлейф") lcall StrSost ;вывод окончания сообщения PDU (состояние устройства и Ctrl-Z) lcall ClrBuf ;очистим буфер приема lcall Pause ;ждем ответа 3 сек lcall Pause ;ждем ответа еще 3 сек mov DPTR,#AdrOK ;строка искомых символов (OK) lcall CompStr ;проверка ответа jc Begin1 ;что-то принято, но не то jnz Begin1 ;буфер пуст mp100: ;=========================================================================== ;опрос телефона командой AT+CMGL=0 (новые принятые и не прочитанные СМС) ; после чтения, сообщения помечаются как прочитанные и по CMGL=0 не читаются ;=========================================================================== ; mov A,#Low(sCMGL) ;вывод AT+CMGL=0 (чтение новых СМС из телефона) jb pAll,mp103 ;только новые (P1.0=1) mov A,#Low(sCMGL4) ;вывод AT+CMGL=4 (чтение всех СМС из телефона) mp103: lcall StrTX ;вывод в телефон CMGL lcall ClrBuf ;очистим буфер приема lcall Pause ;ждем ответа еще 3 сек mov DPTR,#AdrOK ;строка искомых символов (OK) lcall CompStr ;проверка ответа jc mp200 ;что-то принято, но не то - возврат в цикл jnz mp200 ;нет ответа - возврат в цикл ;команда выполнена успешно, проверяем нет ли искомых команд mov DPTR,#Adr7RD ;строка искомых символов (#*RD 7bit) lcall CompStr ;проверка ответа jc mp207 ;что-то принято, но не то - проверяем дальше jnz mp207 ;нет ответа - проверяем дальше ljmp mpRD mp207: mov DPTR,#Ad_7RD ;строка искомых символов (#*RD 7bit v2) lcall CompStr ;проверка ответа jc mp201 ;что-то принято, но не то - проверяем дальше jnz mp201 ;нет ответа - проверяем дальше ljmp mpRD Begin1: ljmp Begin mp201: mov DPTR,#Adr8RD ;строка искомых символов (#*RD 8bit) lcall CompStr ;проверка ответа jc mp202 ;что-то принято, но не то - проверяем дальше jnz mp202 ;нет ответа - проверяем дальше ljmp mpRD mp202: mov DPTR,#Adr7ON ;строка искомых символов (#*ON 7bit) lcall CompStr ;проверка ответа jc mp208 ;что-то принято, но не то - проверяем дальше jnz mp208 ;нет ответа - проверяем дальше ljmp mpON mp208: mov DPTR,#Ad_7ON ;строка искомых символов (#*ON 7bit v2) lcall CompStr ;проверка ответа jc mp203 ;что-то принято, но не то - проверяем дальше jnz mp203 ;нет ответа - проверяем дальше ljmp mpON mp203: mov DPTR,#Adr8ON ;строка искомых символов (#*ON 8bit) lcall CompStr ;проверка ответа jc mp204 ;что-то принято, но не то - проверяем дальше jnz mp204 ;нет ответа - проверяем дальше ljmp mpON mp204: mov DPTR,#Adr7OF ;строка искомых символов (#*FF 7bit) lcall CompStr ;проверка ответа jc mp209 ;что-то принято, но не то - проверяем дальше jnz mp209 ;нет ответа - проверяем дальше ljmp mpOF mp209: mov DPTR,#Ad_7OF ;строка искомых символов (#*FF 7bit v2) lcall CompStr ;проверка ответа jc mp205 ;что-то принято, но не то - проверяем дальше jnz mp205 ;нет ответа - проверяем дальше ljmp mpOF mp205: mov DPTR,#Adr8OF ;строка искомых символов (#*FF 8bit) lcall CompStr ;проверка ответа jc mp206 ;что-то принято, но не то - проверяем дальше jnz mp206 ;нет ответа - проверяем дальше ljmp mpOF mp206: ;нет СМС mp200: ljmp mp2 ;цикл ;отработка команд, принятых в СМС mpON: setb bSost ;"активный" режим ajmp mpRD mpOF: clr bSost ;"пассивный" режим mpRD: ;отразить состояние наличия команды СМС (быстро мигать светодиоду) clr bKntFl ;мигать setb bKntSp ;быстро mov A,P3 ;текущее состояние (High) mov R4,A mov A,#Low(sCMGW) ;P3.2=1 - запись СМС в память телефона jb pSel,mp210 mov A,#Low(sCMGS) ;P3.2=0 - отправка СМС через телефон mp210: lcall StrTX ;вывод в телефон +CMG_ lcall ClrBuf ;очистим буфер приема mov A,#Low(sLng) ;длина сообщения lcall StrTX ;вывод в телефон параметра 1 (длина сообщения) lcall Pause ;ждем ответа 3 сек (должно быть '>') mov DPTR,#AdrRDY ;строка искомых символов (>) lcall CompStr ;проверка ответа jc Begin2 ;что-то принято, но не то jnz Begin2 ;буфер пуст mov A,#Low(sMsg) ;вывод сообщения (начало) lcall StrTX ;вывод в телефон lcall StrDat ;вывод продолжения сообщения PDU (4hi цифры R4 "старый шлейф") mov A,P3 ;текущее состояние (High) (с разницей 3 сек) mov R4,A lcall StrDat ;вывод продолжения сообщения PDU (4Lo цифры R4 "новый шлейф") lcall StrSost ;вывод окончания сообщения PDU (состояние устройства и Ctrl-Z) lcall ClrBuf ;очистим буфер приема lcall Pause ;ждем ответа 3 сек lcall Pause ;ждем ответа еще 3 сек mov DPTR,#AdrOK ;строка искомых символов (OK) lcall CompStr ;проверка ответа jc Begin2 ;что-то принято, но не то jnz Begin2 ;буфер пуст ljmp mp200 ;------------------------------------------------------ Begin2: ljmp Begin END ;