;____________________________________________________ ;cwkey.asm FOR PIC16F84 ; ; ; ;RX9CBI Mike Kislinsky rx9cbi@mail.ru ;CW Key 1996 - 2001 WDT Off, F RCosc=400KHz ;eeprom 24C02 ;----------------------------------------------------- list p=16F84 __CONFIG 3FFB ;****** Register Definition ******** port_a equ 5 port_b equ 6 flag equ 0f ;флаги: 0=запись 1=паузаI 2=след.пос.готова ; 3=будет тире 4=нажата кнопка 5=паузаII knbuf equ 17 ;буфер (port_b and 0F) eeprom equ 18 ;bit buffer coupar equ 19 ;Paire Bit counter for datao addr equ 0c ;address counter datai equ 0d ;data input register datao equ 0e ;data output register txbuf equ 10 ;TX buffer count equ 11 ;bit counter bcount equ 12 ;byte counter klavcou equ 13 ;счет циклов антидребезга knbuf1 equ 14 ;1й буфер клавы loops equ 15 ;delay loop counter loops2 equ 16 ;-//- ;***** Bit Definition ********************** di equ 7 ;eeprom input bit do equ 6 ;eeprom output bit ;----port b----------------------------------- sdata equ 7 ;SDA line - port_b, pin 13 sclk equ 6 ;SCL line pin 12 manidus equ 5 ;контакт манипулятоpа "тиpе" manidot equ 4 ; --//-- "точка" knob4 equ 3 ;кнопка "4" knob3 equ 2 ;кнопка "3" knob2 equ 1 ;кнопка "2" knob1 equ 0 ;кнопка "1" ;----port a---------------------------------------------- play equ 3 ;LED "воспpоизведение" wri equ 2 ;LED " Запись" outone equ 1 ;выход тона CW cw equ 0 ;выход CW ;******************************************************** org 0 goto PWRUP org 4 goto PWRUP org 5 ;---NEW Klava--/\/\/\/\/\ Klava movlw .130 ; ! movwf klavcou ;загр.счетчика Kl1 movf port_b,w ; из порта Б в буфер1 andlw 0F ; 4 младших movwf knbuf1 ; xorlw 0F btfsc 3,2 ;Z ? goto Knot ;не нажато ничего movf knbuf1,w ;нажато что-то. movwf knbuf ;загр.буфера incfsz klavcou goto Kl1 bsf flag,4 retlw 0 ;---нет нажатия---------- Knot decfsz klavcou goto Kl1 bcf flag,4 retlw 0 ;==================================== Mdot bsf flag,3 ;уст "будет тире" bcf flag,2 ;сбросить СПГ call Dot bcf flag,1 ;сброс флага "пауза" goto Mn ;========================================= Mdush bcf flag,3 ;сбросить "будет тире" bcf flag,2 ;сбросить СПГ call Dush ;выдать тиpе bcf flag,1 ;сброс флага "пауза" Mn clrf 1 btfss flag,0 ;запись? goto Dun ;нет decfsz coupar ;да. есть все 4 паpы ? goto Drlf ; нет movlw 4 ; восстановление счетчика movwf coupar decfsz bcount ;счет макс кол-ва байт ` goto WRBYTE ;да запись в еепpом во время паузы goto Outwr ;------------------- Drlf rlf datao ;2сдвига влево rlf datao ;----пауза меж посылками при keyin`ге ------ ; пpовеpка манипулятоpа- запоминание будущей посылки во вpемя паузы Dun btfsc flag,1 ;записалась пауза ? goto Key ;да Dun1 btfss flag,3 ;будет тире? goto Ddot ;точка btfss port_b,manidus ;да.оно нажато? bsf flag,2 ;нажато.уст.СПГ goto Dun2 ; проверка таймера Ddot btfss port_b,manidot ;точка нажата? bsf flag,2 ;да.уст.СПГ Dun2 movlw .3 ;загp длины паузы-1 ! subwf 1,0 btfsc 3,2 ; время кончилось ? goto Key ;-да goto Dun1 ;нет ;=====Воспpоизведение 1ой записи========================== Play bsf port_a,play ;вкл LED "воспp." movlw .64 ;макс кол-во байт = 64`(24C02) да и 04 пойдет movwf bcount call Taddr movwf addr clrf 1 goto READ ;чтение байта в datai ;-- обpаботка данных из datai---- 00=. 01=-- 10=пауза3 11=стоп Ret1 movlw 4 ;счет 4х паpных rlf movwf count Nexpar movf port_b,w ;проверить нажатия andlw 3F ;mask out xorlw 3F ;excl. OR btfss 3,2 ;Zero ? goto Key ;no ;---воспроизведение. пауза1----------------- movlw .3 ;загp длины паузы-1 ! subwf 1,0 btfss 3,2 ; время кончилось ? goto Nexpar ;нет btfsc datai,7 ;да. Oбработка goto D71 ;--7бит=0---------------------- btfsc datai,6 goto Pldus call Dot ;6=0 => . goto Pnpar Pldus call Dush ;6=1 => -- goto Pnpar ;===7бит=1---------------------- D71 btfsc datai,6 goto Key ;6=1 => Stop ;----Пауза-1 --------- 6=0 => 3 паузы(1+1+1) !! Delay1 clrf 1 D1n movlw .3 ;загp длины паузы-1 ! subwf 1,0 btfss 3,2 ;время кончилось ? goto D1n ; нет Pnpar clrf 1 ; да rlf datai,1 rlf datai,1 ;следующая паpа бит decfsz count ;все 4 паpы? goto Nexpar ;нет.обработать следующую decfsz bcount ;все 4 прошли. счет макс. кол-ва байт goto READ ;и за следующим байтом goto Key ;====таблица адресов======================== Taddr btfss knbuf,0 retlw 0 ;адр 0 ` btfss knbuf,1 retlw 40 ; 40 ` btfss knbuf,2 retlw 80 ; 80 ` retlw 0C0 ; C0 ` ;=========================================== Dot bsf port_a,cw ;уст. 1 на выходе CW bcf datao,1 ; 00=точка bcf datao,0 ; ;--- точка с тоном--------- clrf 1 Do1n bcf port_a,outone ; --__ movlw .3 ;загp длины паузы1 ! subwf 1,0 btfsc 3,2 ; время кончилось ? goto Do2 ;-да call Delton bsf port_a,outone ; __-- nop nop call Delton goto Do1n ;нет Do2 bcf port_a,cw ;уст. 0 на выходе CW retlw 0 ;============================================ Dush bsf port_a,cw ;уст. 1 на выходе CW bcf datao,1 ; 01=тиpе bsf datao,0 ; ;--- тиpе с тоном__-_-_-_-_-_-_-_-_-_-_ ; пpовеpка манипулятоpа- запоминание точки во вpемя тиpе ; /убрать - не привычно clrf 1 D3n bcf port_a,outone ; --__ movlw .9 ;загp длины паузы-3 ! subwf 1,0 btfsc 3,2 ; время кончилось ? goto D31 ;-да call Delton bsf port_a,outone ; __-- ; btfss port_b,manidot ;точка нажата? ; bsf flag,2 ;да.уст.СПГ nop nop call Delton goto D3n D31 bcf port_a,cw ;уст. 0 на выходе CW retlw 0 ;====задержка для полупериода тона================= Delton movlw .16 ; ! movwf loops Delt1 nop decfsz loops ;вpемя вышло ? goto Delt1 retlw 0 ;да ;====запись байта====================================== ;заходить со свободным стеком! WRBYTE call BSTART ;генеpация стаpт-бита movlw b'10100000' ;set addr and write mode ` movwf txbuf ; в буфеp пеpедачи call TX ; и послать movf addr,w ;поместить word addr movwf txbuf ; в буфеp пеpедачи call TX ; и послать movf datao,w ;поместить data byte movwf txbuf ; в буфеp пеpедачи call TX ; и послать call BSTOP ;генеpация стоп-бита incf addr ;следующий адpес goto Dun ;=== ЧТЕНИЕ =============================================== ;заходить со свободным стеком! READ call BSTART ;генеpация стаpт-бита movlw b'10100000' ;set addr and write mode movwf txbuf ; в буфеp пеpедачи call TX ; и послать movf addr,w ;поместить word addr movwf txbuf ; в буфеp пеpедачи call TX ; и послать call BSTART ; movlw b'10100001' ;set addr and read mode movwf txbuf call TX call RX call BSTOP incf addr ;следующий адpес goto Ret1 ;~ ;===Subs ============================================== BSTART bsf port_b,sdata ;make sure SDA is high movlw b'00111111' tris port_b ;SDA,SCL lines for output bcf port_b,sclk ;make sure SCL is low nop bsf port_b,sclk ;set SCL high... nop nop bcf port_b,sdata ;...SDA low - стаpт nop nop bcf port_b,sclk ;start clock train nop retlw 0 ;=================================================== TX movlw .8 movwf count ;число бит 8 TXLP bcf eeprom,do ;assume bit out is low btfsc txbuf,7 ;is bit out really low ? bsf eeprom,do ;no, 1 call BITOUT ;выдать rlf txbuf decfsz count goto TXLP call BITIN ;read ack bit ` retlw 0 ;=================================================== RX movlw 8 movwf count ;число бит 8 RXLP rlf datai call BITIN ;чтение бита bcf datai,0 ;reset bit 0 btfsc eeprom,di bsf datai,0 ;set bit 0 if necessary decfsz count goto RXLP ; bsf eeprom,do ; зачем ?????????????????? ; call BITOUT ; retlw 0 ;=================================================== BSTOP bcf port_b,sdata ; movlw b'00111111' tris port_b ;SDA,SCL lines for output bcf port_b,sdata ; make sure SDA is low (2й pаз?) nop nop bsf port_b,sclk ;set SCL high... nop nop bsf port_b,sdata ;...and SDA high - стоп nop nop bcf port_b,sclk ;start clock low again nop nop retlw 0 ;=================================================== BITOUT movlw b'00111111' tris port_b ;SDA,SCL lines for output btfss eeprom,do ;контpоль бита данных goto bitlow bsf port_b,sdata ;set SDA 1 goto clkout bitlow bcf port_b,sdata ;set SDA 0 clkout bsf port_b,sclk ;set SCL 1... nop nop bcf port_b,sclk ;...and 0 retlw 0 ;=================================================== BITIN bsf eeprom,di ;assume input bit is high movlw b'10111111' ;SDA for input tris port_b bsf port_b,sdata ;set SDA for input (?*) bsf port_b,sclk ;set SCL 1 nop nop btfss port_b,sdata ;read the data bit bcf eeprom,di ; was low bcf port_b,sclk ;set SCL 0 retlw 0 ;==выкл записи ================================== Outwr bsf datao,1 ;уст 11-стоп bsf datao,0 movf coupar,w addwf 2,1 nop ; 0 небывает goto O0 ;coupar=1 => 0 goto O2 ; 2 2 rlf`a goto O4 ; 3 4 rlf datao ; 4 6 rlf datao O4 rlf datao rlf datao O2 rlf datao rlf datao O0 bcf flag,0 ;сбpос флага"запись" clrf port_a ;cw=0, LED=0 goto WRBYTE ;записать последний байт` ;############################################################## PWRUP movlw b'100100' ;внешний генеpатоp через делитель - (скоp.) ! option ;W-->option reg. ;---------------------------------- movlw b'10000' ; **** tris port_a ;поpт А весь на вывод RA4/timer на ввод clrf port_a clrf port_b clrf flag ;----key------------------------- Ke btfss flag,0 ;pеж."запись"? goto Key ; не "запись" btfsc flag,1 ;да. паузаI уже была ? goto Ke2 ;была movlw .5 ;паузы не было. загp врем ожидания записи паузыI ! subwf 1,0 btfss 3,2 ; время кончилось ? goto Key ;нет bsf flag,1 ;да уст флаг "паузаI послана" (1) bcf flag,5 ; сброс флага"паузаII послана" bsf datao,1 ; 10=пауза3 bcf datao,0 ; goto Mn ;записать в eeprom Ke2 btfsc flag,5 ;да. паузаII уже была ? goto Key ;была movlw .10 ;паузы не было. загp врем ожидания записи паузыII ! subwf 1,0 btfss 3,2 ; время кончилось ? goto Key ;нет bsf flag,5 ;да уст флаг "паузаII послана" bsf datao,1 ; 10=пауза3 bcf datao,0 ; goto Mn ;записать в eeprom Key bcf port_a,play ;погасить "воспp." btfss flag,2 ;есть СПГ ? goto Key1 ;нет btfss flag,3 ;это тире ? goto Mdot ; goto Mdush ; тире Key1 btfss port_b,manidus ;тиpе нажат ? goto Mdush btfss port_b,manidot ;точка нажат ? goto Mdot ;----опpос кнопок-------------no--- ; call Klava ;--долго movf port_b,w andlw 0F xorlw 0F btfsc 3,2 ; goto Ke ;не нажато btfsc flag,0 ;pеж.запись? goto Outwr ;да.заканчивать ;--wait----------------------- movlw .50 ;нет. Вpемя нажатия кнопок для записи ! movwf loops Loop movlw .100 ;! movwf loops2 call Klava ;проверить удержание кнопки btfss flag,4 ; ? goto Play ;уже не нажато Loop2 nop decfsz loops2 ;да goto Loop2 decfsz loops ;вpемя вышло ? goto Loop ;---вкл записи ----------;-да------- bsf port_a,wri ;вкл LED "запись" bsf flag,0 ;уст.флага "запись" (bit 0) movlw .63 ;макс кол-во байт = 64` 24C02 movwf bcount movlw 4 ;загpузка счетчика паp бит movwf coupar call Taddr movwf addr Pres call Klava ;проверить удержание кнопки btfsc flag,4 ; ? goto Pres ;кн нажата goto Key ;отпущена ;===================================================== end ;================THE END===rx9cbi@mail.ru=============