Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Re: Simulating a seven-segment display

Reply
Thread Tools

Re: Simulating a seven-segment display

 
 
luserXtrog
Guest
Posts: n/a
 
      07-03-2009
On Jul 2, 5:02*am, "lovecreatesbea...@gmail.c0m"
<lovecreatesbea...@gmail.com> wrote:
> On Jul 2, 5:31 pm, "lovecreatesbea...@gmail.c0m"
>
>
>
> <lovecreatesbea...@gmail.com> wrote:
> > $ cat a.c
> > /* a.c */

>
> > static const char segs[16][7 + 1] =
> > {
> > * * * * "ABCDEF ", /* 0 */
> > * * * * " BC * *", /* 1 */
> > * * * * "AB DE G", /* 2 */
> > * * * * "ABCD *G", /* 3 */
> > * * * * " BC *FG", /* 4 */
> > * * * * "A CD FG", /* 5 */
> > * * * * "A CDEFG", /* 6 */
> > * * * * "ABC * *", /* 7 */
> > * * * * "ABCDEFG", /* 8 */
> > * * * * "ABC *FG", /* 9 */
> > * * * * "ABC EFG", /* 0xA */
> > * * * * " *CDEFG", /* 0xB */
> > * * * * "A *DEF ", /* 0xC */
> > * * * * " BCDE G", /* 0xD */
> > * * * * "A *DEFG", /* 0xE */
> > * * * * "A * EFG", /* 0xF */

>
> > };

>
> > void lightup(char seg[5][3], const char c)
> > {
> > * * * * char i, *p;

>
> > * * * * if (c >= '0' && c <= '9') * * * i = c - '0';
> > * * * * else if (c >= 'A' && c <= 'Z') *i = c - 'A' + 10;
> > * * * * else if (c >= 'a' && c <= 'z') *i = c - 'a' + 10;

>
> * * * * else return;
>
>
>
> > * * * * p = segs[i];
> > * * * * while (*p){
> > * * * * * * * * switch(*p++){
> > * * * * * * * * case 'A':
> > * * * * * * * * * * * * seg[0][1] = '-';
> > * * * * * * * * * * * * break;
> > * * * * * * * * case 'B':
> > * * * * * * * * * * * * seg[1][2] = '|';
> > * * * * * * * * * * * * break;
> > * * * * * * * * case 'C':
> > * * * * * * * * * * * * seg[3][2] = '|';
> > * * * * * * * * * * * * break;
> > * * * * * * * * case 'D':
> > * * * * * * * * * * * * seg[4][1] = '-';
> > * * * * * * * * * * * * break;
> > * * * * * * * * case 'E':
> > * * * * * * * * * * * * seg[3][0] = '|';
> > * * * * * * * * * * * * break;
> > * * * * * * * * case 'F':
> > * * * * * * * * * * * * seg[1][0] = '|';
> > * * * * * * * * * * * * break;
> > * * * * * * * * case 'G':
> > * * * * * * * * * * * * seg[2][1] = '-';
> > * * * * * * * * * * * * break;
> > * * * * * * * * }
> > * * * * }

>
> > }

>
> > void showup(char seg[5][3], int lncnt, int clcnt)
> > {
> > * * * * int i, j;
> > * * * * for (i = 0; i != lncnt; i++){
> > * * * * * * * * for (j = 0; j != clcnt; j++){
> > * * * * * * * * * * * * printf("%c", seg[i][j]);
> > * * * * * * * * }
> > * * * * * * * * printf("\n");
> > * * * * }

>
> > }

>
> > void cleanup(char seg[5][3], int lncnt, int clcnt)
> > {
> > * * * * int i, j;
> > * * * * for (i = 0; i != lncnt; i++){
> > * * * * * * * * for (j = 0; j != clcnt; j++){
> > * * * * * * * * * * * * seg[i][j] = ' ';
> > * * * * * * * * }
> > * * * * }

>
> > }

>
> > #include <stdio.h>
> > int main(void)
> > {
> > * * * * char seg[5][3] =
> > * * * * {
> > * * * * * * * * " * ",
> > * * * * * * * * " * ",
> > * * * * * * * * " * ",
> > * * * * * * * * " * ",
> > * * * * * * * * " * "
> > * * * * };

>
> > * * * * lightup(seg, '8');
> > * * * * showup(seg, 5, 3);
> > * * * * cleanup(seg, 5, 3);
> > * * * * printf("\n");
> > * * * * lightup(seg, 'b');
> > * * * * showup(seg, 5, 3);

>
> > * * * * return 0;}

>
> > $

>
> It must be the worst piece in this thread though I spend a whole
> afternoon on this piece. Currently, it can't display multiple 7-seg
> digits on one line. Why I can't come up with code like Peter Nilsson's
> and luserXtrog's above. (how old are you two guys )
>
> Sigh.


I turn 31 this year.
I'm still in awe of Peter's code. It illustrates explicitly what
I had to do by intuition. That first enum is brilliant.

I think you should be able to extend this to display multiple
units per line. Try expanding the seg array out to the total
width, and adding an offset to i which increases by the width
of unit after each digit.

Sometimes a smoke/porn/tomb-raider break helps see it from a
different angle.

--
lxt
 
Reply With Quote
 
 
 
 
luserXtrog
Guest
Posts: n/a
 
      07-04-2009
On Jul 3, 1:02*am, luserXtrog <mijo...@yahoo.com> wrote:
> On Jul 2, 5:02*am, "lovecreatesbea...@gmail.c0m"
> (how old are you two guys )
>
> > Sigh.

>
> I turn 31 this year.
> I'm still in awe of Peter's code. It illustrates explicitly what
> I had to do by intuition. That first enum is brilliant.
>
> I think you should be able to extend this to display multiple
> units per line. Try expanding the seg array out to the total
> width, and adding an offset to i which increases by the width
> of unit after each digit.
>
> Sometimes a smoke/porn/tomb-raider break helps see it from a
> different angle.
>


Or all three. Here's my take 2, with garbage refusal:

#include <stdio.h>
#include <string.h>

int ao(int c) {
switch(c) {
case '0':return 0;
case '1':return 1;
case '2':return 2;
case '3':return 3;
case '4':return 4;
case '5':return 5;
case '6':return 6;
case '7':return 7;
case '8':return 8;
case '9':return 9;
case 'A':case 'a':return 10;
case 'B':case 'b':return 11;
case 'C':case 'c':return 12;
case 'D':case 'd':return 13;
case 'E':case 'e':return 14;
case 'F':case 'f':return 15;
default:return -1;
}
}

enum {
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3,
E = 1 << 4,
F = 1 << 5,
G = 1 << 6,
H = 1 << 7 };

int seg[] = {
/*0*/ A+B+C+D+E+F,
/*1*/ B+C,
/*2*/ A+B+ D+E+ G,
/*3*/ A+B+C+D+ G,
/*4*/ B+C+ F+G,
/*5*/ A+ C+D+ F+G,
/*6*/ A+ C+D+E+F+G,
/*7*/ A+B+C,
/*8*/ A+B+C+D+E+F+G,
/*9*/ A+B+C+ F+G,
/*A*/ A+B+C+ E+F+G,
/*b*/ C+D+E+F+G,
/*C*/ A+ D+E+F,
/*d*/ B+C+D+E+ G,
/*E*/ A+ D+E+F+G,
/*F*/ A+ E+F+G,
};

int print(char *s) {
int r;
for (r=0; r<3; r++) {
int i;
for (i=0; s[i]; i++) {
switch(r) {
case 0:
putchar(' ');
putchar( (seg[ao(s[i])] & A)? '_' : ' ');
putchar(' ');
break;
case 1:
putchar( (seg[ao(s[i])] & F)? '|' : ' ');
putchar( (seg[ao(s[i])] & G)? '_' : ' ');
putchar( (seg[ao(s[i])] & B)? '|' : ' ');
break;
case 2:
putchar( (seg[ao(s[i])] & E)? '|' : ' ');
putchar( (seg[ao(s[i])] & D)? '_' : ' ');
putchar( (seg[ao(s[i])] & C)? '|' : ' ');
break;
}
}
putchar('\n');
}
}

int main(int ac, char **av) {
for (++av,--ac;ac;ac--,av++) {
if (strspn(*av, "012345789abcdefABCDEF") != strlen(*av))
fprintf(stderr, "Hex only!\n");
else
print(*av);
}

return 0;
}

--
lxt
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Simulating a seven-segment display Felipe Ribeiro C Programming 16 07-22-2009 08:41 PM
Re: Simulating a seven-segment display lovecreatesbeauty@gmail.c0m C Programming 2 07-05-2009 11:31 AM
Simulating Bidirectional Pins - How is it displayed? Drew VHDL 1 07-26-2004 01:34 PM
Simulating VHDL design with ModelSim Modukuri VHDL 7 06-01-2004 08:07 PM
problem with simulating a program DG VHDL 3 10-11-2003 09:26 AM



Advertisments
 



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