Je profite du sujet pour exposer ma première tentative de librairie maison. j'ai bien le .c, le .h, le keywords.txt...
Ca ne veut pas compiler :
Mega_lcd_Keyb_debug.cpp.o: In function
loop': C:\DOCUME~1\FREEPO~1\LOCALS~1\Temp\build8396374676808604553.tmp/Mega_lcd_Keyb_debug.cpp:36: undefined reference to
kb_read()'
Mega_lcd_Keyb_debug.cpp.o: In functionsetup': C:\DOCUME~1\FREEPO~1\LOCALS~1\Temp\build8396374676808604553.tmp/Mega_lcd_Keyb_debug.cpp:28: undefined reference to
keyB_init()'
Je comprends pas, car c'est pas dans mes fichiers que ça coince... une histoire de public / private? Je ne veux pas utiliser les classes, ce n'est vraiment pas justifié ici.
la lib est assez simple, donc je mets tout ici :
le .h :
#include "WProgram.h"
// fonctions
void keyB_init();
uint8_t kb_read();
// variables
volatile uint8_t kb_available;
le .c
#include <MEGA_LCD_KB_debug.h>
#include "WProgram.h"
volatile uint8_t tbl_key[16] = {0xBE, 0x77, 0xB7, 0xD7, 0x7B, 0xBB, 0xDB, 0x7D, 0xBD, 0xDD, 0xE7, 0xEB, 0xED, 0xEE, 0xDE, 0x7E};
volatile uint8_t tbl_btn[5] = {0x1E, 0x1B, 0x1D, 0x17, 0x0F};
#define btn_nobtn 0x1F
#define debounce 100 // délai anti-rebond
#define max_key_buff 16
volatile uint8_t kb_key = kb_nokey;
volatile uint8_t kb_tmp;
volatile uint8_t kb_index;
volatile uint8_t kb_buffer[max_key_buff];
void keyB_init(){
DDRA = 0x07; // trois leds en sortie
DDRB &= 0xE0; // B4:0 input : 5 boutons
DDRK = 0xF0;
PORTB |= 0x1F;
PORTK = 0x0F; // pulup clavier 4 x 4
PCMSK2 = 0x0F; // active PCINT23:16
PCMSK0 = 0x1F; // active PCINT4:0
PCICR = 0x05; // active PCI2 et PCI0;
}
uint8_t kb_read(){ // lit la prochaine touche dans le buffer
static uint8_t kb_r_index;
uint8_t key_to_return;
if (kb_available){
kb_r_index++;
kb_r_index &= 0x0F; // assure la rotation de l'index
kb_available--;
key_to_return = kb_buffer[kb_r_index];
} else {
key_to_return = kb_nokey;
}
return(key_to_return);
}
// la suite, plein de fonctions internes, ISR etc etc...
le programme qui utilise la lib :
#include <LiquidCrystal.h>
#include <MEGA_LCD_KB_debug.h>
LiquidCrystal lcd(38, 39, 40, 41, 42, 43);
void setup() {
keyB_init();
lcd.clear();
}
void loop() {
if (kb_available){
lcd.setCursor(0,0);
lcd.print(kb_read(), HEX);
lcd.print(' ');
}
}