Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <ctype.h>
- #include <wiringPi.h>
- #define FILTRE 10000 //Antirebound touche
- #define INIC_LIGN 6 //limite dans gpios array fin colonnes debut lignes
- //GPIO style wiringPi ,pins lignes et colonnes
- #define ROW_A 29
- #define ROW_B 24
- #define ROW_C 23
- #define ROW_D 26
- #define ROW_E 22
- #define ROW_F 21
- #define COL_1 27
- #define COL_2 25
- #define COL_3 28
- char clavier[][3]={//retourne un char correspondante a la position dans le clavier
- {'X','0','T'},
- {'9','8','7'},
- {'6','5','4'},
- {'3','2','1'},
- {'E','+','-'},
- {'C','B','A'}
- };
- int gpios[]={ROW_A,ROW_B,ROW_C,ROW_D,ROW_E,ROW_F,COL_1,COL_2,COL_3};
- void clear(){// Resest colonnes ,mise à zero pins colonnes
- for (size_t col=INIC_LIGN;col<(sizeof(gpios)/sizeof(*gpios));col++){
- digitalWrite(gpios[col],LOW);
- }
- }
- void setup(){//configuration pins lignes=entrees et colonnes=sorties
- printf ("setup keyboard\n");
- wiringPiSetup();//wiring Pi methode
- //wiringPiSetupGpio();//Broadcom GPIO pin numbers directly no re-mapping
- //GPIO KEYBOARD IN OUT PROGRAMING
- for (size_t i=0;i<(sizeof(gpios)/sizeof(*gpios));i++){
- if (i<INIC_LIGN){pinMode(gpios[i],INPUT);
- pullUpDnControl(gpios[i],PUD_DOWN);
- }
- else{pinMode(gpios[i],OUTPUT);}
- }
- clear();
- }
- char getTouche(){
- char touche='\0';
- for(size_t col=INIC_LIGN;col<(sizeof(gpios)/sizeof(*gpios));col++){
- clear();//Clear 3 colonnes ....
- digitalWrite(gpios[col],HIGH);//Select une colonne 1 2 3
- while (!digitalRead(gpios[col])){} //Attend l'etat vraiment à 1
- for (size_t ligne=0;ligne<INIC_LIGN;ligne++){//Cherche ligne selectionne 1
- if (digitalRead(gpios[ligne]) !=LOW){
- touche =clavier[ligne][col-6];
- }
- }
- }
- return touche ;
- }
- int main(){
- char read='\0';//lecture touche courante
- char dernier='\0';//memoire touche
- char mem='\0';//memoire touche
- //string poste="";//Numero de poste en cours
- char poste[100]={0};
- int cont=0;//filtre touche
- setup();//configure clavier phonie
- clear();//Clear cols
- while (TRUE){
- read=getTouche();
- if (read!=mem){cont=0;} //Nouvelle detection ,touche differente a celle enregistre en mem
- if (cont>FILTRE && read==dernier && mem==dernier){cont=0;}//dernière touche encore enfoncée
- if (cont>FILTRE && read=='\0' && mem=='\0'){cont=0;dernier='\0';}//touche ...detection 0 encore
- if (read!='\0' && isdigit(read) && cont>FILTRE){
- printf("%c\n",read);
- poste[strlen(poste)+1]=0;//End string
- poste[strlen(poste)]=read;//new char read
- dernier=read;
- cont=0;}//affiche touche enfoncée
- if ((read=='E' || read=='T') && strlen(poste) && cont>FILTRE){
- printf ("POSTE=%s\n",poste);
- memset(&poste, 0, sizeof(poste));
- dernier=read;
- cont=0;}//ENTER ou TRANSFERT
- if (read=='X' && cont>FILTRE){
- printf("ANNULE\n");
- memset(&poste, 0, sizeof(poste));
- dernier=read;
- cont=0;}//ENTER TRANSFERT
- mem=read;
- cont++; //Compteur filtre anti rebound
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement