Advertisement
AntonioVillanueva

Teclado Raspberry sistema fonia c

Jan 24th, 2017
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.04 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <wiringPi.h>
  6.  
  7. #define FILTRE 10000 //Antirebound touche
  8. #define INIC_LIGN 6 //limite dans gpios array fin colonnes debut lignes
  9. //GPIO style wiringPi ,pins lignes et colonnes
  10. #define ROW_A 29
  11. #define ROW_B 24
  12. #define ROW_C 23
  13. #define ROW_D 26
  14. #define ROW_E 22
  15. #define ROW_F 21
  16.  
  17. #define COL_1 27
  18. #define COL_2 25
  19. #define COL_3 28
  20.  
  21. char clavier[][3]={//retourne un char correspondante a la position dans le clavier
  22. {'X','0','T'},
  23. {'9','8','7'},
  24. {'6','5','4'},
  25. {'3','2','1'},                           
  26. {'E','+','-'},           
  27. {'C','B','A'}
  28. };
  29.  
  30. int gpios[]={ROW_A,ROW_B,ROW_C,ROW_D,ROW_E,ROW_F,COL_1,COL_2,COL_3};
  31.  
  32. void clear(){// Resest colonnes ,mise à zero pins colonnes
  33.     for (size_t col=INIC_LIGN;col<(sizeof(gpios)/sizeof(*gpios));col++){
  34.     digitalWrite(gpios[col],LOW);
  35.     }
  36. }
  37.  
  38. void setup(){//configuration pins lignes=entrees  et colonnes=sorties
  39.     printf ("setup keyboard\n");
  40.     wiringPiSetup();//wiring Pi methode
  41.     //wiringPiSetupGpio();//Broadcom GPIO pin numbers directly no re-mapping
  42.     //GPIO KEYBOARD  IN OUT PROGRAMING
  43.  
  44.     for (size_t i=0;i<(sizeof(gpios)/sizeof(*gpios));i++){
  45.         if (i<INIC_LIGN){pinMode(gpios[i],INPUT);
  46.             pullUpDnControl(gpios[i],PUD_DOWN);
  47.         }
  48.         else{pinMode(gpios[i],OUTPUT);}    
  49.     }
  50.     clear();
  51. }
  52.  
  53. char getTouche(){
  54.     char touche='\0';
  55.     for(size_t col=INIC_LIGN;col<(sizeof(gpios)/sizeof(*gpios));col++){
  56.  
  57.         clear();//Clear 3 colonnes ....
  58.         digitalWrite(gpios[col],HIGH);//Select une colonne 1 2 3
  59.         while (!digitalRead(gpios[col])){} //Attend l'etat vraiment à 1
  60.  
  61.         for (size_t ligne=0;ligne<INIC_LIGN;ligne++){//Cherche ligne selectionne 1
  62.            
  63.             if (digitalRead(gpios[ligne]) !=LOW){
  64.                 touche =clavier[ligne][col-6];
  65.                 }
  66.         }
  67.     }
  68.     return touche ;
  69. }
  70.  
  71. int main(){
  72.     char read='\0';//lecture touche courante
  73.     char dernier='\0';//memoire touche  
  74.     char mem='\0';//memoire touche
  75.     //string poste="";//Numero de poste en cours   
  76.     char poste[100]={0};
  77.     int cont=0;//filtre touche
  78.    
  79.     setup();//configure clavier phonie
  80.     clear();//Clear cols
  81.  
  82.     while (TRUE){      
  83.         read=getTouche();
  84.         if (read!=mem){cont=0;} //Nouvelle detection ,touche  differente a celle enregistre en mem
  85.    
  86.         if (cont>FILTRE && read==dernier && mem==dernier){cont=0;}//dernière touche encore enfoncée      
  87.         if (cont>FILTRE && read=='\0' && mem=='\0'){cont=0;dernier='\0';}//touche ...detection 0 encore
  88.  
  89.         if (read!='\0' && isdigit(read) &&  cont>FILTRE){
  90.             printf("%c\n",read);
  91.            
  92.             poste[strlen(poste)+1]=0;//End string
  93.             poste[strlen(poste)]=read;//new char read                      
  94.             dernier=read;
  95.             cont=0;}//affiche touche enfoncée
  96.        
  97.         if ((read=='E' || read=='T') &&  strlen(poste) && cont>FILTRE){
  98.             printf ("POSTE=%s\n",poste);
  99.             memset(&poste, 0, sizeof(poste));
  100.             dernier=read;
  101.             cont=0;}//ENTER ou TRANSFERT       
  102.            
  103.         if (read=='X' &&  cont>FILTRE){
  104.             printf("ANNULE\n");
  105.             memset(&poste, 0, sizeof(poste));
  106.             dernier=read;
  107.             cont=0;}//ENTER TRANSFERT      
  108.                
  109.         mem=read;
  110.         cont++; //Compteur filtre anti rebound         
  111.     }
  112.     return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement