ArSid - Arduino Sid Synthesizer

Fri 19-Apr-19
15:20:38




Lib: Eigen Tekens

Datum: Sat 12 January 2019
Samenvatting: Het Lcd-Display biedt de mogelijkheid om zelf gemaakte characters (eigen letter-tekens) te maken en te laten zien.
 Soort Artikel: Software
Status: Afgerond



[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
lib_userchar_1-fonttabel.jpg
1/6: lib_userchar_1-fonttabel.jpg.
lib_userchar_2-schets.jpg
2/6: lib_userchar_2-schets.jpg.
lib_userchar_3-uitvoering.jpg
3/6: lib_userchar_3-uitvoering.jpg.
lib_userchar_4.jpg
4/6: lib_userchar_4.jpg.
lib_userchar_5-instructies.jpg
5/6: lib_userchar_5-instructies.jpg.
lib_userchar_6.jpg
6/6: lib_userchar_6.jpg.
Meer
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

Met het Lcd-Display op zich kan al meer informatie getoond worden dan met alleen Leds en 7-segment Displays. Niet alleen getallen van noten en frequenties, maar ook benamingen ervan.

Het Lcd-Display biedt ook de mogelijkheid om eigen gemaakte tekens (letter-tekens of te wel characters) te laten zien. Hierdoor is de informatie op het display niet alleen vriendelijker, maar het geeft de ArSid ook net een ietsje meer luxe en uitstraling. Het laat zien dat het niet alleen een werkend geluids-apparaat is, maar dat er meer werk in gestoken is. En dit laatste is ook zeker waar.

Eigen characters.

Het display heeft enkele beperkingen, wat betreft eigen-tekens. Er kunnen maximaal 8 verschillende eigen-tekens worden opgegeven EN elke teken is beperkt tot 5 pixels breed en 8 pixels hoog. Brede tekens zijn wel mogelijk door 2 tekens te defini-eren, maar dan moet er rekening worden gehouden met een tussenliggende kolom pixels die allemaal uit zijn, dit voor een betere leesbaarheid.

Zoals de foto's laat zien kan je beginnen op ruitjes papier (zoals gedaan is bij het titelscherm). Daarna kan elke regel worden omgezet in een binair of hexa-decimaal getal. En deze getallen moeten dan naar het display worden gestuurd.

Een alternatieve methode is om alles in een tekst-editor te ontwerpen met '.' en 'X', bijvoorbeeld de twee tekens om het Random-Audio Signaal te tonen (zoals op de foto is te zien (derde regel, achter de "W:")):

Regel-nr Ontwerp
0:.....  .....
1:....X  ...X.
2:....X  ...XX
3:.X..X  X.X.X
4:.X..X  X.X.X
5:.XX.X  .XX.X
6:X..X.  .X...
7:.....  .....

Dit symbool van twee tekens worden gesplitst in twee aparte regels per teken-regel. Dat geeft dan het volgende. Elke "." wordt een "0", elke "X" een "1". Uiteindelijk komt er een "0b" vooraan. In dit proces is een rekenmachine niet nodig. Dit geheel resulteert in de volgende tabel:

Teken-nr en regel-nr. ontwerp -> Bitmap -> Binair -> C-binair
Teken 1-0: ..... -> 0 0000 -> %00000 -> 0b00000
Teken 1-1: ....X -> 0 0001 -> %00001 -> 0b00001
Teken 1-2: ....X -> 0 0001 -> %00001 -> 0b00001
Teken 1-3: .X..X -> 0 1001 -> %01001 -> 0b01001
Teken 1-4: .X..X -> 0 1001 -> %01001 -> 0b01001
Teken 1-5: .XX.X -> 0 1101 -> %01101 -> 0b01101
Teken 1-6: X..X. -> 1 0010 -> %10010 -> 0b10010
Teken 1-7: ..... -> 0 0000 -> %00000 -> 0b00000
Teken 2-0: ..... -> 0 0000 -> %00000 -> 0b00000
Teken 2-1: ...X. -> 0 0010 -> %00010 -> 0b00010
Teken 2-2: ...XX -> 0 0011 -> %00011 -> 0b00011
Teken 2-3: X.X.X -> 1 0101 -> %10101 -> 0b10101
Teken 2-4: X.X.X -> 1 0101 -> %10101 -> 0b10101
Teken 2-5: .XX.X -> 0 1101 -> %01101 -> 0b01101
Teken 2-6: .X... -> 0 1000 -> %01000 -> 0b01000
Teken 2-7: ..... -> 0 0000 -> %00000 -> 0b00000

Hierna voldoet het om de 8 (binaire) getallen op een regel te zetten. De benodigde komma's moeten er nog tussen PLUS de accolades er omheen, om een array-regel compleet te maken. Voor dit voorbeeld wordt dit:

{ 0b00000, 0b00001, 0b00001, 0b01001, 0b01001, 0b01101, 0b10010, 0b00000 },
{ 0b00000, 0b00010, 0b00011, 0b10101, 0b10101, 0b01101, 0b01000, 0b00000 },

Voor de duidelijkheid kan er nog een regel commentaar boven en klaar is een nieuw teken.

Uiteindelijk is de tweede ontwerp-methode gebruikt om bijna alle tekens te definieren en in het array te stoppen.

Het Teken Array.

In de ArSid zijn alle eigen-tekens in 1 groot array gestopt. En dit array staat (net als de andere grote arrays van de ArSid) in het programma geheugen (zie de statements: "static" en "PROGMEM"). Het array zelf bestaat uit een aantal regels ("[Max_Bitmap]"net zoveel als dat er eigen-tekens bestaan) van elk 8 elementen. Voor elke teken-regel een element.

Hiermee wordt het mogelijk om met 1 eenvoudige funktie-aanroep (en een index-waarde) een eigen-teken naar het display te sturen.

Voor bovenstaand voorbeeld staat het volgende in het array:

// 16 [8] WaveForm Noise -none- -none- -none- // Commentaar met index: 16; lokale index: [8]; dit teken wordt gebruikt bij: "WaveForm Noise -none- -none- -none-"
{ 0b00000, 0b00001, 0b00001, 0b01001, 0b01001, 0b01101, 0b10010, 0b00000 },// De definitie van het eerste character van dit teken in 8 getallen, die hier binair worden opgegeven.
{ 0b00000, 0b00010, 0b00011, 0b10101, 0b10101, 0b01101, 0b01000, 0b00000 },// De definitie van het tweede character van dit teken in 8 getallen, ook binair opgegeven.

Het doorgeven van de tekens aan het display.

In de "Font Table" (zie foto's) is te zien welke tekens het display allemaal kan weergeven. De eerste kolom laat echter zien "CG RAM" met als opmerking: "Character Pattern area can be rewritten by program." Het zijn deze posities waarin de eigen-tekens in het display moeten worden opgeslagen om later getoond te kunnen worden.

De tabel toont hierbij echter dat het om 16 posities gaat, in werkelijkheid zijn dit 2 keer dezelfde 8 definities. Dit verklaart waarom er ook maar maximaal 8 verschillende eigen-tekens getoond kunnen worden. Met wat creativiteit is hier nog behoorlijk wat mee te doen.

Maar hoe moeten de tekens nu naar het display worden gestuurd. Dit laat de Instructies weer zien (zie foto's) bij de regel "CGRAM Address Set". De instructie begint binair (8-bits) %01 en wordt aangevuld met een 6 bits-address.

Dit 6-bits address bestaat weer uit 2 delen van 3 bits, wat de gewenste teken-nummer (c - van character) aangeeft en welke regel (r) van dat teken er van bitjes wordt voorzien.

Samengevat is de instructie dus "%01cc crrr". Is er een rij bitjes gegstuurd, dan wordt de volgende bitjes automatisch in het volgende address geplaatst.

Nu bekend is waar men de eigen-teken in het display kan neerzetten, is het ook bekend welke character men op het display moet zetten om de eigen-teken te laten zien en wel vanaf nummer 0 t/m nummer 7 (nr 8 t/m 15 geeft hetzelfde als nr 0 t/m 7).

Met deze theorie is er een funktie te maken die een gehele regel uit het grote array naar het display kan sturen naar een gewenste positie, welke weer behoord bij een bekende character-nummer.

De Eigen-Teken functies.

Er zijn twee functies in deze bibliotheek om de eigen-tekens naar het display te sturen, namelijk POKE_CHAR() en POKE_2CHAR().

  • POKE_CHAR (offset, char_num, lcd_char): Stuurt 1 eigen-teken (8 bytes) naar het display.
  • POKE_2CHAR(offset, char_num, lcd_char): Stuurt 2 eigen-tekens (16 bytes) naar het display.

De parameters hebben in beide functies dezelfde betekenis:

  • OFFSET : Dit is een Offset-Nummer in het array. Dit kan een eenvoudigere nummering geven bij het opgeven van de teken-nummers (zie bij de "Filter"- en de "Check"-tekens).
  • CHAR_NUM: Dit is het kale Teken-Nummer in het array. Opgeteld bij het Offset-nummer vorm geeft dit uiteindelijk de positie van het teken-array, waar de uiteindelijke teken-definitie staat. Soms is er 1 verschuiving naar links nodig (waarde << 1) om het juiste teken in het teken-array te bedoelen.
  • LCD_CHAR: Dit is het character-nummer van het display dat gebruikt gaat worden. Uiteindelijk bepaalt dit op welke addresses de definitie in het display terecht komt.

Voorbeelden (uit het programma (januari 2018)) van het aanroepen van deze functies zijn:

// Poke_Char (0, Asc(Char), Lcd_Char) - Comment in Help.cpp
Poke_Char (54,0,6); - Store Music Notes into the Lcd memory (See: Help.cpp)
Poke_Char (54,1,7); - Store Music Notes into the Lcd memory (See: Help.cpp)
Poke_2Char( 0, Value << 1 , 2); - Wave-Form (See: Display.cpp)
Poke_2Char(32, ValueType << 1, 6); - Filter = On (See: Display.cpp)

Omdat het eigen-teken-array vol staat met eigen-tekens die op verschillende plaatsen in het totale programma worden gebruikt EN omdat dit array wordt aangevuld naarmate het programma verder wordt uitgebreid, is het aan te bevelen om nieuwe tekens gewoon toe te voegen aan dit array en oude tekens gewoon te laten staan. Dit voorkomt dat men dan het gehele programma (en alle libraries) moet doorzoeken om de gebruikte tekens te "hernummeren" of te corrigeren. Want 1 foutje in deze nummering en de eigen-tekens komen niet meer overeen met wat er op het display zou moeten staan (een opmerking die ook in het commentaar van deze library is neergezet). 


[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

Afbeeldingen

lib_userchar_1-fonttabel.jpg
1/6: lib_userchar_1-fonttabel.jpg.
lib_userchar_2-schets.jpg
2/6: lib_userchar_2-schets.jpg.
lib_userchar_3-uitvoering.jpg
3/6: lib_userchar_3-uitvoering.jpg.
lib_userchar_4.jpg
4/6: lib_userchar_4.jpg.
lib_userchar_5-instructies.jpg
5/6: lib_userchar_5-instructies.jpg.
lib_userchar_6.jpg
6/6: lib_userchar_6.jpg.

[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
Broncode: [1: Eigen Characters (.cpp)] [2: Eigen Characters (.h)]

1: De broncode van Eigen Characters (.cpp)

(Mon 01 January 2018) ArSid_Chars.cpp: De eigen gedefinieerde characters (t/m de gegeven datum)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
//=======================================================================================
//
// ArSid_Chars - The ArSid_Chars Library
//
// All Self-defined Characters are here (exept those, used in the Intro-Screen).
// Included is a Function to store one in the Lcd Memory.
//
//=======================================================================================

#ifndef ARSID_CHARS_CPP
#define ARSID_CHARS_CPP

#include "Arduino.h"
#include "ArSid_Chars.h"
#include "ArSid_Lcd.h"

//=====================================================================================

//    333333      33      33        33        33333333        333333
//  33      33    33      33      33  33      33      33    33      33
//  33            33      33    33      33    33      33    33
//  33            3333333333    3333333333    33333333        333333
//  33            33      33    33      33    33  33                33
//  33      33    33      33    33      33    33    33      33      33
//    333333      33      33    33      33    33      33      333333

// The Self-defined chars.

// Some chars are self-defined because of two purposed.
// 1)
 It gives an easier way to show some functionality, than it would by text-only
//    e.q. The Filter and The Waveform and The Modulation.

// 2) It gives the display a nicer look, like in the Intro and in the Help-screens.

// All self-defined chars are defined in one big array. Drawing the chars was easy,
// because numbers can be inputted binairy, so there is no need to draw chars on a
// sheet of paper and calculate the dots into an other format of numbers (decimal
// or hexadecimal)
.

// The usage of one array means also that each self-defined character has one place
// in the array (one specific index-number, which is used somewhere in the big
// program)
.

// And thus there is one big warning, when changing them. DON'T INSERT a character
// into the array, only APPEND them. Also DON'T DELETE a character from the array.

// The back-fire (with INSERTING and DELETING) is to search for the index-number into
// the whole program (and all the Libraries) to correct the index-numbers and to
// check on every screen if all chagements are done correctly. That is very much
// work, which you are not waiting for to do ...

const word Max_Bitmap = 82 ;  // Number of Self-defined Characters
static const byte Char_BitMap [Max_Bitmap][8] PROGMEM = // = [000..(not known yet)][0..7]
              { // All Self-defined Characters.
                  //   0 [0] WaveForm -none-   -none-   -none-   -none-
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b00000 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b00000 },
                  //   2 [1] WaveForm -none-   -none-   -none-   Triangle
                { 0b00000, 0b00000, 0b00001, 0b00010, 0b00100, 0b01000, 0b10000, 0b00000 },
                { 0b00000, 0b00000, 0b10000, 0b01000, 0b00100, 0b00010, 0b00001, 0b00000 },
                  //   4 [2] WaveForm -none-   -none-   Sawtooth -none-
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00011, 0b01100, 0b10000, 0b00000 },
                { 0b00000, 0b00011, 0b01101, 0b10001, 0b00001, 0b00001, 0b00001, 0b00000 },
                  //   6 [3] WaveForm -none-   -none-   Sawtooth Triangle
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },
                  //   8 [4] WaveForm -none-   Square   -none-   -none-
                { 0b00000, 0b00001, 0b00001, 0b00001, 0b00001, 0b00001, 0b11111, 0b00000 },
                { 0b00000, 0b11111, 0b00001, 0b00001, 0b00001, 0b00001, 0b00001, 0b00000 },
                  //  10 [5] WaveForm -none-   Square   -none-   Triangle
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },
                  //  12 [6] WaveForm -none-   Square   Sawtooth -none-
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  14 [7] WaveForm -none-   Square   Sawtooth Triangle
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },

                  //  16 [8] WaveForm Noise    -none-   -none-   -none-
                { 0b00000, 0b00001, 0b00001, 0b01001, 0b01001, 0b01101, 0b10010, 0b00000 },
                { 0b00000, 0b00010, 0b00011, 0b10101, 0b10101, 0b01101, 0b01000, 0b00000 },
                  //  18 [9] WaveForm Noise    -none-   -none-   Triangle
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },
                  //  20 [A] WaveForm Noise    -none-   Sawtooth -none-
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  22 [B] WaveForm Noise    -none-   Sawtooth Triangle
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },
                  //  24 [C] WaveForm Noise    Square   -none-   -none-
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  26 [D] WaveForm Noise    Square   -none-   Triangle
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },
                  //  28 [E] WaveForm Noise    Square   Sawtooth -none-
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  30 [F] WaveForm Noise    Square   Sawtooth Triangle
                { 0b01010, 0b10111, 0b10000, 0b00000, 0b01111, 0b01001, 0b11001, 0b00000 },
                { 0b00011, 0b01101, 0b10001, 0b00000, 0b00100, 0b01010, 0b10001, 0b00000 },

                  //  32 [0] Filter   -none- -none- -none-
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b00000 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b00000 },
                  //  34 [1] Filter   -none- -none- -Low-
                { 0b00000, 0b11100, 0b00010, 0b00010, 0b00001, 0b00001, 0b00001, 0b00001 },
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  36 [2] Filter   -none- -Band- -none-
                { 0b00000, 0b00001, 0b00010, 0b00010, 0b00100, 0b00100, 0b00100, 0b00100 },
                { 0b00000, 0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00100, 0b00100 },
                  //  38 [3] Filter   -none- -Band- -Low-
                { 0b00000, 0b11101, 0b00010, 0b00010, 0b00101, 0b00101, 0b00101, 0b00101 },
                { 0b00000, 0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00100, 0b00100 },
                  //  40 [4] Filter   -High- -none- -none-
                { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                { 0b00000, 0b00111, 0b01000, 0b01000, 0b10000, 0b10000, 0b10000, 0b10000 },
                  //  42 [5] Filter   -High- -none- -Low-
                { 0b00000, 0b11100, 0b00010, 0b00010, 0b00001, 0b00001, 0b00001, 0b00001 },
                { 0b00000, 0b00111, 0b01000, 0b01000, 0b10000, 0b10000, 0b10000, 0b10000 },
                  //  44 [6] Filter   -Hign- -Band- -none-
                { 0b00000, 0b00001, 0b00010, 0b00010, 0b00100, 0b00100, 0b00100, 0b00100 },
                { 0b00000, 0b10111, 0b01000, 0b01000, 0b10100, 0b10100, 0b10100, 0b10100 },
                  //  46 [7] Filter   -High- -Band- -Low-
                { 0b00000, 0b11101, 0b00010, 0b00010, 0b00101, 0b00101, 0b00101, 0b00101 },
                { 0b00000, 0b10111, 0b01000, 0b01000, 0b10100, 0b10100, 0b10100, 0b10100 },
                  //  48 [8] Filter   -xxxx- -xxxx- -xxx-  OFF
                { 0b00000, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },
                { 0b00000, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 },

                  //  50 [0] 2 Check   Arrow Down
                { 0b00000, 0b00100, 0b00100, 0b00100, 0b10101, 0b01110, 0b00100, 0b00000 },
                  //  51 [1] 3 Check   Schak Up
                { 0b00100, 0b01110, 0b01010, 0b01010, 0b01010, 0b01110, 0b11111, 0b00000 },
                  //  52 [2] 4 Check   Schak Down
                { 0b11111, 0b01110, 0b01010, 0b01010, 0b01010, 0b01110, 0b00100, 0b00000 },
                  //  53 [3] 5 Check   Potmeter
                { 0b00000, 0b01110, 0b10001, 0b10101, 0b01001, 0b10110, 0b00000, 0b00000 },

                  //  54 [0] 6 Help   Music Note (1)
                { 0b00000, 0b00100, 0b00110, 0b00101, 0b00100, 0b01000, 0b11100, 0b01000 },
                  //  55 [1] 7 Help   Music Note (2)
                { 0b00100, 0b00110, 0b00101, 0b00100, 0b01000, 0b11100, 0b01000, 0b00000 },

                  //  56  [0] 8 Help   v-shape Up
                { 0b00100, 0b01010, 0b10001, 0b10001, 0b10001, 0b00000, 0b00000, 0b00000 },
                  //  57  [1] 9 Help   Schak Up
                { 0b00100, 0b01110, 0b01010, 0b01010, 0b01010, 0b01110, 0b11111, 0b00000 },
                  //  58  [2] : Help   Schak Down
                { 0b11111, 0b01110, 0b01010, 0b01010, 0b01010, 0b01110, 0b00100, 0b00000 },
                  //  59  [3] ; Help   Potmeter
                { 0b00000, 0b01110, 0b10001, 0b10101, 0b01001, 0b10110, 0b00000, 0b00000 },
                  //  60  [4] < Help   Led
                { 0b00000, 0b01110, 0b11011, 0b10101, 0b11011, 0b01110, 0b00000, 0b00000 },
                  //  61  [5] = Help   Schak <
                { 0b00000, 0b00001, 0b01111, 0b10011, 0b01111, 0b00001, 0b00000, 0b00000 },
                  //  62  [6] > Help   Schak >
                { 0b00000, 0b10000, 0b11110, 0b10011, 0b11110, 0b10000, 0b00000, 0b00000 },
                  //  63  [7] ? Help   Arc \  Up Right
                { 0b10000, 0b10000, 0b01000, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  64  [8] @ Help   Arc /  Up Left
                { 0b00001, 0b00001, 0b00010, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  65  [9] A Help   Arc /  Down Right
                { 0b00000, 0b00000, 0b00000, 0b00111, 0b01000, 0b10000, 0b10000, 0b00000 },
                  //  66 [10] B Help   Arc \  Down Left
                { 0b00000, 0b00000, 0b00000, 0b11100, 0b00010, 0b00001, 0b00001, 0b00000 },
                  //  67 [11] C Help   Sid-knop Links
                { 0b00111, 0b01000, 0b01000, 0b01001, 0b01010, 0b00100, 0b01011, 0b00000 },
                  //  68 [12] D Help   Sid-Knop Rechts
                { 0b11100, 0b00010, 0b00010, 0b00010, 0b00010, 0b00010, 0b11100, 0b00000 },
                  //  69 [13] E Help   Stip tussen Leds Links
                { 0b00000, 0b00000, 0b00000, 0b00001, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  70 [14] F Help   Stip tussen Leds Rechts
                { 0b00000, 0b00000, 0b00000, 0b10000, 0b00000, 0b00000, 0b00000, 0b00000 },
                  //  71 [15] G Help   Din Plug Links
                { 0b00110, 0b01111, 0b11111, 0b10111, 0b11111, 0b01101, 0b00111, 0b00000 } ,
                  //  72 [16] H Help   Din Plug Rechts
                { 0b01100, 0b11110, 0b11111, 0b11101, 0b11111, 0b10110, 0b11100, 0b00000 },
                  //  73 [17] I Help   Audio Plug
                { 0b00000, 0b01110, 0b10001, 0b10101, 0b10001, 0b01110, 0b00000, 0b00000 },
                  //  74 [18] J Help   Dip Switch Up
                { 0b11111, 0b10001, 0b10001, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000 },
                  //  75 [19] K Help   Dip Switch Down
                { 0b11111, 0b11111, 0b11111, 0b11111, 0b10001, 0b10001, 0b11111, 0b00000 },
                  //  76 [0] L Ctrl-Reg Sync
                { 0b00000, 0b01110, 0b10000, 0b10001, 0b00001, 0b01110, 0b00000, 0b00000 },
                  //  77 [1] M Ctrl-Reg Ring Modulator
                { 0b00000, 0b01110, 0b11011, 0b10101, 0b11011, 0b01110, 0b00000, 0b00000 },
                  //  78 [2] N Volume Triangle
                { 0b00000, 0b00000, 0b00001, 0b00011, 0b00111, 0b01111, 0b11111, 0b00000 },
                  //  79 [3] O Sid Chip Graphic
                { 0b11011, 0b01110, 0b11111, 0b01110, 0b11111, 0b01110, 0b11111, 0b00000 },
                  //  80 [0] P +/- char
                { 0b00100, 0b00100, 0b11111, 0b00100, 0b00100, 0b00000, 0b11111, 0b00000 },
                  //  81 [0] Q micro-teken 'u'
                { 0b00000, 0b00000, 0b10001, 0b10001, 0b10001, 0b10011, 0b11101, 0b10000 }
                  //  82 [x] R next-char

              };



void Poke_Char (word offset, word char_num, byte lcd_char)
{ // Store one Charcter into the memory of the Lcd Display
  // Character CHARS_NUM will be stored at character LCD_CHAR
  char_num = (offset + char_num);
  Lcd_Out(0, 64 + (lcd_char & 0x07) << 3 )); // Set to Char Ram
  byte bb = 0;
  for (byte qq=0; qq<= 7; qq=qq+1)
      { // Store one bitmap into the Lcd
        bb = pgm_read_byte_near( &(Char_BitMap[char_num][qq]) );
        Lcd_Out(1,bb);
      }
  Lcd_Out(0, B10000000); // Set back to Display
}

void Poke_2Char (word offset, word char_num, byte lcd_char)
{ // Store two Charcter into the memory of the Lcd Display
  // Character CHARS_NUM will be stored at character LCD_CHAR
  char_num = (offset + char_num);
  Lcd_Out(0, 64 + (lcd_char & 0x07) << 3 )); // Set to Char Ram
  byte bb = 0;
  for (byte qq=0; qq<=15; qq=qq+1)
      { // Store one bitmap into the Lcd
        bb = pgm_read_byte_near( &(Char_BitMap[char_num][qq]) );
        Lcd_Out(1,bb);
      }
  Lcd_Out(0, B10000000); // Set back to Display
}

//=====================================================================================

#endif // ARSID_CHARS_CPP



Broncode: [1: Eigen Characters (.cpp)] [2: Eigen Characters (.h)]

2: De broncode van Eigen Characters (.h)

(Mon 01 January 2018) ArSid_Chars.h: De eigen gedefinieerde characters (t/m de gegeven datum)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//=======================================================================================
//
// ArSid_Chars - The ArSid_Chars Library
//
// All Self-defined Characters are here (exept those, used in the Intro-Screen).
// Included is a Function to store one in the Lcd Memory.
//
//=======================================================================================

#ifndef ARSID_CHARS_H
#define ARSID_CHARS_H

#include "Arduino.h"

//=====================================================================================

void Poke_Char (word offset, word char_num, byte lcd_char);
  // Store one Charcter into the memory of the Lcd Display

void Poke_2Char (word offset, word char_num, byte lcd_char);
  // Store two Charcter into the memory of the Lcd Display

//=====================================================================================

#endif // ARSID_CHARS_H




Broncode: [1: Eigen Characters (.cpp)] [2: Eigen Characters (.h)]
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]