16SegmentDriver.c


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
}