1 | /*
|
2 | * _16SegmentDriver.c
|
3 | *
|
4 | * Created: 11.07.2015 15:49:20
|
5 | * Author: JuliaEllie
|
6 | *
|
7 | * 16 Segmentanzeige KnightBright mit gemeinsamem Minuspol
|
8 | */
|
9 |
|
10 |
|
11 | #include <avr/io.h>
|
12 | #include <avr/delay.h>
|
13 | #include <string.h>
|
14 |
|
15 | int textSpeed = 100; // Textgeschwindigkeit für say(char[])
|
16 |
|
17 | int main(void)
|
18 | {
|
19 | DDRB = 0b11111111;
|
20 | DDRD = 0b11111111;
|
21 | DDRC = 0b00000001;
|
22 |
|
23 | DDRA = 0b00000000;
|
24 | PORTA = 0b00000000;
|
25 |
|
26 |
|
27 | alphaTest(); //zeigt alle darstellbaren Zeichen nach Reset
|
28 | //say("Hallo Welt");
|
29 | while(1)
|
30 | {
|
31 | bin2segment();
|
32 | }
|
33 |
|
34 |
|
35 | }
|
36 |
|
37 | void say(char toSay[])
|
38 | {
|
39 | string2Segment(toSay);
|
40 | }
|
41 |
|
42 |
|
43 | void segClear()
|
44 | {
|
45 | PORTB = 0b00000000;
|
46 | PORTD = 0b00000000;
|
47 | PORTC = 0b00000000;
|
48 | }
|
49 |
|
50 | //Pinbelegung für die verschiedenen Segmente - frei änderbar mit Ausnahme von Port A (Eingang)
|
51 | //bei unterschiedlicher Benennung der Segmente Datenblatt befragen
|
52 | void segA()
|
53 | {
|
54 | PORTB |= (1 << PB0);
|
55 | }
|
56 | void segB()
|
57 | {
|
58 | PORTD |= (1<<PD7);
|
59 | }
|
60 | void segC()
|
61 | {
|
62 | PORTD |= (1<<PD5);
|
63 | }
|
64 | void segD()
|
65 | {
|
66 | PORTD |= (1<<PD2);
|
67 | }
|
68 | void segE()
|
69 | {
|
70 | PORTD |= (1<<PD1);
|
71 | }
|
72 | void segF()
|
73 | {
|
74 | PORTD |= (1<<PD0);
|
75 | }
|
76 | void segG()
|
77 | {
|
78 | PORTB |= (1 << PB7);
|
79 | }
|
80 | void segH()
|
81 | {
|
82 | PORTB |= (1 << PB3);
|
83 | }
|
84 | void segK()
|
85 | {
|
86 | PORTB |= (1 << PB2);
|
87 | }
|
88 | void segM()
|
89 | {
|
90 | PORTB |= (1 << PB1);
|
91 | }
|
92 | void segN()
|
93 | {
|
94 | PORTD |= (1 << PD6);
|
95 | }
|
96 | void segP()
|
97 | {
|
98 | PORTD |= (1 << PD4);
|
99 | }
|
100 | void segR()
|
101 | {
|
102 | PORTD |= (1 << PD3);
|
103 | }
|
104 | void segS()
|
105 | {
|
106 | PORTB |= (1 << PB5);
|
107 | }
|
108 | void segT()
|
109 | {
|
110 | PORTB |= (1 << PB6);
|
111 | }
|
112 | void segU()
|
113 | {
|
114 | PORTB |= (1 << PB4);
|
115 | }
|
116 | //Dezimalpunkt - ist nur der Vollständigkeit halber belegt kann aber genutzt werden
|
117 | void segDP()
|
118 | {
|
119 | PORTC |= (1 << PC0);
|
120 | }
|
121 | //oft genutzte "Partikel" - Striche oben, unten, mitte, etc
|
122 | void _left()
|
123 | {
|
124 | segH();
|
125 | segG();
|
126 | }
|
127 | void _right()
|
128 | {
|
129 | segC();
|
130 | segD();
|
131 | }
|
132 | void _up()
|
133 | {
|
134 | segA();
|
135 | segB();
|
136 | }
|
137 | void _down()
|
138 | {
|
139 | segF();
|
140 | segE();
|
141 | }
|
142 | void _vertical()
|
143 | {
|
144 | segM();
|
145 | segS();
|
146 | }
|
147 | void _horizontal()
|
148 | {
|
149 | segU();
|
150 | segP();
|
151 | }
|
152 |
|
153 | void _updown()
|
154 | {
|
155 | segK();
|
156 | segR();
|
157 | }
|
158 | void _downup()
|
159 | {
|
160 | segT();
|
161 | segN();
|
162 | }
|
163 | void _uhd()
|
164 | {
|
165 | _up();
|
166 | _horizontal();
|
167 | _down();
|
168 | }
|
169 | //Darstellbare ASCII Zeichen mit Hilfe der "Partikel" und Segmente - auf eine direkte Ansteuerung der Ausgänge mit z.B. PORTB = 0b1010101
|
170 | //wurde wegen der freien Belegbarkeit der Pins verzichtet.
|
171 | void _A_()
|
172 | {
|
173 | _left();
|
174 | _right();
|
175 | _up();
|
176 | _horizontal();
|
177 | }
|
178 |
|
179 | void _B_()
|
180 | {
|
181 | _D_();
|
182 | segP();
|
183 | }
|
184 |
|
185 | void _C_()
|
186 | {
|
187 | _up();
|
188 | _down();
|
189 | _left();
|
190 | }
|
191 |
|
192 | void _D_()
|
193 | {
|
194 | _up();
|
195 | _down();
|
196 | _vertical();
|
197 | _right();
|
198 | }
|
199 |
|
200 | void _E_()
|
201 | {
|
202 | _C_();
|
203 | segU();
|
204 | }
|
205 |
|
206 | void _F_()
|
207 | {
|
208 | _left();
|
209 | _up();
|
210 | segU();
|
211 | }
|
212 |
|
213 | void _G_()
|
214 | {
|
215 | _C_();
|
216 | segD();
|
217 | segP();
|
218 | }
|
219 |
|
220 | void _H_()
|
221 | {
|
222 | _left();
|
223 | _right();
|
224 | _horizontal();
|
225 | }
|
226 |
|
227 | void _I_()
|
228 | {
|
229 | _T_();
|
230 | _down();
|
231 |
|
232 | }
|
233 |
|
234 | void _J_()
|
235 | {
|
236 | _right();
|
237 | _down();
|
238 | segG();
|
239 | }
|
240 |
|
241 | void _K_()
|
242 | {
|
243 | _left();
|
244 | segN();
|
245 | segR();
|
246 | segU();
|
247 | }
|
248 |
|
249 | void _L_()
|
250 | {
|
251 | _left();
|
252 | _down();
|
253 | }
|
254 |
|
255 | void _M_()
|
256 | {
|
257 | _left();
|
258 | _right();
|
259 | segK();
|
260 | segN();
|
261 | }
|
262 |
|
263 | void _N_()
|
264 | {
|
265 | _left();
|
266 | _right();
|
267 | _updown();
|
268 | }
|
269 |
|
270 | void _O_()
|
271 | {
|
272 | _left();
|
273 | _right();
|
274 | _up();
|
275 | _down();
|
276 | }
|
277 |
|
278 | void _P_()
|
279 | {
|
280 | _left();
|
281 | _up();
|
282 | _horizontal();
|
283 | segC();
|
284 | }
|
285 |
|
286 | void _Q_()
|
287 | {
|
288 | _O_();
|
289 | segR();
|
290 | }
|
291 |
|
292 | void _R_()
|
293 | {
|
294 | _P_();
|
295 | segR();
|
296 | }
|
297 |
|
298 | void _S_()
|
299 | {
|
300 | _uhd();
|
301 | segH();
|
302 | segD();
|
303 | }
|
304 |
|
305 | void _T_()
|
306 | {
|
307 | _up();
|
308 | _vertical();
|
309 | }
|
310 |
|
311 | void _U_()
|
312 | {
|
313 | _L_();
|
314 | _right();
|
315 | }
|
316 |
|
317 | void _V_()
|
318 | {
|
319 | _left();
|
320 | _downup();
|
321 | }
|
322 |
|
323 | void _W_()
|
324 | {
|
325 | _left();
|
326 | _right();
|
327 | segT();
|
328 | segR();
|
329 | }
|
330 |
|
331 | void _X_()
|
332 | {
|
333 | _updown();
|
334 | _downup();
|
335 | }
|
336 |
|
337 | void _Y_()
|
338 | {
|
339 | segK();
|
340 | segN();
|
341 | segS();
|
342 | }
|
343 |
|
344 | void _Z_()
|
345 | {
|
346 | _up();
|
347 | _down();
|
348 | _downup();
|
349 | }
|
350 |
|
351 | void _SPACE_()
|
352 | {
|
353 | segClear();
|
354 | }
|
355 |
|
356 | void _0_()
|
357 | {
|
358 | _O_();
|
359 | _downup();
|
360 | }
|
361 |
|
362 | void _1_()
|
363 | {
|
364 | _vertical();
|
365 | _down();
|
366 | segA();
|
367 | }
|
368 |
|
369 | void _2_()
|
370 | {
|
371 | _uhd();
|
372 | segC();
|
373 | segG();
|
374 | }
|
375 |
|
376 | void _3_()
|
377 | {
|
378 | _uhd();
|
379 | _right();
|
380 | }
|
381 |
|
382 | void _4_()
|
383 | {
|
384 | _right();
|
385 | _horizontal();
|
386 | segH();
|
387 | }
|
388 |
|
389 | void _5_()
|
390 | {
|
391 | _S_();
|
392 | }
|
393 |
|
394 | void _6_()
|
395 | {
|
396 | _G_();
|
397 | segU();
|
398 | }
|
399 |
|
400 | void _7_()
|
401 | {
|
402 | _up();
|
403 | _downup();
|
404 | }
|
405 |
|
406 | void _8_()
|
407 | {
|
408 | _uhd();
|
409 | _left();
|
410 | _right();
|
411 | }
|
412 |
|
413 | void _9_()
|
414 | {
|
415 | _uhd();
|
416 | _right();
|
417 | segH();
|
418 | }
|
419 |
|
420 | void _AT_()
|
421 | {
|
422 | _right();
|
423 | _up();
|
424 | _down();
|
425 | segG();
|
426 | segU();
|
427 | segS();
|
428 | }
|
429 |
|
430 | void _STR_()
|
431 | {
|
432 | _vertical();
|
433 | _X_();
|
434 | }
|
435 |
|
436 |
|
437 | void _ALL_()
|
438 | {
|
439 | _8_();
|
440 | _STR_();
|
441 |
|
442 | }
|
443 |
|
444 |
|
445 | void alphaTest()
|
446 | {
|
447 | int save = textSpeed;
|
448 | textSpeed = 100;
|
449 | say("abCDEFGhijklmnopqrstuvwxyz @ * 0123456789");
|
450 | textSpeed = save;
|
451 | }
|
452 |
|
453 | void string2Segment(char strng[])
|
454 | {
|
455 | char current = ' ';
|
456 | for (int i = 0; i < strlen(strng);i++)
|
457 | {
|
458 |
|
459 | current = strng[i];
|
460 |
|
461 | char2Segment(current);
|
462 |
|
463 | for (int ti = 0; ti < textSpeed;ti++)
|
464 | {
|
465 | _delay_ms(1);
|
466 | }
|
467 |
|
468 |
|
469 | }
|
470 |
|
471 | segClear();
|
472 |
|
473 | }
|
474 |
|
475 | void char2Segment(char character)
|
476 | {
|
477 | segClear();
|
478 | character = strlwr(character);
|
479 | switch (character)
|
480 | {
|
481 | case 'a': _A_();
|
482 | break;
|
483 |
|
484 | case 'b': _B_();
|
485 | break;
|
486 |
|
487 | case 'c': _C_();
|
488 | break;
|
489 |
|
490 | case 'd': _D_();
|
491 | break;
|
492 |
|
493 | case 'e': _E_();
|
494 | break;
|
495 |
|
496 | case 'f': _F_();
|
497 | break;
|
498 |
|
499 | case 'g': _G_();
|
500 | break;
|
501 |
|
502 | case 'h': _H_();
|
503 | break;
|
504 |
|
505 | case 'i': _I_();
|
506 | break;
|
507 |
|
508 | case 'j': _J_();
|
509 | break;
|
510 |
|
511 | case 'k': _K_();
|
512 | break;
|
513 |
|
514 | case 'l': _L_();
|
515 | break;
|
516 |
|
517 | case 'm': _M_();
|
518 | break;
|
519 |
|
520 | case 'n': _N_();
|
521 | break;
|
522 |
|
523 | case 'o': _O_();
|
524 | break;
|
525 |
|
526 | case 'p': _P_();
|
527 | break;
|
528 |
|
529 | case 'q': _Q_();
|
530 | break;
|
531 |
|
532 | case 'r': _R_();
|
533 | break;
|
534 |
|
535 | case 's': _S_();
|
536 | break;
|
537 |
|
538 | case 't': _T_();
|
539 | break;
|
540 |
|
541 | case 'u': _U_();
|
542 | break;
|
543 |
|
544 | case 'v': _V_();
|
545 | break;
|
546 |
|
547 | case 'w': _W_();
|
548 | break;
|
549 |
|
550 | case 'x': _X_();
|
551 | break;
|
552 |
|
553 | case 'y': _Y_();
|
554 | break;
|
555 |
|
556 | case 'z': _Z_();
|
557 | break;
|
558 |
|
559 | case ' ': _SPACE_();
|
560 | break;
|
561 |
|
562 | case '*': _STR_();
|
563 | break;
|
564 |
|
565 | case '@': _AT_();
|
566 | break;
|
567 |
|
568 | case '0': _0_();
|
569 | break;
|
570 |
|
571 | case '1': _1_();
|
572 | break;
|
573 |
|
574 | case '2': _2_();
|
575 | break;
|
576 |
|
577 | case '3': _3_();
|
578 | break;
|
579 |
|
580 | case '4': _4_();
|
581 | break;
|
582 |
|
583 | case '5': _5_();
|
584 | break;
|
585 |
|
586 | case '6': _6_();
|
587 | break;
|
588 |
|
589 | case '7': _7_();
|
590 | break;
|
591 |
|
592 | case '8': _8_();
|
593 | break;
|
594 |
|
595 | case '9': _9_();
|
596 | break;
|
597 |
|
598 | default: _ALL_();
|
599 | break;
|
600 | }
|
601 | }
|
602 |
|
603 | void bin2segment()
|
604 | {
|
605 |
|
606 | if (PINA & (1<<PB7))
|
607 | {
|
608 | PlexItBaby();
|
609 | }
|
610 | else
|
611 | {
|
612 | if (PINA != 0b00000000)
|
613 | {
|
614 | char2Segment(PINA);
|
615 | }
|
616 | else
|
617 | {
|
618 | segClear();
|
619 | }
|
620 | }
|
621 |
|
622 | }
|
623 |
|
624 |
|
625 | void PlexItBaby()
|
626 | {
|
627 | segClear();
|
628 |
|
629 | switch (PINA)
|
630 | {
|
631 | case 0b10000000: segA();
|
632 | break;
|
633 |
|
634 | case 0b10000001: segB();
|
635 | break;
|
636 |
|
637 | case 0b10000010: segC();
|
638 | break;
|
639 |
|
640 | case 0b10000011: segD();
|
641 | break;
|
642 |
|
643 | case 0b10000100: segE();
|
644 | break;
|
645 |
|
646 | case 0b10000101: segF();
|
647 | break;
|
648 |
|
649 | case 0b10000110: segG();
|
650 | break;
|
651 |
|
652 | case 0b10000111: segH();
|
653 | break;
|
654 |
|
655 | case 0b10001000: segK();
|
656 | break;
|
657 |
|
658 | case 0b10001001: segM();
|
659 | break;
|
660 |
|
661 | case 0b10001010: segN();
|
662 | break;
|
663 |
|
664 | case 0b10001011: segP();
|
665 | break;
|
666 |
|
667 | case 0b10001100: segR();
|
668 | break;
|
669 |
|
670 | case 0b10001101: segS();
|
671 | break;
|
672 |
|
673 | case 0b10001110: segT();
|
674 | break;
|
675 |
|
676 | case 0b10001111: segU();
|
677 | break;
|
678 |
|
679 | default: _ALL_();
|
680 | break;
|
681 | }
|
682 | }
|