1 | tx_on equ p1.0
|
2 |
|
3 | delay10ms equ 10000 ;cycle count for 10msec delay at 12MHz
|
4 |
|
5 | dseg at 30h
|
6 | speed: ds 1
|
7 | cseg
|
8 |
|
9 |
|
10 | init: mov speed, #10 ;morse speed = 10 * 10msec
|
11 | main: acall morsestring
|
12 | db 'Hello World '
|
13 | db 0 ;0 mark end of string
|
14 | sjmp main
|
15 |
|
16 | signal_on:
|
17 | setb tx_on
|
18 | ret
|
19 |
|
20 | signal_off:
|
21 | clr tx_on
|
22 | ret
|
23 |
|
24 |
|
25 | morsestring:
|
26 | pop dph ;get return address,
|
27 | pop dpl ;point to string
|
28 | sjmp _mst2
|
29 | _mst1: acall morsechar ;send byte
|
30 | inc dptr ;point to next byte
|
31 | _mst2: clr a
|
32 | movc a, @a+dptr ;get byte
|
33 | jnz _mst1 ;send if not 0
|
34 | jmp @a+dptr ;jump after string
|
35 |
|
36 | morsechar:
|
37 | acall morsetable ;ascii to morse code
|
38 | setb c ;acc = 00 after 9 shifts
|
39 | _mch1: rlc a
|
40 | jnc _mch1 ;search leading 1
|
41 | sjmp _mch4
|
42 | _mch2: acall signal_on
|
43 | jnc _mch3 ;if 0 then skip 2 times delay
|
44 | acall delay2 ;send 3 times: -
|
45 | _mch3: acall delay1 ;send 1 time : .
|
46 | acall signal_off
|
47 | acall delay1
|
48 | _mch4: add a, acc ;shift left with always 0 into ACC.0
|
49 | jnz _mch2
|
50 | ; ajmp delay2 ;pause 3 times until next char
|
51 |
|
52 | delay2: acall delay1
|
53 | delay1: mov r5, speed
|
54 | _del1:
|
55 | mov r7, #high(delay10ms/2+253) ;wait 10ms
|
56 | mov r6, #low(delay10ms/2-2)
|
57 | _del2: djnz r6, _del2
|
58 | djnz r7, _del2
|
59 |
|
60 | djnz r5, _del1
|
61 | ret
|
62 |
|
63 | ;********************** convert ascii to morse code *********************
|
64 | ;
|
65 | ; Definition of morse code table:
|
66 | ; Since the length can be variable, all bits,
|
67 | ; until the 1. bit which was set, are skipped.
|
68 | ; Then all next bits are send:
|
69 | ; Bit = 0 was send as '.' and bit = 1 was send as '-'.
|
70 | ; Not translated codes are send as space
|
71 | ;
|
72 | morsetable:
|
73 | add a, #-'Z'-1-5 ; <= 'Z'+5
|
74 | jnc _mta2
|
75 | add a, #'Z'-'z' ; <= 'z'+5
|
76 | jnc _mta2
|
77 | _mta1: clr a ;pause or not defined characters
|
78 | ret
|
79 | _mta2: add a, #'Z'+1+5-',' ; >= ','
|
80 | jnc _mta1
|
81 | inc a
|
82 | movc a, @a+pc
|
83 | ret
|
84 | db 01110011b ;,: --..--
|
85 | db 0 ;not defined: 45
|
86 | db 01010101b ;. = stop: .-.-.-
|
87 | db 0 ;not defined: 47
|
88 | db 00111111b ;0: -----
|
89 | db 00101111b ;1: .----
|
90 | db 00100111b ;2: ..---
|
91 | db 00100011b ;3: ...--
|
92 | db 00100001b ;4: ....-
|
93 | db 00100000b ;5: .....
|
94 | db 00110000b ;6: -....
|
95 | db 00111000b ;7: --...
|
96 | db 00111100b ;8: ---..
|
97 | db 00111110b ;9: ----.
|
98 | db 0, 0, 0, 0, 0 ;not defined: 58..62
|
99 | db 01001100b ;?: ..--..
|
100 | db 0 ;not defined: 64, 96
|
101 | db 00000101b ;a: .-
|
102 | db 00011000b ;b: -...
|
103 | db 00011010b ;c: -.-.
|
104 | db 00001100b ;d: -..
|
105 | db 00000010b ;e: .
|
106 | db 00010010b ;f: ..-.
|
107 | db 00001110b ;g: --.
|
108 | db 00010000b ;h: ....
|
109 | db 00000100b ;i: ..
|
110 | db 00010111b ;j: .---
|
111 | db 00001101b ;k: -.-
|
112 | db 00010100b ;l: .-..
|
113 | db 00000111b ;m: --
|
114 | db 00000110b ;n: -.
|
115 | db 00001111b ;o: ---
|
116 | db 00010110b ;p: .--.
|
117 | db 00011101b ;q: --.-
|
118 | db 00001010b ;r: .-.
|
119 | db 00001000b ;s: ...
|
120 | db 00000011b ;t: -
|
121 | db 00001001b ;u: ..-
|
122 | db 00010001b ;v: ...-
|
123 | db 00001011b ;w: .--
|
124 | db 00011001b ;x: -..-
|
125 | db 00011011b ;y: -.--
|
126 | db 00011100b ;z: --..
|
127 | db 0, 0, 0, 0, 0 ;not defined: 91..95, 123..127
|
128 |
|
129 | end
|