Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Base.h"
- #include "lcd.h"
- #include "teclat.h"
- volatile int32_t teclas=0;
- volatile int32_t numA=0,numB=0, operacio = 0,cont=0;
- volatile char pantalla[16], operand;
- void initTeclat(void){
- /*int32_t i;
- for(i=0;i<=3;i++){
- //PD0..PD3 a Open Drain
- GPIOD->MODER=(GPIOE->MODER)|(BIT(2*i+1));
- GPIOD->MODER=(GPIOE->MODER)&(~BIT(2*i));
- GPIOD->OTYPER=(GPIOE->OTYPER)|(BIT(i));
- GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i));
- GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i+1));
- GPIOD->PUPDR=(GPIOE->PUPDR)&(~BIT(2*i));
- GPIOD->PUPDR=(GPIOE->PUPDR)&(~BIT(2*i+1));
- //PD6..PD9 a Pull-Up
- GPIOD->MODER=(GPIOE->MODER)&(~BIT(2*i+8));
- GPIOD->MODER=(GPIOE->MODER)&(~BIT(2*i+9));
- GPIOD->OTYPER=(GPIOE->OTYPER)&(~BIT(i+8));
- GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i+8));
- GPIOD->OSPEEDR=(GPIOE->OSPEEDR)&(~BIT(2*i+9));
- GPIOD->PUPDR=(GPIOE->PUPDR)|(BIT(2*i+8));
- GPIOD->PUPDR=(GPIOE->PUPDR)&(~BIT(2*i+9));
- }*/
- GPIOD->MODER |= 0x55;
- GPIOD->MODER &= ~0xAA;
- GPIOD->MODER &= ~((0xFF)<<12);
- GPIOD->OTYPER|= 0xF;
- //podriem ficar aqui les entrades en push pull pero ja esta per defecte
- GPIOD->PUPDR |= ((0x55)<<12);
- GPIOD->PUPDR &= ~((0xAA)<<12);
- }
- int32_t llegirTeclat(void){
- int32_t tecla=32;
- int32_t auxiliar,i;
- for(i = 0; i <=3; i++){ //FILES
- //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
- //NO EM RETORNA RES, JA QUE NO ESTÀ ALS if's I PER TANT CONTINUA ENVIANT tecla=32),ETC...
- DELAY_US(100);
- GPIOD->ODR |= 0xF;
- DELAY_US(100);
- GPIOD->ODR &= ~(1<<i);
- DELAY_US(100);
- auxiliar= GPIOD->IDR;
- DELAY_US(100);
- auxiliar= (auxiliar>>6);
- auxiliar= (auxiliar)&0xF;
- if(auxiliar==14||auxiliar==13||auxiliar==11){
- tecla = (i<<2)+((~(auxiliar>>1))&0x3);
- }else if(auxiliar==7){
- tecla = (i<<2)+0x3;
- }
- }
- return tecla;
- }
- //Amb aquest mètode convertim a caràcter el numero polsat per poder imprimirlo al LCD
- char findcaracter(int32_t num){
- if(num==32){
- return 'E';
- }else{
- char tecla[16]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
- return tecla[num];
- }
- }
- void intConfigTeclat(void){
- GPIOD->MODER |= 0x55;
- GPIOD->MODER &= ~0xAA;
- GPIOD->OTYPER|= 0xF;
- //GPIOD->BSRR.H.clear=0xF;
- GPIOD->ODR &= ~0xF;
- (SYSCFG->EXTICR[1])&=(~(0x33))<<8;
- (SYSCFG->EXTICR[1])|=(0x33)<<8;
- (SYSCFG->EXTICR[2])&=~(0x33);
- (SYSCFG->EXTICR[2])|=(0x33);
- (EXTI ->IMR) |=(0xF)<<6;
- (EXTI ->FTSR) |=(0xF)<<6;//FLANC DE BAIXADA
- (EXTI ->PR) |=(0xF)<<6;
- nvicEnableVector(EXTI9_5_IRQn,CORTEX_PRIORITY_MASK(STM32_EXT_EXTI5_9_IRQ_PRIORITY));
- teclas=32;
- int32_t continuar,resul;
- while(1){
- while(teclas==32);
- //char numero = findcaracter(teclas);
- //LCD_SendChar(numero);
- LCD_ClearDisplay();
- DELAY_US(40);
- continuar=calculadora(teclas);
- LCD_SendString(pantalla);
- if(continuar){
- resul=feroperacio(numA,numB,operand);
- //RESULTAT PER PANTALLA
- char snum[30];
- itoa(resul, snum, 10);
- LCD_GotoXY(0,1);
- LCD_SendString(snum);
- operacio=0;
- }
- //SLEEP_MS(500);
- //LCD_ClearDisplay();
- DELAY_US(80);
- teclas =32;
- }
- }
- CH_IRQ_HANDLER((EXTI9_5_IRQHandler)){
- CH_IRQ_PROLOGUE();
- //(EXTI ->IMR) |=(0xF)<<6;
- (EXTI ->IMR) &= ~(0xF)<<6;
- //GPIOD->ODR |= 0xF;
- teclas=llegirTeclat();
- GPIOD->ODR &= ~(0xF);
- (EXTI->PR) |= (0xF)<<6;
- (EXTI ->IMR) |=(0xF)<<6;
- CH_IRQ_EPILOGUE();
- }
- int32_t calculadora(int32_t i){
- //A=+, D=-, *=x, #=resultat, C=clear
- int32_t endavant = 0, numentrat;
- if (!operacio){
- if((findcaracter(i)!='A')&&(findcaracter(i)!='D')&&(findcaracter(i)!='*')&&(findcaracter(i)!='C')){
- numentrat=findnum(i);
- pantalla[cont]=findcaracter(i);
- numA=numA*10+numentrat;
- }else{
- if(findcaracter(i)=='A'){
- pantalla[cont]='+';
- }
- else if(findcaracter(i)=='D'){
- pantalla[cont]='-';
- }
- else if(findcaracter(i)=='*'){
- pantalla[cont]='x';
- }
- if(findcaracter(i)!='C'){
- operand=findcaracter(i);
- operacio=1;
- }
- else{//RESET
- numA=0;
- numB=0;
- operacio=0;
- cont=-1; /*ACHTUNG! El cont ha de estar a -1 ja que el final d'aquest metode tinc un cont=cont+1.
- 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
- LCD_SendString para de printar quan troba un 0. És a dir, en el cas que cont=0 tindré pantalla={0,numeroactual, numeroanterior,...}.
- Si poso cont=-1 tindre pantalla={0,..} i quan el torni a posar tindre pantalla={numeroactual, ....}*/
- int32_t refresh=0;
- for(refresh=0;refresh<16;refresh++){
- pantalla[refresh]=0; /*Faig un for ple de 0*/
- }
- }
- }
- }else{
- if(findcaracter(i)!='#'){
- numentrat=findnum(i);
- pantalla[cont]=findcaracter(i);
- numB=numB*10+numentrat;
- }else{
- endavant = 1;
- }
- }
- cont=cont+1;
- return endavant;
- }
- int32_t feroperacio(int32_t i, int32_t j, char op){
- int32_t resultat=0;
- if(op=='A'){
- resultat =i+j;
- }
- else if(op=='D'){
- resultat =i-j;
- }
- else if(op=='*'){
- resultat =i*j;
- }
- return resultat;
- }
- //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
- int32_t findnum(int32_t num){
- if(num==32){
- return 0;
- }
- int32_t tecla[16]={1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};
- return tecla[num];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement