Auf Wunsch eines Liebhabers der Verwendung von -Codes im elektronischen Handwerk wurde es erforderlich, eine Funktion (Unterprogramm, Prozedur) zu schreiben, die einen Triller aus einer Folge von Punkten und Strichen ausgibt. In einem Morsecode kann die LĂ€nge eines Zeichens zwischen 1 Zeichen (Buchstaben E und T) und 9 Zeichen (SOS-Trigraph) liegen. Was ist als Parameter an die obige Funktion zu ĂŒbergeben? Wenn Sie nicht durch die Bedingungen der
Lizenz belastet sind
, lade
ich Sie ein, sich mit dem Vorgang des EinfĂŒllens des Morsecodes in 1 Byte vertraut zu machen.
Im Morsecode sind die am hÀufigsten verwendeten Zeichen 1-6 Zeichen lang.
; . Ee ; - Tt ; .. Ii ; .- Aa ; -. Nn ; -- Mm ; ... Ss ; ..- Uu ; .-. Rr ; .-- Ww ; -.. Dd ; -.- Kk ; --. Gg ; --- Oo ; .... Hh ; ...- Vv ; ..-. Ff ; ..-- ; .-.. Ll ; .-.- [AA] digraph UNKNOWN STATION ; .--. Pp ; .--- Jj ; -... Bb ; -..- Xx ; -.-. Cc ; -.-- Yy ; --.. Zz ; --.- Qq ; ---. ; ---- ; .---- 1 ; ..--- 2 ; ...-- 3 ; ....- 4 ; ..... 5 ; -.... 6 ; --... 7 ; ---.. 8 ; ----. 9 ; ----- 0 ; ..-.. ; ..-.- [INT] trigraph - military network question marker ; -..-. Slash/Fraction Bar [/] ; -.--. Parenthesis (Open) ; .-... [AS] digraph - Ampersand (or "Wait") [&] ; -...- [BT] digraph - Double Dash = or -- ; .-.-. Plus sign [+] ; .-.-. [AR] digraph - New Page Signal ; -.-.- Starting Signal ; ...-. Understood ; .--.-. ; .-.-.- Period [.] ; --..-- Comma [,] ; ..--.. [UD] digraph Question Mark [?] ; .----. Apostrophe ['] ; -.-.-- [KW] digraph - Exclamation Point [!] ; -.--.- Parenthesis (Close) ; ---... Colon [:] ; -.-.-. Semicolon [;] ; -....- Hyphen, Minus Sign [-] ; ..--.- Underscore [_] ; .-..-. Quotation mark ["] ; .--.-. [AC] digraph - At Sign [@] ; ...-.- End of work ; ...-..- [SX] digraph - Dollar sign [$] ; ........ [HH] digraph - Error/correction ; ...---... [SOS] trigraph
Diese Zeichen werden in ein 8-Bit-Argument eingefĂŒgt. Ein Byte muss eine Folge von Zeichen (von 1 bis 6) und deren Nummer (auch von 1 bis 6) enthalten. Die Zeichenfolge sollte auf dem niedrigstwertigen oder höchsten Bit ausgerichtet sein, um das Verschieben in das Ăbertragsflag (Carry) durch Verschiebungsbefehle zu erleichtern. Wir erhalten zwei Optionen fĂŒr die Position des ZĂ€hlers (c) und die Reihenfolge (n) der Zeichen:
; arg [s, x, x, x, x, c, c, c] - 1 Zeichen
; arg [s, s, x, x, x, c, c, c] - 2 Zeichen
; arg [s, s, s, x, x, c, c, c] - 3 Zeichen
; arg [s, s, s, s, x, c, c, c] - 4 Zeichen
; arg [s, s, s, s, s, c, c, c] - 5 Zeichen
; arg [s, s, s, s, s, s / c, c, c] - 6 Zeichen
; arg [c, c, c, x, x, x, x, s] - 1 Zeichen
; arg [c, c, c, x, x, x, s, s] - 2 Zeichen
; arg [c, c, c, x, x, s, s, s] - 3 Zeichen
; arg [c, c, c, x, s, s, s, s] - 4 Zeichen
; arg [c, c, c, s, s, s, s, s] - 5 Zeichen
; arg [c, c, c / s, s, s, s, s] - 6 Zeichen
In der ersten AusfĂŒhrungsform wird mit der maximalen SequenzlĂ€nge das 6. Zeichen dem höchstwertigen Bit des ZĂ€hlers ĂŒberlagert.
In der zweiten AusfĂŒhrungsform wird mit der maximalen SequenzlĂ€nge das erste Zeichen dem niedrigstwertigen Bit des ZĂ€hlers ĂŒberlagert. In diesem Fall kann das niederwertige Bit des ZĂ€hlers als unbedeutend angesehen werden, da beide Kombinationen 110 und 111 als Maximalwert des ZĂ€hlers (6) angenommen werden können. Wenn der Wert des ZĂ€hlers 5 oder weniger betrĂ€gt, werden den Bits des ZĂ€hlers keine signifikanten Vorzeichen ĂŒberlagert.
Wir wÀhlen die zweite Option. Wir nennen die Punkte Nullen, Striche - Einheiten. Da die Zeichenfolge mit dem niedrigstwertigen Bit des Arguments ausgerichtet ist, ist die Zeichenfolge in umgekehrter Reihenfolge angeordnet, um nach rechts verschoben zu werden. Wir erhalten die Kodierung des Arguments:
; arg [c2, c1, c0 / s6, s5, s4, s3, s2, s1]
Im Morsecode wird die Dauer eines Punktes als Zeiteinheitsintervall verwendet. Die Dash-Dauer betrĂ€gt 3 Intervalle. Die Pause zwischen den Zeichen innerhalb des Zeichens betrĂ€gt 1 Intervall. Pause zwischen den Zeichen - 4 Intervalle. Pause zwischen den Wörtern - 7 Intervalle. Geben Sie einfach die Pausen-Kombination ein, um die Funktion darĂŒber zu informieren, dass die Zeichen nicht berechnet werden mĂŒssen:
; arg [0, 0, 0, 0, 0, 0, 0, 0]
Nachdem die Funktion das Argument arg [c2, c1, c0 / s6, s5, s4, s3, s2, s1] akzeptiert hat, muss sie den ZĂ€hler und die Sequenz daraus extrahieren, das Zeichen âabsĂ€genâ und mit einer Pause von 3 Intervallen beenden.
Um eine Pause zwischen Wörtern zu bilden, ĂŒbergeben wir das Argument arg [0, 0, 0, 0, 0, 0, 0, 0] an die Funktion. Die Funktion muss zusĂ€tzlich zu einer Nachpause von 3 Intervallen vom vorherigen Zeichen eine Pause von 4 Intervallen (insgesamt 7 Intervalle) ausarbeiten.
Um den ZĂ€hler zu extrahieren, muss die Funktion die Kopie des Inhalts von arg um 5 Bit nach rechts verschieben, die UND-Maske (00000111) anwenden und den ZĂ€hler mit 6 gleichsetzen, wenn er gleich 7 ist. Als nĂ€chstes extrahieren Sie Schritt fĂŒr Schritt nach rechts Zeichen aus dem ursprĂŒnglichen arg. Wenn â0â ein Punkt ist: 1 Pieptonintervall, 1 Pausenintervall. Wenn "1" ein Bindestrich ist: 3 Signaltonintervalle, 1 Pausenintervall. Nach dem Ăben des letzten Zeichens - 2 Pausenintervalle. Wenn arg = 0: nur eine Pause von 4 Intervallen.
Diese 8-Bit-Codierung umfasst alle Morsezeichen und Digraphen mit einer LĂ€nge von 1 bis 6 Zeichen. Betrachten Sie die folgenden Beispiele:
; . Ee arg[0, 0, 1, x, x, x, x, 0] ; - Tt arg[0, 0, 1, x, x, x, x, 1] ; .. Ii arg[0, 1, 0, x, x, x, 0, 0] ; .- Aa arg[0, 1, 0, x, x, x, 1, 0] ; -. Nn arg[0, 1, 0, x, x, x, 0, 1] ; -- Mm arg[0, 1, 0, x, x, x, 1, 1] ; ... Ss arg[0, 1, 1, x, x, 0, 0, 0] ; ..- Uu arg[0, 1, 1, x, x, 1, 0, 0] ; .-. Rr arg[0, 1, 1, x, x, 0, 1, 0] ; .-- Ww arg[0, 1, 1, x, x, 1, 1, 0] ; -.. Dd arg[0, 1, 1, x, x, 0, 0, 1] ; -.- Kk arg[0, 1, 1, x, x, 1, 0, 1] ; --. Gg arg[0, 1, 1, x, x, 0, 1, 1] ; --- Oo arg[0, 1, 1, x, x, 1, 1, 1] ; .... Hh arg[1, 0, 0, x, 0, 0, 0, 0] ; ...- Vv arg[1, 0, 0, x, 1, 0, 0, 0] ; ..-. Ff arg[1, 0, 0, x, 0, 1, 0, 0] ; ..-- arg[1, 0, 0, x, 1, 1, 0, 0] ; .-.. Ll arg[1, 0, 0, x, 0, 0, 1, 0] ; .-.- arg[1, 0, 0, x, 1, 0, 1, 0] ; .--. Pp arg[1, 0, 0, x, 0, 1, 1, 1] ; .--- Jj arg[1, 0, 0, x, 1, 1, 1, 0] ; -... Bb arg[1, 0, 0, x, 0, 0, 0, 1] ; -..- Xx arg[1, 0, 0, x, 1, 0, 0, 1] ; -.-. Cc arg[1, 0, 0, x, 0, 1, 0, 1] ; -.-- Yy arg[1, 0, 0, x, 1, 1, 0, 1] ; --.. Zz arg[1, 0, 0, x, 0, 0, 1, 1] ; --.- Qq arg[1, 0, 0, x, 1, 0, 1, 1] ; ---. arg[1, 0, 0, x, 0, 1, 1, 1] ; ---- arg[1, 0, 0, x, 1, 1, 1, 1] ; .---- 1 arg[1, 0, 1, 1, 1, 1, 1, 0] ; ..--- 2 arg[1, 0, 1, 1, 1, 1, 0, 0] ; ...-- 3 arg[1, 0, 1, 1, 1, 0, 0, 0] ; ....- 4 arg[1, 0, 1, 1, 0, 0, 0, 0] ; ..... 5 arg[1, 0, 1, 0, 0, 0, 0, 0] ; -.... 6 arg[1, 0, 1, 0, 0, 0, 0, 1] ; --... 7 arg[1, 0, 1, 0, 0, 0, 1, 1] ; ---.. 8 arg[1, 0, 1, 0, 0, 1, 1, 1] ; ----. 9 arg[1, 0, 1, 0, 1, 1, 1, 1] ; ----- 0 arg[1, 0, 1, 1, 1, 1, 1, 1] ; ..-.. arg[1, 0, 1, 0, 0, 1, 0, 0] ; ..-.- [INT] arg[1, 0, 1, 1, 0, 1, 0, 0] ; -..-. [/] arg[1, 0, 1, 0, 1, 0, 0, 1] ; -.--. Parenthesis arg[1, 0, 1, 1, 0, 1, 1, 0] ; .-... [&] arg[1, 0, 1, 0, 0, 0, 1, 0] ; -...- [=] arg[1, 0, 1, 1, 0, 0, 0, 1] ; .-.-. [+] arg[1, 0, 1, 0, 1, 0, 1, 0] ; -.-.- Starting Signal arg[1, 0, 1, 1, 0, 1, 0, 1] ; ...-. Understood arg[1, 0, 1, 0, 1, 0, 0, 0] ; .--.-. arg[1, 1, 0, 1, 0, 1, 1, 0] ; .-.-.- [.] arg[1, 1, 1, 0, 1, 0, 1, 0] ; --..-- [,] arg[1, 1, 1, 1, 0, 0, 1, 1] ; ..--.. [?] arg[1, 1, 0, 0, 1, 1, 0, 0] ; .----. ['] arg[1, 1, 0, 1, 1, 1, 1, 0] ; -.-.-- [!] arg[1, 1, 1, 1, 0, 1, 0, 1] ; -.--.- Parenthesis arg[1, 1, 1, 0, 1, 1, 0, 1] ; ---... [:] arg[1, 1, 0, 0, 0, 1, 1, 1] ; -.-.-. [;] arg[1, 1, 0, 1, 0, 1, 0, 1] ; -....- [-] arg[1, 1, 1, 0, 0, 0, 0, 1] ; ..--.- [_] arg[1, 1, 1, 0, 1, 1, 0, 0] ; .-..-. ["] arg[1, 1, 0, 1, 0, 0, 1, 0] ; .--.-. [@] arg[1, 1, 0, 1, 0, 1, 1, 0] ; ...-.- End of work arg[1, 1, 1, 0, 1, 0, 0, 0]
Wenn Sie sich genau ansehen, was in den trockenen RĂŒckstĂ€nden verbleibt:
; ...-..- Dollar sign [$] [SX] digraph ; ........ Error/correction [HH] digraph or [EEEEEEEE] ; ...---... [SOS]
Es wĂ€re logisch, eine zusĂ€tzliche Funktion void dot3woPostPause () einzufĂŒhren, nach der [X] (-..-), [5] (.....) oder [:] (---...) berechnet werden.
Betrachten Sie der VollstÀndigkeit halber den "schwierigen" Weg. Um Morse-Digraphen und Trigraphen mit einer LÀnge von mehr als 6 Zeichen zu erarbeiten, muss die Codierung ergÀnzt werden, um die "zusÀtzlichen" Zeichen ohne Zwischensymbolpause (ohne eine Nachpause von 2 Intervallen nach den "zusÀtzlichen" Zeichen) zu berechnen.
Die Anzahl der "zusÀtzlichen" Zeichen liegt zwischen 1 und 3. Die ZiffernkapazitÀt des ZÀhlers 2. Wir platzieren den ZÀhler in den Arg-Bits [4,3] und die Sequenz in den Arg-Bits [2,1,0]:
; arg [0, 0, 0, c1, c0, s3, s2, s1]
Mit arg [7,6,5] = 000 muss die Funktion zum Extrahieren des ZĂ€hlers die Kopie des Arg-Inhalts um 3 Bits nach rechts verschieben und die UND-Maske (00000011) anwenden. Als nĂ€chstes Schritt fĂŒr Schritt nach rechts, um Zeichen aus dem ursprĂŒnglichen Argument zu extrahieren. Wenn â0â ein Punkt ist: 1 Pieptonintervall, 1 Pausenintervall. Wenn "1" ein Bindestrich ist: 3 Signaltonintervalle, 1 Pausenintervall. Nach dem Ausarbeiten des letzten Zeichens werden keine zusĂ€tzlichen Pausen hinzugefĂŒgt.
Um das âlangeâ Symbol zu ermitteln, mĂŒssen Sie zuerst die Zeichen ohne Nachpause und dann die Zeichen mit Nachpause verarbeiten. HierfĂŒr werden zwei 8-Bit-Argumente benötigt. Die Gesamtzahl der Zeichen in den Argumenten muss der LĂ€nge des Zeichens entsprechen:
; ...-..- Dollar sign [$] [SX] digraph ; arg1[0, 0, 0, 0, 1, x, x, 0] arg2[1, 1, 1, 0, 0, 1, 0, 0] ; arg1[0, 0, 0, 1, 0, x, 0, 0] arg2[1, 0, 1, 1, 0, 0, 1, 0] ; arg1[0, 0, 0, 1, 1, 0, 0, 0] arg2[1, 0, 0, x, 1, 0, 0, 1] ; ; ........ Error/correction [HH] digraph or [EEEEEEEE] ; arg1[0, 0, 0, 1, 0, x, 0, 0] arg2[1, 1, 0, 0, 0, 0, 0, 0] ; arg1[0, 0, 0, 1, 1, 0, 0, 0] arg2[1, 0, 1, 0, 0, 0, 0, 0] ; ; ...---... [SOS] ; arg1[0, 0, 0, 1, 1, 0, 0, 0] arg2[1, 1, 0, 0, 0, 1, 1, 1]
Das Packen von Morsecodezeichen in 8-Bit-Code kann in verschiedenen Programmiersprachen und auf verschiedenen Plattformen implementiert werden. FĂŒr Max (Liebhaber von -Codes) habe ich den Quellcode des "Fisches" auf
STM8 asm vorbereitet.
Alternative 8-Bit-Codierung vom Benutzer "Akon32", mit der Sie das zweite Argument loswerden können:
; arg[0, 0, 0, 0, 0, 0, 0, 0] â [HH] + 2 ; arg[0, 0, 0, 0, 1, 0, 0, 1] â [$] + 2 ; arg[1, 0, s1, s2, s3, s4, s5, s6] â [6 ] + 2 ; arg[1, 1, 0, s1, s2, s3, s4, s5] â [5 ] + 2 ; arg[1, 1, 1, 0, s1, s2, s3, s4] â [4 ] + 2 ; arg[1, 1, 1, 1, 0, s1, s2, s3] â [3 ] + 2 ; arg[1, 1, 1, 1, 1, 0, s1, s2] â [2 ] + 2 ; arg[1, 1, 1, 1, 1, 1, 0, s1] â [1 ] + 2 ; arg[1, 1, 1, 1, 1, 1, 1, 0] â 4 ; arg[1, 1, 1, 1, 1, 1, 1, 1] â [SOS] + 2 ; 8 ; Carry ; ('1') ; ('0') (Carry) - ; 0b00000000, 0b11111111, 0b11111110
Im Gegensatz zu einer Folge von Buchstaben (z. B. [S], [O], [S]) werden Digraphen und Trigraphen (z. B. [SOS]) ohne Pausen zwischen Buchstaben verarbeitet.