//**************************************************
//***
//*** 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 *****************/
Copyright © 2002-2006 SourceBoost Technologies