بناءً على طلب أحد عشاق استخدام رموز in في الصناعات اليدوية الإلكترونية ، أصبح من الضروري كتابة وظيفة (روتين فرعي ، إجراء) ستصدر مجموعة ثلاثية الأبعاد من سلسلة من النقاط والشرطات. في رمز مورس ، يمكن أن يكون طول الحرف من حرف واحد (الأحرف E و T) إلى 9 أحرف (trigraph SOS). ما لتمرير إلى الوظيفة المذكورة أعلاه كمعلمة؟ إذا لم تتحمل عبء شروط
الترخيص ، فأنا أدعوك للتعرف على عملية حشو شفرة مورس في بايت واحد.
في Morse code ، الأحرف الأكثر استخدامًا هي 1-6 أحرف.
; . 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
سيتم وضع هذه الأحرف في وسيطة 8 بت. يجب أن تحتوي البايتة على تسلسل من الأحرف (من 1 إلى 6) وعددهم (أيضًا من 1 إلى 6). يجب أن يكون محاذاة تسلسل الأحرف على الأقل بت أو أعلى بت لسهولة الدفع في علم الحمل (كاري) بواسطة أوامر التحول. نحصل على خيارين لموقع العداد (c) وتسلسل (تسلسل) الأحرف:
. arg [s، x، x، x، x، c، c، c] - حرف واحد
. arg [s، s، x، x، x، c، c، c] - 2 أحرف
. arg [s، s، s، x، x، c، c، c] - 3 أحرف
. arg [s، s، s، s، x، c، c، c] - 4 أحرف
. arg [s، s، s، s، s، c، c، c] - 5 أحرف
. arg [s، s، s، s، s، s / c، c، c] - 6 أحرف
. arg [c، c، c، x، x، x، x، s] - حرف واحد
. arg [c، c، c، x، x، x، s، s] - 2 أحرف
. arg [c، c، c، x، x، s، s، s] - 3 أحرف
. arg [c، c، c، x، s، s، s، s] - 4 أحرف
. arg [c، c، c، s، s، s، s، s] - 5 أحرف
. arg [c، c، c / s، s، s، s، s، s] - 6 أحرف
في النموذج الأول ، مع أقصى طول للتسلسل ، يتم تثبيت الحرف السادس على البتة الأكثر أهمية في العداد.
في النموذج الثاني ، مع أقصى طول للتسلسل ، يتم تثبيت الحرف الأول على أقل جزء من العداد. في هذه الحالة ، يمكن اعتبار البتة الأقل أهمية من العداد غير ذات أهمية ، حيث يمكن اعتبار المجموعتين 110 و 111 كقيمة قصوى للعداد (6) .إذا كانت قيمة العداد 5 أو أقل ، فلن يتم تثبيت العلامات الهامة على أجزاء العداد.
نختار الخيار الثاني. نحن نسمي نقطة الأصفار ، شرطات - وحدات. نظرًا لأن تسلسل الأحرف يتم محاذاة مع أقل جزء من الوسيطة ، يتم ترتيب تسلسل الأحرف بترتيب عكسي ليتم دفعها إلى اليمين. نحصل على ترميز الوسيطة:
. arg [c2، c1، c0 / s6، s5، s4، s3، s2، s1]
في شفرة مورس ، يتم أخذ مدة النقطة كفاصل زمني للوحدة. مدة اندفاعة 3 فترات. وقفة بين الأحرف داخل الحرف هو الفاصل الزمني 1. وقفة بين الشخصيات - 4 فترات. وقفة بين الكلمات - 7 فترات. لإبلاغ الوظيفة بأنه ليس من الضروري حل العلامات ، ما عليك سوى إدخال مجموعة الإيقاف المؤقت:
. arg [0، 0، 0، 0، 0، 0، 0، 0]
بعد قبول الوسيطة [c2 ، c1 ، c0 / s6 ، s5 ، s4 ، s3 ، s2 ، s1] ، يجب أن تقوم الدالة باستخراج العداد والتسلسل منه ، "استبعاد" الحرف وإنهائه مع توقف مؤقت لمدة 3 فواصل زمنية.
لتشكيل توقف مؤقت بين الكلمات ، نقوم بتمرير وسيطة وسيطة [0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0] إلى الوظيفة. يجب أن تعمل الوظيفة ، بالإضافة إلى فترة ما بعد الإيقاف المؤقت المؤلفة من 3 فواصل زمنية من الحرف السابق ، على إيقاف مؤقت لمدة 4 فواصل (مجموع 7 فواصل زمنية).
لاستخراج العداد ، يجب أن تقوم الدالة بنقل نسخة من محتويات الوسيط إلى اليمين بمقدار 5 بتات ، وتطبيق القناع AND (00000111) ، ومساواة العداد بـ 6 إذا كانت مساوية لـ 7. ثم ، خطوة بخطوة إلى اليمين ، واستخراج الأحرف من الوسيطة الأصلية. إذا كانت "0" نقطة: فاصل صوت واحد ، فاصل مؤقت واحد. إذا كانت "1" عبارة عن شرطة: 3 فواصل صوتية ، فاصل مؤقت واحد. بعد ممارسة الشخصية الأخيرة - 2 فترات توقف مؤقت. إذا كان arg = 0: فقط وقفة من 4 فترات.
يغطي هذا الترميز المكون من 8 بتات جميع أحرف مورس والرسومات من 1 إلى 6 أحرف. النظر في الأمثلة التالية:
; . 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]
إذا نظرت عن كثب إلى ما تبقى في المخلفات الجافة:
; ...-..- Dollar sign [$] [SX] digraph ; ........ Error/correction [HH] digraph or [EEEEEEEE] ; ...---... [SOS]
سيكون من المنطقي تقديم دالة إضافية dot3woPostPause () خالية من الفراغ بعدها تنجح [X] (-..-) ، [5] (.....) أو [:] (---...).
للتأكد من اكتمالها ، فكر في المسار "الصعب". للعمل على رسم مورس للرسومات ثلاثية الأبعاد وأطوالها بأكثر من 6 أحرف ، من الضروري إجراء إضافة إلى الترميز من أجل العمل على استخدام الأحرف "الإضافية" بدون توقف مؤقت بين الرموز (بدون فاصل زمني مؤقت بعد فواصل زمنية بعد الأحرف "الإضافية").
يتراوح عدد الأحرف "الزائدة" من 1 إلى 3. السعة العددية للعداد 2. نضع العداد في بتات البدل [4،3] ، والتسلسل في البتات البينية [2،1،0]:
. arg [0، 0، 0، c1، c0، s3، s2، s1]
باستخدام arg [7،6،5] = 000 ، لاستخراج العداد ، يجب أن تقوم الدالة بنقل نسخة من محتويات arg إلى اليمين بمقدار 3 بتات ، وتطبيق قناع AND (00000011). بعد ذلك ، خطوة بخطوة إلى اليمين لاستخراج الأحرف من الوسيطة الأصلية. إذا كانت "0" نقطة: فاصل صوت واحد ، فاصل مؤقت واحد. إذا كانت "1" عبارة عن شرطة: 3 فواصل صوتية ، فاصل مؤقت واحد. بعد العمل على الحرف الأخير ، لا يتم إضافة أي توقف إضافي.
الآن ، للعمل على الرمز "الطويل" ، يجب أولاً معالجة الأحرف بدون توقف مؤقت ، ثم الأحرف التي تحتوي على فترة توقف مؤقت. هناك حاجة إلى وسيطات 8 بت لهذا الغرض. يجب أن يتوافق إجمالي عدد الأحرف في الوسيطات مع طول الحرف:
; ...-..- 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]
يمكن تنفيذ أحرف مورس للتعبئة في كود 8 بت بلغات برمجة مختلفة وعلى منصات مختلفة. بالنسبة إلى Max (عاشق الرموز)) أعدت الكود المصدري لـ "fish" في
ASM STM8 .
تشفير بديل 8 بت من المستخدم "Akon32" ، مما يسمح لك بالتخلص من الوسيطة الثانية:
; 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
بخلاف تسلسل الحروف (مثل [S] ، [O] ، [S]) تتم معالجة الرسومات ثلاثية الأبعاد والرسومات الثلاثية (مثل [SOS]) بدون توقف بين الأحرف.