📄 asuro 020.c
字号:
unsigned char gucTm1NewRldVal;
unsigned char gucTm2IntCnt;
unsigned char gucNewKbdPlyTon;
unsigned char gucDmy;
unsigned char gucTonIdx1;
unsigned char gucTonIdx2;
unsigned char gucSngTonIdx;
bool gbDuaTonMod;
unsigned char gucNewPlyMod;
unsigned char gucCurPlyMod;
unsigned char gucPrvPlyMod;
//unsigned char gucKeyPlyMod;
unsigned char gucNewKeyPrs;
unsigned char gucPrvKeyPrs;
/*
unsigned char gucMusTonLst[NUMOF_MUSIC_TONES]={
// C Cis D Dis E F Fis G Gis A Ais B
0x02,
0x10,0x1D,0x2A,0x36,0x41,0x4C,0x56,0x60,0x68,0x71,0x79,0x80,
0x87,0x8E,0x95,0x9B,0xA0,0xA5,0xAB,0xAF,0xB4,0xB8,0xBC,0xC0,
0xC3
};
*/
unsigned char gucMusTonLst[NUMOF_MUSIC_TONES]={
// C Cis D Dis E F Fis G Gis A Ais B
0x03,
0x11,0x1E,0x2B,0x37,0x42,0x4D,0x57,0x61,0x69,0x72,0x7A,0x81,
0x88,0x8F,0x96,0x9C,0xA1,0xA6,0xAC,0xB0,0xB5,0xB9,0xBD,0xC1,
0xC4
};
unsigned char gucKeyBrdTonKey[21]={'a','s','e','d','r','f','g','y','h','u','j','i','k','l','p',';','[','\'','\\',0};
/*
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| 20 |
|------------------------------------------18------------|
| 17 |
|----------------------------------15--------------------|
| 13 |
|--------------------------12----------------------------|
| 10 |
|-------------------8------------------------------------| etc.
| 6 | 0x2A
|-----------5--------------------------------------------| 0x1D
| 3 | 0x10
|- -1- - - - - - - - - - - - - - - - - - - - - - - - - - | 0x02
| |
*/
unsigned char gucSg1[NUMOF_SONG1_TONES]= {
8,10,12,15,13,13,17,15,
15,20,19,20,15,12, 8,10,12,
13,15,17,15,13,12,10,12, 8,
7, 8,10, 3, 7,10,13,12,10,
12, 8,10,12,15,13,13,17,15,
15,20,19,20,15,12, 8,10,12,
5,15,13,12,10, 8, 3, 8, 7,
8,12,15,20,15,12, 8,12,15,
8, 8, 8,99,255};//unsigned char gucSg2[NUMOF_SONG1_TONES]= {1,3,5,8,6,6,10,8,8,13,12,13,8,5,1,3,5,6,8,10,8,6,5,3,5,1,0,1,3};
unsigned char gucSg2[NUMOF_SONG2_TONES]= {
99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,99,
3, 3, 7, 8, 8, 7, 8, 8,10,
12,12,10,12,12, 8, 5, 5, 8,
10,10, 7, 8, 8, 5,10,10, 1,
0, 0, 8,12,12,15,20,20,10,
0, 0, 0,99,255};//unsigned char gucSg2[NUMOF_SONG1_TONES]= {1,3,5,8,6,6,10,8,8,13,12,13,8,5,1,3,5,6,8,10,8,6,5,3,5,1,0,1,3};
//================================================================================
// MAIN
//================================================================================
int main(void){
//set dual-tone mode
gbDuaTonMod=true;
//init all ports as inputs and outputs
vInitAllPortsAsInputsAndOutputs();
//init tone to be played by keyboard
gucNewKbdPlyTon=0;
//init switches for use with interrupt
vInitSwitchesForUsingWithInterrupts();
//init timer/counter0, used for generating tones by left engine
vInitTimerCounter0();
//init timer/counter1, used for generating tones by right engine
vInitTimerCounter1();
//init timer/counter2, used for tone duration and tone sequence control
vInitTimerCounter2();
//general interrupt enable (start playing)
SFRX(SREG,GIE_H);
//define initial play mode
gucNewPlyMod=PLAY_MODE_SONG_PLAYING_INIT;
//set previous (dummy) play mode
gucPrvPlyMod=PLAY_MODE_SONG_PLAYING;
//init previous pressed key
gucPrvKeyPrs=KEY1;
//hang here
while(1){
//---check-for-new-state---//
//if a new statemachine is requested from outside (from switch interrupt)
if(gucNewPlyMod!=PLAY_MODE_NONE){
//get new play mode
gucCurPlyMod=gucNewPlyMod;
//clear new play mode
gucNewPlyMod=PLAY_MODE_NONE;
}
//analyse playmode
switch(gucCurPlyMod){
//----------play-mode:-song-playing-init----------//
//song playing init mode selected
case PLAY_MODE_SONG_PLAYING_INIT:
//define next play mode (define first, before enabling interrupt, due to this variable is checked in timer2 interrupt handler)
gucCurPlyMod=PLAY_MODE_SONG_PLAYING;
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//set odometers sense connections to output
SFRX(DDRGC,BOD_LFT_O|BOD_RGT_O);
//set odometers sense connections to low (leds off)
SFRX(PORTC,BOD_LFT_L|BOD_RGT_L);
//set odo-leds common connection to low
SFRX(PORTD,BOD_COM_L);
//init music playing
vInitMusicPlaying();
//exit case
break;
//----------play-mode:-song-playing-init----------//
//song playing mode selected
case PLAY_MODE_SONG_PLAYING:
//exit case
break;
//----------track-sensors----------//
//track sensors init selected
case PLAY_MODE_TRACK_SENSORS_INIT:
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//init engines for music playing without starting
vInitEnginesForMusicPlayingWithoutStart();
//enable tone0 and tone1 by enabling timer0/timer1interrupts (timer2 not needed)
SFRX(TIMSK,TOIE1_H|TOIE0_H);
//no start ad-conversion, non-free running
SFRX ( ADCSRA , ADEN_H | ADSC_L | ADFR_L | ADIF_L | ADIE_L | ADPS2_H | ADPS1_H | ADPS0_L );
//set odometers sense connections to output low (leds off)
SFRX(DDRGC,BOD_LFT_O|BOD_RGT_O);
SFRX(PORTC,BOD_LFT_L|BOD_RGT_L);
//set odo-leds common connection to low
SFRX(PORTD,BOD_COM_L);
//define next play mode
gucCurPlyMod=PLAY_MODE_TRACK_SENSORS;
//exit case
break;
//track sensors selected
case PLAY_MODE_TRACK_SENSORS:
//select ADC AVCC with external cap., select switches left-tracksensor (ADC3), left justify
SFRX ( ADMUX , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L | MUX2_L | MUX1_H | MUX0_H );
//start ad-conversion, non-free running
SFRX ( ADCSRA , ADSC_H ) ;
//wait here until ad-conversion has finished
while(SFRS(ADCSRA,ADSC_H));
//store measured adc light value into timer0
gucTm0CurRldVal=ADCH;
//select ADC AVCC with external cap., select switches right-tracksensor (ADC3), left justify
SFRX ( ADMUX , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L | MUX2_L | MUX1_H | MUX0_L );
//start ad-conversion, non-free running
SFRX ( ADCSRA , ADSC_H ) ;
//wait here until ad-conversion has finished
while(SFRS(ADCSRA,ADSC_H));
//store measured adc light value into timer0
gucTm1CurRldVal=ADCH;
//exit case
break;
case PLAY_MODE_ODO_SENSORS_INIT:
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//init engines for music playing without starting
vInitEnginesForMusicPlayingWithoutStart();
//enable tone0 and tone1 by enabling timer0/timer1interrupts (timer2 not needed)
SFRX(TIMSK,TOIE1_H|TOIE0_H);
//no start ad-conversion, non-free running
SFRX ( ADCSRA , ADEN_H | ADSC_L | ADFR_L | ADIF_L | ADIE_L | ADPS2_H | ADPS1_H | ADPS0_L );
//set odometers sense connections to input with no pullup
SFRX(DDRGC,BOD_LFT_I|BOD_RGT_I);
SFRX(PORTC,BOD_LFT_N|BOD_RGT_N);
//set odo-leds common connection to high (odo-tx leds on)
SFRX(PORTD,BOD_COM_H);
//define next play mode
gucCurPlyMod=PLAY_MODE_ODO_SENSORS;
//exit case
break;
case PLAY_MODE_ODO_SENSORS:
//select ADC AVCC with external cap., select switches left-tracksensor (ADC3), left justify
SFRX ( ADMUX , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L | MUX2_L | MUX1_L | MUX0_H );
//start ad-conversion, non-free running
SFRX ( ADCSRA , ADSC_H ) ;
//wait here until ad-conversion has finished
while(SFRS(ADCSRA,ADSC_H));
//store measured adc light value into timer0
gucTm0CurRldVal=ADCH;
//select ADC AVCC with external cap., select switches right-tracksensor (ADC3), left justify
SFRX ( ADMUX , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L | MUX2_L | MUX1_L | MUX0_L );
//start ad-conversion, non-free running
SFRX ( ADCSRA , ADSC_H ) ;
//wait here until ad-conversion has finished
while(SFRS(ADCSRA,ADSC_H));
//store measured adc light value into timer0
gucTm1CurRldVal=ADCH;
//exit case
break;
case PLAY_MODE_SYNTHESIZER1_INIT:
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//init engines for music playing without starting
vInitEnginesForMusicPlayingWithoutStart();
//enable timer0, timer1 and timer2
SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
//define next play mode
gucCurPlyMod=PLAY_MODE_SYNTHESIZER1;
//exit case
break;
case PLAY_MODE_SYNTHESIZER1:
//exit case
break;
case PLAY_MODE_SYNTHESIZER2_INIT:
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//init engines for music playing without starting
vInitEnginesForMusicPlayingWithoutStart();
//init timer/counter0 reload value
gucTm0CurRldVal=0x00;
//init timer/counter1 reload value
gucTm1CurRldVal=0x00;
//set odometers sense connections to output low (leds off)
SFRX(DDRGC,BOD_LFT_O|BOD_RGT_O);
SFRX(PORTC,BOD_LFT_L|BOD_RGT_L);
//set odo-leds common connection to low
SFRX(PORTD,BOD_COM_L);
//prepair timer2 interrupt handler to update reload values
gucTm2IntCnt=NUMOF_TIMER2_SYNTHESIZER2_INTERRUPTS-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -