1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| #include <stdio.h>
#define LED4 0xA0
#define LED5 0xB1
#define LED6 0xB2
#define LED7 0xB3
#define LED8 0xB4
#define LED9 0xB5
#define LED10 0xB6
#define LED11 0xB7
#define LED1 0xA3
#define LED2 0xA6
#define LED3 0xA7
#define MS_BOUNCE_DELAY 10
#define NB_MODE 3
typedef enum msg_info {INIT, FUNCTION_ERROR, MODE_ERROR} Msg;
static unsigned char mode= 0;
void set_led(unsigned char led_id) {
if ((led_id&0xa0)==0xa0)
PORTA|=(1<<(led_id&0x0f));
if ((led_id&0xb0)==0xb0)
PORTB|=(1<<(led_id&0x0f));
}
void clear_led(unsigned char led_id) {
if ((led_id&0xa0)==0xa0)
PORTA&=~(1<<(led_id&0x0f));
if ((led_id&0xb0)==0xb0)
PORTB&=~(1<<(led_id&0x0f));
}
void play_mode1(void)
{
unsigned char leds[]={LED4, LED5, LED6, LED7, LED8, LED9, LED10, LED11};
const unsigned char leds_size=sizeof(leds)/sizeof(leds[0]);
unsigned char i;
for (i= 0; i < leds_size; i++) {
set_led(leds[i]);
delay_ms(250);
clear_led(leds[i]);
}
}
void select_next_mode(void)
{
mode++;
mode= (mode % NB_MODE) + 1;
}
void alert(Msg info)
{
switch (info) {
case MODE_ERROR: clear_led(LED1);
case FUNCTION_ERROR: clear_led(LED2);
case INIT: clear_led(LED3);
}
delay_ms(250);
set_led(LED1); set_led(LED2); set_led(LED3);
delay_ms(250);
}
void welcome(void)
{
alert(INIT);
}
void play_mode2(unsigned ms_interdelay)
{
if (ms_interdelay > 250) {
alert(FUNCTION_ERROR);
return;
}
set_led(LED7);
delay_ms(ms_interdelay);
set_led(LED8);
delay_ms(ms_interdelay);
clear_led(LED7);
delay_ms(ms_interdelay);
set_led(LED7);
delay_ms(ms_interdelay);
clear_led(LED8);
delay_ms(ms_interdelay);
clear_led(LED7);
delay_ms(ms_interdelay);
}
void play_mode(void)
{
switch (mode) {
case 0:
welcome();
break;
case 1:
clear_led(LED3);
play_mode1();
set_led(LED3);
break;
case 2:
clear_led(LED2);
play_mode2(251);
set_led(LED2);
break;
default:
alert(MODE_ERROR);
}
}
void main() {
unsigned char donnee = 0b00000001;
TRISA = 0b00000010; //port A en sortie sauf RA1
PORTA = 0b11001000 ; //mettre les sorties à zéro sauf RA6, RA7,RA3
TRISB = 0b00000001; //port B en sortie sauf RB_0
PORTB = 0 ; //mettre les sorties à zéro
pcon.OSCF = 1; //configure le bit 3 du registre pcon pour 4 Mhz
CMCON = 0b00000111; //désactiver les comparateurs sur RA0
while (1) {
if (RB0_bit == 0) {
delay_ms(MS_BOUNCE_DELAY);
if (RB0_bit == 0)
select_next_mode();
}
play_mode();
}
} |