Kode morse 8-bit

Atas permintaan salah satu pecinta menggunakan kode in dalam kerajinan elektronik, menjadi perlu untuk menulis fungsi (subprogram, prosedur) yang akan mengeluarkan bunyi getar dari urutan titik dan garis. Dalam kode Morse, panjang karakter dapat dari 1 karakter (huruf E dan T) hingga 9 karakter (trigraph SOS). Apa yang harus dilewatkan ke fungsi di atas sebagai parameter? Jika Anda tidak dibebani oleh persyaratan lisensi , saya mengundang Anda untuk berkenalan dengan proses memasukkan kode Morse ke dalam 1 byte.

Dalam kode Morse, karakter yang paling umum digunakan adalah 1-6 karakter.

; . 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 

Karakter-karakter ini akan ditempatkan dalam argumen 8-bit. Byte harus berisi urutan karakter (dari 1 hingga 6) dan jumlahnya (juga dari 1 hingga 6). Urutan karakter harus disejajarkan pada bit paling tidak signifikan atau tertinggi untuk memudahkan mendorong ke bendera carry (Carry) dengan perintah shift. Kami mendapatkan dua opsi untuk lokasi penghitung (c) dan urutan karakter:

; arg [s, x, x, x, x, c, c, c] - 1 karakter
; arg [s, s, x, x, x, c, c, c] - 2 karakter
; arg [s, s, s, x, x, c, c, c] - 3 karakter
; arg [s, s, s, s, x, c, c, c] - 4 karakter
; arg [s, s, s, s, s, c, c, c] - 5 karakter
; arg [s, s, s, s, s, s / c, c, c] - 6 karakter

; arg [c, c, c, x, x, x, x, s] - 1 karakter
; arg [c, c, c, x, x, x, s, s] - 2 karakter
; arg [c, c, c, x, x, s, s, s] - 3 karakter
; arg [c, c, c, x, s, s, s, s] - 4 karakter
; arg [c, c, c, s, s, s, s, s] - 5 karakter
; arg [c, c, c / s, s, s, s, s, s] - 6 karakter

Dalam perwujudan pertama, dengan panjang urutan maksimum, karakter keenam ditumpangkan pada bit paling signifikan dari penghitung.

Dalam perwujudan kedua, dengan panjang maksimum urutan, karakter pertama ditumpangkan pada bit paling tidak signifikan dari penghitung. Dalam hal ini, bit terkecil dari penghitung dapat dianggap tidak signifikan, karena kedua kombinasi 110 dan 111 dapat diambil sebagai nilai maksimum penghitung (6). Jika nilai penghitung adalah 5 atau kurang, tanda-tanda signifikan tidak ditumpangkan pada bit penghitung.

Kami memilih opsi kedua. Kami menyebut titik nol, tanda hubung - unit. Karena urutan karakter disejajarkan dengan sedikit argumen yang paling tidak signifikan, urutan karakter disusun dalam urutan terbalik untuk didorong ke kanan. Kami mendapatkan pengkodean argumen:

; arg [c2, c1, c0 / s6, s5, s4, s3, s2, s1]

Dalam kode Morse, durasi suatu titik diambil sebagai interval satuan waktu. Durasi Dash adalah 3 interval. Jeda antara karakter di dalam karakter adalah 1 interval. Jeda antar karakter - 4 interval. Jeda antara kata - 7 interval. Untuk memberi tahu fungsi bahwa tidak perlu mencari tanda-tanda, cukup masukkan kombinasi jeda:

; arg [0, 0, 0, 0, 0, 0, 0, 0]

Setelah menerima argumen argumen [c2, c1, c0 / s6, s5, s4, s3, s2, s1], fungsi harus mengekstraksi penghitung dan urutan darinya, β€œmelihat” karakter dan mengakhirinya dengan jeda 3 interval.

Untuk membentuk jeda di antara kata-kata, kami meneruskan argumen arg [0, 0, 0, 0, 0, 0, 0, 0] ke fungsi. Fungsi harus, selain jeda 3 interval dari karakter sebelumnya, menghitung jeda 4 interval (total 7 interval).

Untuk mengekstrak penghitung, fungsi harus menggeser salinan isi arg ke kanan sebanyak 5 bit, menerapkan masker AND (00000111), menyamakan penghitung dengan 6 jika sama dengan 7. Selanjutnya, langkah demi langkah ke kanan, ekstrak karakter dari arg asli. Jika β€œ0” adalah sebuah poin: 1 interval bip, 1 interval jeda. Jika "1" adalah tanda hubung: 3 interval bip, 1 jeda interval. Setelah berlatih karakter terakhir - 2 jeda interval. Jika arg = 0: hanya jeda 4 interval.

Pengkodean 8-bit ini mencakup semua karakter dan digraf Morse dari 1 hingga 6 karakter. Perhatikan contoh-contoh berikut:

 ; . 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] 

Jika Anda melihat dengan cermat pada apa yang tersisa di residu kering:

 ; ...-..- Dollar sign [$] [SX] digraph ; ........ Error/correction [HH] digraph or [EEEEEEEE] ; ...---... [SOS] 

akan logis untuk memperkenalkan fungsi tambahan void dot3woPostPause () setelah itu berhasil [X] (-..-), [5] (.....) atau [:] (---...).

Untuk kelengkapan, pertimbangkan jalur "sulit". Untuk mengetahui digraf dan trigraf Morse dengan panjang lebih dari 6 karakter, Anda perlu membuat tambahan pada pengkodean untuk mencari karakter "ekstra" tanpa jeda antar-karakter (tanpa jeda setelah 2 interval setelah karakter "ekstra").

Jumlah karakter "ekstra" adalah dari 1 hingga 3. Kapasitas digit penghitung 2. Kami menempatkan meter dalam bit arg [4,3], dan urutan dalam bit arg [2,1,0]:

; arg [0, 0, 0, c1, c0, s3, s2, s1]

Dengan arg [7,6,5] = 000, untuk mengekstrak penghitung, fungsi harus menggeser salinan konten arg ke kanan sebanyak 3 bit, menerapkan masker AND (00000011). Selanjutnya, langkah demi langkah ke kanan untuk mengekstraksi karakter dari arg asli. Jika β€œ0” adalah sebuah poin: 1 interval bip, 1 interval jeda. Jika "1" adalah tanda hubung: 3 interval bip, 1 jeda interval. Setelah menyelesaikan karakter terakhir, tidak ada jeda tambahan yang ditambahkan.

Sekarang, untuk mengetahui simbol "panjang", Anda harus terlebih dahulu memproses karakter tanpa jeda, kemudian karakter dengan jeda. Diperlukan dua argumen 8-bit untuk ini. Jumlah karakter dalam argumen harus sesuai dengan panjang karakter:

 ; ...-..- 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] 

Mengemas karakter kode Morse ke dalam kode 8-bit dapat diimplementasikan dalam berbagai bahasa pemrograman dan pada platform yang berbeda. Untuk Max (pencinta -kode) saya menyiapkan kode sumber "ikan" pada asm STM8 .

Pengkodean 8-bit alternatif dari pengguna "Akon32", memungkinkan Anda untuk menyingkirkan argumen kedua:
 ; 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     


Tidak seperti urutan huruf (misalnya [S], [O], [S]) digraf dan trigraph (misalnya [SOS]) diproses tanpa jeda antar-huruf.

Source: https://habr.com/ru/post/id473038/


All Articles