'DORJI walkie-talkie module OLED DEFINE OSC 4 ADCON0=0 ADCON1=7 TRISA = 255 Include "D:\-=PicBasic=-\SSD1306.inc" ' peredelan v 128x32 'Ypos 4,5,6,7 INCLUDE "bs2defs.bas" DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 24h DEFINE HSER_CLROERR 1 DEFINE HSER_BAUD 9600 '========================== MAIN Routine ============================== freq1 var word : cursor var byte : volume var byte : ctcss var byte : chan var byte : sq var byte : finalF var byte[8] : rssi var byte : freq2 var word : rssi2 var byte read 0, b10 : read 1, b11 : read 2, b12 : read 4, b14 : read 5, b15 : read 6, b16 : read 7, b17 finalF[0] = b10 : finalF[1] = b11 : finalF[2] = b12 : finalF[3] = 0 : finalF[4] = b14 : finalF[5] = b15 : finalF[6] = b16 : finalF[7] = b17 read 8, b18 : read 9, b19 : read 10, b20 : read 11, b21 ctcss = b18 : chan = b19 : sq = b20 : volume = b21 freq1 = 400 + (10 * finalF[1]) + finalF[2] : cursor = 7 : rssi = 1 : freq2 = 0 : rssi2 = 0 gosub SSD_Init : pause 50 : gosub ssd_clear : pause 50 hSEROUT ["AT+DMOCONNECT", 13, 10] ' handshake arraywrite SSD_BUFF,[0,7,"Set Freq (400-470)", 0] : gosub SSD_PRINTXY ' print first help arraywrite SSD_BUFF,[120,4, dec volume, 0] : gosub SSD_PRINTXY ' print volume arraywrite SSD_BUFF,[72,4, dec chan," ",dec sq, 0] : gosub SSD_PRINTXY arraywrite SSD_BUFF,[0,5, dec finalF[0], dec finalF[1], dec finalF[2], ".", dec finalF[4], dec finalF[5], dec finalF[6], dec finalF[7], 0] : gosub SSD_PRINTXY 'FREQ arraywrite SSD_BUFF,[54, 5, dec2 ctcss, " C Q S V", 0] : gosub SSD_PRINTXY 'signs arraywrite SSD_BUFF,[42,6,"^", 0] : gosub SSD_PRINTXY 'cursor hSEROUT ["AT+DMOSETVOLUME=", #volume, 13, 10] 'nachalnaya gromkost' goto apply start: button portb.4, 1, 100, 10, b1, 1, right button portb.6, 1, 100, 10, b2, 1, left button portb.5, 1, 100, 10, b3, 1, up button portb.3, 1, 100, 10, b4, 1, down button portb.7, 1, 100, 10, b5, 1, apply pause 50 : rssi = 0 'skidivaem RSSI goto start right: 'RIGHT if cursor = 20 then arraywrite SSD_BUFF,[cursor * 6,6," ", 0] : gosub SSD_PRINTXY : cursor = 1 : goto refresh if cursor < 20 then arraywrite SSD_BUFF,[cursor * 6,6," ", 0] : gosub SSD_PRINTXY : cursor = cursor + 1 if cursor = 3 then cursor = 4 if cursor = 8 then cursor = 9 if cursor = 11 then cursor = 12 if cursor = 13 then cursor = 14 if cursor = 15 then cursor = 16 if cursor = 17 then cursor = 20 'jump 2 goto refresh left: 'LEFT if cursor = 1 then arraywrite SSD_BUFF,[cursor * 6,6," ", 0] : gosub SSD_PRINTXY : cursor = 20 : goto refresh if cursor > 1 then arraywrite SSD_BUFF,[cursor * 6,6," ", 0] : gosub SSD_PRINTXY : cursor = cursor - 1 if cursor = 3 then cursor = 2 if cursor = 8 then cursor = 7 if cursor = 11 then cursor = 10 if cursor = 13 then cursor = 12 if cursor = 15 then cursor = 14 if cursor = 19 then cursor = 16 ' jump 2 goto refresh up: if cursor = 12 and chan < 8 then chan = chan + 1 : arraywrite SSD_BUFF,[72,4, dec chan, 0] : gosub SSD_PRINTXY 'chan if cursor = 14 and sq < 8 then sq = sq + 1 : arraywrite SSD_BUFF,[84,4, dec sq, 0] : gosub SSD_PRINTXY 'squelch if (cursor = 9 or cursor = 10) and ctcss = 38 then ctcss = 0 : goto refresh if (cursor = 9 or cursor = 10) and ctcss < 38 then ctcss = ctcss + 1 if cursor = 20 and volume < 8 then volume = volume + 1 : hSEROUT ["AT+DMOSETVOLUME=", #volume, 13, 10] : arraywrite SSD_BUFF,[120,4, dec volume, 0] : gosub SSD_PRINTXY 'volume if cursor > 8 then goto refresh ' skip if cursor not on FREQ if finalF[cursor] = 9 then finalF[cursor] = 0 : goto refresh finalF[cursor] = finalF[cursor] + 1 goto refresh down: if cursor = 12 and chan > 1 then chan = chan - 1 : arraywrite SSD_BUFF,[72,4, dec chan, 0] : gosub SSD_PRINTXY 'chan if cursor = 14 and sq > 0 then sq = sq - 1 : arraywrite SSD_BUFF,[84,4, dec sq, 0] : gosub SSD_PRINTXY 'squelch if (cursor = 9 or cursor = 10) and ctcss = 0 then ctcss = 38 : goto refresh if (cursor = 9 or cursor = 10) and ctcss > 0 then ctcss = ctcss - 1 if cursor = 20 and volume > 1 then volume = volume - 1 : hSEROUT ["AT+DMOSETVOLUME=", #volume, 13, 10] : arraywrite SSD_BUFF,[120,4, dec volume, 0] : gosub SSD_PRINTXY 'volume if cursor > 8 then goto refresh ' skip if cursor not on FREQ if finalF[cursor] = 0 then finalF[cursor] = 9 : goto refresh finalF[cursor] = finalF[cursor] - 1 goto refresh apply: freq1 = 400 + (10 * finalF[1]) + finalF[2] if cursor = 16 then arraywrite SSD_BUFF,[0,4,"Scanning...", 0] : gosub SSD_PRINTXY : goto scan 'to scan if cursor = 12 then gosub chselect write 0, finalF[0] : write 1, finalF[1] : write 2, finalF[2] : write 4, finalF[4] : write 5, finalF[5] : write 6, finalF[6] : write 7, finalF[7] write 8, ctcss : write 9, chan : write 10, sq : write 11, volume if cursor < 15 and ctcss < 10 then hSEROUT ["AT+DMOSETGROUP=0,", #freq1, ".", #finalF[4],#finalF[5],#finalF[6],#finalF[7], ",", #freq1, ".", #finalF[4],#finalF[5],#finalF[6],#finalF[7], ",000",#ctcss,",",#sq,",000",#ctcss, 13, 10] : goto refresh 'Apply FREQ if cursor < 15 and ctcss > 9 then hSEROUT ["AT+DMOSETGROUP=0,", #freq1, ".", #finalF[4],#finalF[5],#finalF[6],#finalF[7], ",", #freq1, ".", #finalF[4],#finalF[5],#finalF[6],#finalF[7], ",00",#ctcss,",",#sq,",00",#ctcss, 13, 10] : goto refresh 'Apply FREQ refresh: if cursor < 8 then arraywrite SSD_BUFF,[0,7,"Set Freq (400-470)", 0] : gosub SSD_PRINTXY ' freq if cursor = 9 or cursor = 10 then arraywrite SSD_BUFF,[0,7,"Set CTCSS (0-38) ", 0] : gosub SSD_PRINTXY ' ctcss if cursor = 20 then arraywrite SSD_BUFF,[0,7,"Set volume (1-8) ", 0] : gosub SSD_PRINTXY ' vol if cursor = 12 then arraywrite SSD_BUFF,[0,7,"Set channel (1-8) ", 0] : gosub SSD_PRINTXY ' channel if cursor = 14 then arraywrite SSD_BUFF,[0,7,"Set squelch 0-Off ", 0] : gosub SSD_PRINTXY '1 squelch if cursor = 16 then arraywrite SSD_BUFF,[0,7,"Start\stop scan ", 0] : gosub SSD_PRINTXY ' scan if cursor = 18 then arraywrite SSD_BUFF,[0,7,"temp", 0] : gosub SSD_PRINTXY ' RSSI help arraywrite SSD_BUFF,[cursor * 6,6,"^", 0] : gosub SSD_PRINTXY 'cursor arraywrite SSD_BUFF,[0,5, dec finalF[0], dec finalF[1], dec finalF[2], ".", dec finalF[4], dec finalF[5], dec finalF[6], dec finalF[7], 0] : gosub SSD_PRINTXY 'FREQ arraywrite SSD_BUFF,[54, 5, dec2 ctcss, 0] : gosub SSD_PRINTXY 'ctcss goto start chselect: if chan = 1 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 0 : finalF[6] = 6 : finalF[7] = 5 if chan = 2 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 1 : finalF[6] = 8 : finalF[7] = 7 if chan = 3 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 3 : finalF[6] = 1 : finalF[7] = 2 if chan = 4 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 4 : finalF[6] = 3 : finalF[7] = 7 if chan = 5 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 5 : finalF[6] = 6 : finalF[7] = 2 if chan = 6 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 6 : finalF[6] = 8 : finalF[7] = 7 if chan = 7 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 8 : finalF[6] = 1 : finalF[7] = 2 if chan = 8 then finalF[0] = 4 : finalF[1] = 4 : finalF[2] = 6 : finalF[3] = 0 : finalF[4] = 0 : finalF[5] = 9 : finalF[6] = 3 : finalF[7] = 7 return scan: hSEROUT ["S+",#freq1, ".", #finalF[4],#finalF[5],#finalF[6],#finalF[7], 13, 10] button portb.7, 1, 100, 10, b5, 1, startclear 'svalit' esli che hserin [wait("S="), rssi] if rssi = 48 then arraywrite SSD_BUFF,[0,4," ", 0] : gosub SSD_PRINTXY : goto start 'RSSI add S=0 found , vihodim if rssi = 49 then gosub scanadd 'RSSI add S=1 not nado = 49 pause 100 goto scan scanadd: rssi = 0 freq2 = (100 * finalF[4])+(10 * finalF[5])+ finalF[6] '.xxx 0 freq1 = 400 + (10 * finalF[1]) + finalF[2] '4xx if freq2 < 999 then freq2 = freq2 + 1 '998+1 if freq2 = 999 then freq2 = 0 : freq1 = freq1 + 1 if freq1 = 470 then arraywrite SSD_BUFF,[0,4,"Max reached", 0] : gosub SSD_PRINTXY : pause 700 : arraywrite SSD_BUFF,[0,4," ", 0] : gosub SSD_PRINTXY : goto start freq1 = 400 + (10 * finalF[1]) + finalF[2] '4xx finalF[4] = freq2 / 100 : freq2 = freq2 - (finalF[4] * 100) finalF[5] = freq2 / 10 '0 : freq2 = freq2 - (finalF[5] * 100) finalF[6] = freq2 - (finalF[5] * 10) ' : freq2 = freq2 - (finalF[6] * 10) finalF[7] = 0 arraywrite SSD_BUFF,[0,5, dec finalF[0], dec finalF[1], dec finalF[2], ".", dec finalF[4], dec finalF[5], dec finalF[6], dec finalF[7], 0] : gosub SSD_PRINTXY 'print FREQ return startclear: arraywrite SSD_BUFF,[0,4," ", 0] : gosub SSD_PRINTXY goto start DATA 4,2,4,0,0,5,0,0 'init freq data 0,1,0,2 'init ctcss, chan, sq, volume