Table of Contents

Digit E/S avec la Carte d'Etude

La Carte d'Etude “Basique” comprend 3 sorties (LED) et 3 entrées (microswitch). Les LED sont connectées aux PORTC[3..5] et les switches aux PORTC[0..2].

Cet exemple simple montre comment basculer sur les LED quand on appuie sur le switch approprié.

Schéma de connexion

Exemple de code C

/* Labor 1 example
 
Description: Example works with Studyboard Basic v3
Press S1 - LED1 goes ON; S2 - LED2 goes ON; S3 - LED3 goes ON
LED = 0 (ON)  	LED = 1 (OFF)
S= 0 (ON) 	S= 1 (OFF)
PORT direction: 1-output	0-input 
 
Author: Raivo Sell 2008
*/
 
#include <avr/io.h>
 
//Definitions for easier bit manipulations
#define SET(x) |= (1<<x)  //bit high in port x
#define CLR(x) &=~(1<<x)  //bit low in port x
 
int main(void) { //main program
 
    DDRC  = 0x38;  // DDRC  0bXX111000
    PORTC = 0x3F;  // PORTC 0bXX111111
 
	//endless loop
	while(1) {
		// if button is pressed (pin is low)
		if (bit_is_clear(PINC, 0))	//Switch S1
			PORTC CLR(3); //LED 1 ON
		else if (bit_is_clear(PINC, 1))//Switch S2
			PORTC CLR(4); //LED 2 ON
		else if (bit_is_clear(PINC, 2))//Switch S3
			PORTC CLR(5); //LED 3 ON
		else // If nothing is pressed
			PORTC=0xFF;		//All LEDs OFF (LED=1)
	}
}

Exemple (version courte)

/* Lab 1 example
Author: Maido Hiiemaa
Date: 2009
*/
 
#include <avr/io.h>
 
int main(void) {
     DDRC  = 0x38;  //  (00111000)
     while(1) {
        PORTC &= ~((PINC << 3) | 0xC7 ); // zeros
	PORTC |= ((PINC << 3) & ~0xC7 ); // ones
        }
}

Elimination du //bouncing//

Source : tutoriel de Micah Carrick

#include <avr/io.h>
#include <util/delay.h>
 
#define BUTTON_PORT PORTC       /* PORTx - nupu register */
#define BUTTON_PIN PINC         /* PINx - nupu sisendi register */
#define BUTTON_BIT PC0          /* nupu sisend/väljund bit */
 
int button_is_pressed()
{
        /* button is on when BIT is low (0) */
        if (bit_is_clear(BUTTON_PIN, BUTTON_BIT))
        {
                _delay_ms(25); /* de-bouncing delay time */
                if (bit_is_clear(BUTTON_PIN, BUTTON_BIT)) return 1;
        }
 
        return 0;
}
 
int main (void){
 
        /* switch on internel pull-ups */
        BUTTON_PORT |= _BV(BUTTON_BIT);
        if (button_is_pressed()){
                        //  do somthing
                        // wait if needed
        }
}