#include #include #include #include #include #include "Dflash.h" #define t1 50 #define begin { #define end } #define record 1 #define playback 2 #define store 3 #define read 4 #define size 1500 #define LCDwidth 16 //characters unsigned char flag=0; unsigned char state=5; unsigned int counter=0; unsigned char key, butnum; unsigned char play; unsigned char pressed1=0, pressed = 0; //unsigned char sounddata[size]; unsigned char test; unsigned char sample; unsigned char activebuffer=0; unsigned char wait=1; unsigned int i; unsigned int buffercounter=0; unsigned int pagecounter=0; unsigned int pagereadcount=0; //RXC ISR variables unsigned char r_index; //current string index unsigned char r_buffer[17]; //input string unsigned char r_ready; //flag for receive done unsigned char r_char; //current character //TX empth ISR variables unsigned char t_index; //current string index unsigned char t_buffer[17]; //output string unsigned char t_ready=1; //flag for transmit done unsigned char t_char; //current character unsigned char t_len; char lcd_buffer[17]; //unsigned char testarray[264]; //unsigned char testarray2[264]; unsigned int p=0; unsigned char readflag=1; unsigned int loop=0; unsigned char storedata=0b11001100; unsigned int length=0; unsigned int state_counter =0; unsigned int tracknumber=0, maxtrack=0; unsigned char flag1=1; char stringtrack[2]; unsigned int trackarray[20]; void puts_int(void); void gets_int(void); void enableDataFlash(void); void disableDataFlash(void); void bufferfull(void); void startWriteBuffer(void); void memtoBuffer(void); void receivefromBuffer(void); void transmit(void); interrupt [TIM0_COMP] void timer0_compare(void) begin // OCR0 = 100; wait = 0; if (counter>0) counter--; if(state == store){ if(state_counter++ < 264){ WriteBufferDF(state_counter, ADCH, activebuffer); ADCSR.6=1; } else{ if(activebuffer==1) { activebuffer=0; WriteBufferToPageDF(loop, 1); } else { activebuffer=1; WriteBufferToPageDF(loop, 0); } state_counter=0; loop++; } } else if(state == read){ if(p<264){ PORTD = ~ReadBufferDF(p++, activebuffer); } else{ if((PINB.2 == 0) && (OCR0 <=45)) OCR0 = OCR0 + 2; if ((PINB.3 == 0) && (OCR0 >= 20)) OCR0 = OCR0 - 2; readflag =1; } // interrupt disabled, SPI port enabled, master mode, MSB first, SPI mode 3, Fcl/4 //SPCR = 0x5C; } end interrupt [TIM2_OVF] void timer2_overflow(void) begin OCR2 = play; end void main(void) { DDRC =0xff; ADMUX = 0b00100000; ADCSR = 0b11000110; DDRB = 0xB0; // SPI Port initialisation // SCK, MISO, MOSI, CS, LED, WP , RDYBSY, RST // PB7, PB6, PB5, PB4, PB3, PB2 , PB1, PB0 // O I O O O O I O // 1 0 1 1 1 1 0 1 PORTB = 0xFF; // all outputs high, inputs have pullups (LED is off) DDRA = 0x00; //DDRB = 0xff; DDRD = 0xff; DDRC =0xff; // PORTC = 0x00; TIMSK=0b00000010; //turn on timer 0 cmp match ISR OCR0 = 31; //set the compare re to 250 time ticks OCR2=128; //prescalar to 8 and turn on clear-on-match TCCR0=0b00001011; // TCCR2 = 0b01101001; SPSR.0 = 0; DFlashInit(); #asm .equ __lcd_port=0x15 #endasm #asm sei #endasm lcd_init(LCDwidth); //initialize the display lcd_clear(); //clear the display lcd_gotoxy(4,1); //print next stuff at position 7, line 2 lcd_putsf("Welcome"); //string from flash //endless loop to read keyboard while(1) { if(counter == 0) { counter = 200; if(state==5) { if(PINB.2 == 0) { if(tracknumber > 1) tracknumber--; delay_ms(50); } if(PINB.3 == 0) { if((tracknumber < maxtrack) && (tracknumber <20)) tracknumber++; delay_ms(50); } } if(state != read){ if((PINB.0 == 0) && (state != store)){ lcd_clear(); //clear the display lcd_gotoxy(4,1); //print next stuff at position 7, line 2 lcd_putsf("recording"); OCR0 = 31; tracknumber = maxtrack; loop=trackarray[tracknumber]+1; state_counter=0; state = store; flag1 = 0; // PORTC = 0b11110000; } else if(PINB.0 == 0){ state = store; length = loop; flag1 = 0; // PORTC = 0b00001111; } else if(flag1==0) { tracknumber++; maxtrack = tracknumber; trackarray[tracknumber] = length; flag1=1; } else { lcd_clear(); //clear the display lcd_gotoxy(1,0); //print next stuff at position 7, line 2 if(tracknumber==0) { lcd_putsf("None recorded"); } else { lcd_putsf("Current Track"); lcd_gotoxy(8,1); itoa(tracknumber, stringtrack); lcd_puts(stringtrack); } delay_ms(500); state = 5; // PORTC = 0b11001100; } } if((PINB.1 == 0) && (state != read)) { ADCSR.6=0; lcd_clear(); //clear the display lcd_gotoxy(4,1); //print next stuff at position 7, line 2 lcd_putsf("play"); loop=trackarray[tracknumber-1];; activebuffer=0; // PORTC =0b10000001; delay_ms(1000); state = read; } else if (PINB.1 == 0){ state = 5; lcd_clear(); //clear the display lcd_gotoxy(1,0); //print next stuff at position 7, line 2 if(tracknumber==0) { lcd_putsf("None recorded"); } else { lcd_putsf("Current Track"); lcd_gotoxy(8,1); itoa(tracknumber, stringtrack); lcd_puts(stringtrack); } delay_ms(500); } } if((readflag==1) && (state == read)){ if(loop == trackarray[tracknumber-1]){ GetPageToBufferDF(loop++, activebuffer); activebuffer = 1 - activebuffer; delay_ms(20); } activebuffer = 1 - activebuffer; readflag = 0; loop++; GetPageToBufferDF(loop, 1-activebuffer); p=0; if(loop == (trackarray[tracknumber]-1)){ state = 5; } } } // end while } //end main