Advertisement
Guest User

Untitled

a guest
May 24th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.58 KB | None | 0 0
  1. #include "Base.h"
  2. #include "lcd.h"
  3. #include "teclat.h"
  4. volatile int32_t teclas=0;
  5. volatile int32_t numA=0,numB=0, operacio = 0,cont=0;
  6. volatile char pantalla[16], operand;
  7.  
  8. void initTeclat(void){
  9. /*int32_t i;
  10.     for(i=0;i<=3;i++){
  11.  
  12.     //PD0..PD3 a Open Drain
  13.                 GPIOD->MODER=(GPIOE->MODER)|(BIT(2*i+1));
  14.                 GPIOD->MODER=(GPIOE->MODER)&(~BIT(2*i));
  15.  
  16.                 GPIOD->OTYPER=(GPIOE->OTYPER)|(BIT(i));
  17.  
  18.                 GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i));
  19.                 GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i+1));
  20.  
  21.                 GPIOD->PUPDR=(GPIOE->PUPDR)&(~BIT(2*i));
  22.                 GPIOD->PUPDR=(GPIOE->PUPDR)&(~BIT(2*i+1));
  23.  
  24.     //PD6..PD9 a Pull-Up
  25.  
  26.                 GPIOD->MODER=(GPIOE->MODER)&(~BIT(2*i+8));
  27.                 GPIOD->MODER=(GPIOE->MODER)&(~BIT(2*i+9));
  28.  
  29.                 GPIOD->OTYPER=(GPIOE->OTYPER)&(~BIT(i+8));
  30.  
  31.                 GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i+8));
  32.                 GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i+9));
  33.  
  34.                 GPIOD->PUPDR=(GPIOE->PUPDR)|(BIT(2*i+8));
  35.                 GPIOD->PUPDR=(GPIOE->PUPDR)&(~BIT(2*i+9));
  36.     }*/
  37.     GPIOD->MODER |= 0x55;
  38.             GPIOD->MODER &= ~0xAA;
  39.             GPIOD->MODER &= ~((0xFF)<<12);
  40.             GPIOD->OTYPER|= 0xF;
  41.             //podriem ficar aqui les entrades en push pull pero ja esta per defecte
  42.             GPIOD->PUPDR |= ((0x55)<<12);
  43.             GPIOD->PUPDR &= ~((0xAA)<<12);
  44. }
  45. int32_t llegirTeclat(void){
  46.  
  47.         int32_t tecla=32;
  48.         int32_t auxiliar,i;
  49.         for(i = 0; i <=3; i++){ //FILES
  50.             //EXPLICAR A LA MEMORIA COM FUNCIONA. CAS QUE CLIQUEM DOS TECLES (AGAFA LA DE LA FILA MÉS AL FINAL, I SI CLICO DOS TECLES DE LA MATEIXA FILA
  51.             //NO EM RETORNA RES, JA QUE NO ESTÀ ALS if's I PER TANT CONTINUA ENVIANT tecla=32),ETC...
  52.             DELAY_US(100);
  53.             GPIOD->ODR |= 0xF;
  54.             DELAY_US(100);
  55.             GPIOD->ODR &= ~(1<<i);
  56.             DELAY_US(100);
  57.             auxiliar= GPIOD->IDR;
  58.             DELAY_US(100);
  59.             auxiliar= (auxiliar>>6);
  60.             auxiliar= (auxiliar)&0xF;
  61.             if(auxiliar==14||auxiliar==13||auxiliar==11){
  62.                 tecla = (i<<2)+((~(auxiliar>>1))&0x3);
  63.             }else if(auxiliar==7){
  64.                 tecla = (i<<2)+0x3;
  65.             }
  66.         }
  67.  
  68.         return tecla;
  69.  
  70.     }
  71. //Amb aquest mètode convertim a caràcter el numero polsat per poder imprimirlo al LCD
  72. char findcaracter(int32_t num){
  73.     if(num==32){
  74.         return 'E';
  75.     }else{
  76.     char tecla[16]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
  77.     return tecla[num];
  78.     }
  79.  
  80.  
  81. }
  82.  
  83.  
  84. void intConfigTeclat(void){
  85.         GPIOD->MODER |= 0x55;
  86.         GPIOD->MODER &= ~0xAA;
  87.         GPIOD->OTYPER|= 0xF;
  88.         //GPIOD->BSRR.H.clear=0xF;
  89.         GPIOD->ODR &= ~0xF;
  90.         (SYSCFG->EXTICR[1])&=(~(0x33))<<8;
  91.         (SYSCFG->EXTICR[1])|=(0x33)<<8;
  92.         (SYSCFG->EXTICR[2])&=~(0x33);
  93.         (SYSCFG->EXTICR[2])|=(0x33);
  94.  
  95.         (EXTI ->IMR) |=(0xF)<<6;
  96.         (EXTI ->FTSR) |=(0xF)<<6;//FLANC DE BAIXADA
  97.         (EXTI ->PR) |=(0xF)<<6;
  98.  
  99.         nvicEnableVector(EXTI9_5_IRQn,CORTEX_PRIORITY_MASK(STM32_EXT_EXTI5_9_IRQ_PRIORITY));
  100.  
  101.         teclas=32;
  102.         int32_t continuar,resul;
  103.         while(1){
  104.             while(teclas==32);
  105.  
  106.             //char numero = findcaracter(teclas);
  107.             //LCD_SendChar(numero);
  108.             LCD_ClearDisplay();
  109.             DELAY_US(40);
  110.             continuar=calculadora(teclas);
  111.             LCD_SendString(pantalla);
  112.             if(continuar){
  113.                 resul=feroperacio(numA,numB,operand);
  114.                         //RESULTAT PER PANTALLA
  115.                         char snum[30];
  116.                         itoa(resul, snum, 10);
  117.                         LCD_GotoXY(0,1);
  118.                         LCD_SendString(snum);
  119.                         operacio=0;
  120.             }
  121.  
  122.  
  123.  
  124.             //SLEEP_MS(500);
  125.             //LCD_ClearDisplay();
  126.             DELAY_US(80);
  127.         teclas =32;
  128.         }
  129.  
  130.  
  131. }
  132. CH_IRQ_HANDLER((EXTI9_5_IRQHandler)){
  133.      CH_IRQ_PROLOGUE();
  134.      //(EXTI ->IMR) |=(0xF)<<6;
  135.      (EXTI ->IMR) &= ~(0xF)<<6;
  136.  
  137.          //GPIOD->ODR |= 0xF;
  138.      teclas=llegirTeclat();
  139.  
  140.          GPIOD->ODR &= ~(0xF);
  141.  
  142.  
  143.      (EXTI->PR) |= (0xF)<<6;
  144.      (EXTI ->IMR) |=(0xF)<<6;
  145.      CH_IRQ_EPILOGUE();
  146.  }
  147.  
  148. int32_t calculadora(int32_t i){
  149.     //A=+, D=-, *=x, #=resultat, C=clear
  150.     int32_t endavant = 0, numentrat;
  151.  
  152.     if (!operacio){
  153.         if((findcaracter(i)!='A')&&(findcaracter(i)!='D')&&(findcaracter(i)!='*')&&(findcaracter(i)!='C')){
  154.  
  155.             numentrat=findnum(i);
  156.             pantalla[cont]=findcaracter(i);
  157.  
  158.             numA=numA*10+numentrat;
  159.         }else{
  160.  
  161.             if(findcaracter(i)=='A'){
  162.                 pantalla[cont]='+';
  163.             }
  164.             else if(findcaracter(i)=='D'){
  165.                 pantalla[cont]='-';
  166.             }
  167.             else if(findcaracter(i)=='*'){
  168.                 pantalla[cont]='x';
  169.             }
  170.             if(findcaracter(i)!='C'){
  171.             operand=findcaracter(i);
  172.             operacio=1;
  173.             }
  174.             else{//RESET
  175.                 numA=0;
  176.                 numB=0;
  177.                 operacio=0;
  178.                 cont=-1; /*ACHTUNG! El cont ha de estar a -1 ja que el final d'aquest metode tinc un cont=cont+1.
  179.                 Per tant si el posu a 0, cont=cont+1=1 i començaré fent pantalla[1]. Però a pantalla[0] tenia un 0. I no podré printar per el LCD pq el metode
  180.                 LCD_SendString para de printar quan troba un 0. És a dir, en el cas que cont=0 tindré pantalla={0,numeroactual, numeroanterior,...}.
  181.                 Si poso cont=-1 tindre pantalla={0,..} i quan el torni a posar tindre pantalla={numeroactual, ....}*/
  182.                 int32_t refresh=0;
  183.                 for(refresh=0;refresh<16;refresh++){
  184.                 pantalla[refresh]=0; /*Faig un for ple de 0*/
  185.                 }
  186.             }
  187.         }
  188.     }else{
  189.  
  190.         if(findcaracter(i)!='#'){
  191.             numentrat=findnum(i);
  192.  
  193.             pantalla[cont]=findcaracter(i);
  194.         numB=numB*10+numentrat;
  195.         }else{
  196.             endavant = 1;
  197.  
  198.         }
  199.  
  200.     }
  201.     cont=cont+1;
  202.  
  203.  
  204.     return endavant;
  205. }
  206.  
  207. int32_t feroperacio(int32_t i, int32_t j, char op){
  208.     int32_t resultat=0;
  209.     if(op=='A'){
  210.     resultat =i+j;
  211.     }
  212.     else if(op=='D'){
  213.         resultat =i-j;
  214.         }
  215.     else if(op=='*'){
  216.         resultat =i*j;
  217.         }
  218.  
  219.     return resultat;
  220. }
  221.  
  222. //Aquest mètode el que fa és descodificar la tecla polsada, ja que cuan llegim una tecla al llegirTelcat ens torna la lletra polsada codificada
  223. int32_t findnum(int32_t num){
  224.     if(num==32){
  225.         return 0;
  226.     }
  227.     int32_t tecla[16]={1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};
  228.     return tecla[num];
  229.  
  230.  
  231.  
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement