/* * Pulsmatare.c * * Created: 2015-04-13 14:33:40 * Author: digpi09 */ #include #include #include unsigned char letter; unsigned int pulse; int checkButton() { if(PINC & (1 << 0)) { //if button is pressed return 1; } return 0; } void pulseCountReady() { //Installations for 8-bit timer on T0: TCCR0 = 0x00; //Stops counter TCNT0 = 0xFF; //Setting 8-bit counter to read mode. TCNT0 = 0x00; //Clears counter } void resetCounter() { TCCR0 = 0x00; //Stops counter TCNT0 = 0x00; //Clears counter } void timerReady() { //Installations for 16-bit timer on T1: TCCR1A = 0x00; //Normal port operation for 16-bit timer TCCR1B = 0x00; //Stops timer TCNT1H = 0x67; //Setting the 16-bit timer to 26473 (bit 8-15) TCNT1L = 0x69; //Setting the 16-bit timer to 26473 (bit 0-7) TIMSK = 0x04; //Enabling overflow interrupt TIFR = 0x04; //Enabling overflow interrupt } void resetTimer() { TCCR1B = 0x00; //Stops timer TCNT1H = 0x67; //Setting the 16-bit timer to 26473 (bit 8-15) TCNT1L = 0x69; //Setting the 16-bit timer to 26473 (bit 0-7) } void startTimer() { TCCR1B = 0x05; //Enables clock source, sets prescaler to 1024 } void startCounter() { TCCR0 = 0x07; //Starts counter } ISR(TIMER1_OVF_vect) { //When interruption occurs after 10 seconds: pulse = TCNT0*6; //Saves pulse per minute PORTB &= ~_BV(PB4); //Turns off green LED resetTimer(); resetCounter(); pulseToDisplay(pulse); } void numberHandler(int number) { if(number == 0){ writeLetter(0x30); } if(number == 1){ writeLetter(0x31); } if(number == 2){ writeLetter(0x32); } if(number == 3){ writeLetter(0x33); } if(number == 4){ writeLetter(0x34); } if(number == 5){ writeLetter(0x35); } if(number == 6){ writeLetter(0x36); } if(number == 7){ writeLetter(0x37); } if(number == 8){ writeLetter(0x38); } if(number == 9){ writeLetter(0x39); } } void pulseToDisplay(int pulse) { //Writes pulsemessage and pulse on display pulseMessage(); //Writes pulsemessage "Din puls är:" int ten; int temp = pulse/100; if (temp > 0 ) { numberHandler(temp); //Writes the first number of pulse if it exists ten = pulse -100*temp; } else { ten = pulse; } temp = ten/10; numberHandler(temp); //Writes the first/(second) number of pulse temp = ten - temp*10; numberHandler(temp); //Writes the second/(third) number of pulse } void clear() { //Clear display and return cursor to home EHigh(); PORTA = _BV(PA0); ELow(); } void writeReady() { //Prepare to write text PORTD = PORTD | _BV(PD7); //Sets E to 1 PORTD = PORTD | _BV(PD5); //Sets RS to 1 } void writeLetter(char letter) { //Writes a letter writeReady(); PORTA=letter; ELow(); } void pulseMessage() { //Writes text before pulsenumber: "Din puls är:" writeLetter(0x44); //D _delay_us(10); writeLetter(0x69); //i _delay_us(10); writeLetter(0x6E); //n _delay_us(10); writeLetter(0x20); // _delay_us(10); writeLetter(0x70); //p _delay_us(10); writeLetter(0x75); //u _delay_us(10); writeLetter(0x6C); //l _delay_us(10); writeLetter(0x73); //s _delay_us(10); writeLetter(0x20); // _delay_us(10); writeLetter(0xE1); //ä _delay_us(10); writeLetter(0x72); //r _delay_us(10); writeLetter(0x3A); //: _delay_us(10); } void ELow() { PORTD &= ~_BV(PD7); //Sets E to 0 } void EHigh() { PORTD = _BV(PD7); //Sets E to 1 } void RSLow() { PORTD &= ~_BV(PD5); //Sets RS to 0 } void RSHigh() { PORTD = _BV(PD5); //Sets RS to 1 } void RWLow() { PORTD &= ~_BV(PD6); //Sets RW to 0 } void RWHigh() { PORTD = _BV(PD6); //Sets RW to 1 } void systemOn() { //Installations for the system DDRA = 0xFF; //Sets all to outgoing DDRD = 0xE0; //Sets D5-D7 to outgoing DDRB = 0x10; //Sets B4 to outgoing DDRC &= DDRC | ~_BV(PC0); //Sets C0 to ingoing EHigh(); PORTA = 0x38; //Function Set on ELow(); EHigh(); PORTA = 0x0F; //Cursor on ELow(); sei(); //Enables interruptions timerReady(); pulseCountReady(); clear(); } int main(void) { systemOn(); while(1) { if(checkButton()==1) { clear(); //Clears display PORTB = PORTB | _BV(PB4); //Turns green LED on startTimer(); //Starts timer startCounter(); //Starts counter } } }