dice.c

Electronic dice sample code for PIC16C61 or PIC16F84 targets (by Peter Kalosi).



//**************************************************
//*** 
//***           Nice Electronic Dice
//***
//**************************************************
//
//
//   L1      L6
//
//   L2  L7  L5
//
//   L3      L4
//
//       ^
//       |
//   Leds position, top view
//   & connecting number to port PORTB

char cyk=0 ;     // waiting counter
char vsz=111;    // assistant counter for accidental event
                 // decrement it if button pressed
                 // if 0 reload to 252
char dsz;        // variable for accidental number (0..17) effective 1..6
                 // use for generating output pattern
char mm;         // beep sequence displacement
                 // 0 - wait for accidental event
                 // 2 - show accidental event
char sz2=2;
char tmp;        // temporary variable
char sz1=0;      // asisstant counter for running light 
char index=0;    // assign switched on LED with "k1" block 
char istat=0;    // internal multi-choice function programed prescaler
char hang=0;     // beep FRQ 0 - off; 1 - frq1; 2 - frq2=2*frq1
char zene;       // beep sequence pointer
char hh;         // beep duration

const char k1[] = { 11111101b,        // Running lights on Leds
                    11111011b,        // after pushed button
                    11110111b,        // 0 is turn on LED
                    01111111b,        // shape is assigned with "index"
                    10111111b,
                    11011111b,
                    11101111b,
                    01111111b };

                                      // number patterns for LEDs output 
const char k2[] = { 01111111b,        // 1
                    11011011b,        // 2
                    00110111b,        // 3
                    10100101b,        // 4
                    00100101b,        // 5
                    10000001b,        // 6

                    01111111b,        // 1
                    10110111b,        // 2
                    01101101b,        // 3
                    10100101b,        // 4
                    00100101b,        // 5
                    10000001b,        // 6

                    01111111b,        // 1
                    11101101b,        // 2
                    01011011b,        // 3
                    10100101b,        // 4
                    00100101b,        // 5
                    10000001b   };    // 6        

const char nota[] = { 1,40,1,35,      // beep sequence
                      0,15,0,15,
                      2,45,1,25,
                      0,15,0,20,
                      1,40,2,35,
                      0,110,0,15,
                      0,110,2,25,
                      0,110,0,20 };

void interrupt( void )
{

    if(INTCON & 0100b)                 // INT source: timer
    {
        if (++istat & 01b)
        {
            if(++sz1 == 41 ) { sz1=0; if (++index == 8) index=0; };
        }
        else
        {
            if (--hh == 0)
            {
                if (++zene  >= 8) zene=0;
                tmp=4*zene+mm;
                hang=nota[tmp];
                hh=nota[++tmp];
            };
        };
        if ((istat & 0111111b) == 01001b) cyk--;
        if(hang==1)
        {
            if(istat & 1) set_bit(PORTA,1);
            else clear_bit(PORTA,1);
        };
        if(hang==2)
        {
            if(istat & 2) set_bit(PORTA,1);
            else clear_bit(PORTA,1);
        };
        clear_bit( INTCON, T0IF );
    }
    else
                                       // externel interrupt                       
    {
        istat=0;
        cyk=35;
                                       // enable button scan for accidental event
                                       // regenerating from sleep
        clear_bit( INTCON, INTE );
        clear_bit( INTCON, INTF );
                                       // disable external interrupt
    };
}

main()
{
//    set_bit( STATUS, RP0 );   --- in actual version not necessary
    TRISA=0xFF;
    TRISB=0xFF;
                                       // no output genereted
    OPTION_REG = 00000000b;
                                       // pull-ups enabled
                                       // INTR sensitive for falling edge    
                                       // internal clock souce for timer
                                       // prescaler 1:2 to timer  
//    clear_bit( STATUS, RP0 );
    TMR0=0;

    while(1)                           // main cycle
    {
        while( cyk )
        {
            mm=0;
            if (!(PORTB & 01b)) {
                                    cyk=35;
                                    vsz--;
                                    if ( vsz==0 ) vsz=252;
                                };
            PORTB=k1[index];
                                       // through button scan running lights
        };
        while ( (hh>1) && (INTCON & 00100000b) ) PORTB=0xFF;
                                       // wait for ending beep
                                       // LEDs turn off
        mm=2;
        dsz= vsz % 18;
        cyk= 65;
        clear_bit( INTCON, INTF );
        while (cyk && (INTCON & 00100000b) )
            {
              if (index<6) PORTB=k2[dsz]; else PORTB=0xFF;
              if ( INTCON  & 00000010b ) break;
            };
        while ( (hh>1) && (INTCON & 00100000b) );
        clear_bit( INTCON,GIE );
        clear_bit( INTCON,T0IE );
        set_bit( INTCON, INTE );
        PORTB=0xFF;
//        set_bit( STATUS, RP0 );
        TRISA=0xFF;
        TRISB=0xFF;
//        clear_bit( STATUS, RP0 );
        set_bit( INTCON,GIE );
        sleep();                        // low power 
        clear_bit( STATUS,GIE );
//        set_bit( STATUS, RP0 );
        TRISB=0x01;
        TRISA=011111101b;
//        clear_bit( STATUS, RP0 );
        set_bit( INTCON,T0IE );         // enable interrupt from timer
        set_bit( INTCON,GIE );
    }
}

/****************          EOF        *****************/



http://www.sourceboost.com/home.html

Copyright © 2002-2006 SourceBoost Technologies