Autor Tema: Entrada de valores por teclado en C  (Leído 3085 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Entrada de valores por teclado en C
« en: 20 de Septiembre de 2009, 09:16:07 »
Cordial saludo.
Tengo una duda y que por mi poca experiencia en C no he podido aclararme, tengo el siguiente código para leer un teclado hexadecimal:

Código: C
  1. /* KEY.C */
  2. #include "derivative.h" /* include peripheral declarations */
  3.  
  4. #define COL1_OFF() PTB_PTB0=1; DDRB_DDRB0 = 1
  5. #define COL2_OFF() PTB_PTB1=1; DDRB_DDRB1 = 1  
  6. #define COL3_OFF() PTB_PTB2=1; DDRB_DDRB2 = 1
  7. #define COL4_OFF() PTB_PTB3=1; DDRB_DDRB3 = 1
  8. #define FILA1() !PTA_PTA0  
  9. #define FILA2() !PTA_PTA1
  10. #define FILA3() !PTA_PTA2
  11. #define FILA4() !PTA_PTA3
  12. #define NRO_FILAS     4
  13. #define NRO_COLUMNAS  4
  14. #define Buzzer_On() PTA_PTA4=1;DDRA_DDRA4=1
  15. #define Buzzer_Off()PTA_PTA4=0;DDRA_DDRA4=1
  16. char teclaPress;
  17. char ValorReal;
  18. char keySt; //variable de estados de teclado
  19. #define KEY_DUMMY   0
  20. #define KEY_TST_Fi  1
  21. #define KEY_WAIT_F  5
  22.  
  23. const char teclado[NRO_FILAS][NRO_COLUMNAS]={ //Teclado Matricial 4x4
  24.   '1','2','3','A',
  25.   '4','5','6','B',
  26.   '7','8','9','C',
  27.   '*','0','#','D',
  28. };
  29.  
  30. const char Valortecla[NRO_FILAS][NRO_COLUMNAS]={ //Teclado Matricial 4x4
  31.   1,2,3,'A',
  32.   4,5,6,'B',
  33.   7,8,9,'C',
  34.   '*',0,'#','D',
  35. };
  36.  
  37. typedef void (*vFuncPtrV)(void);
  38.  
  39. #define KEY_UP    'A'
  40. #define KEY_DW    'B'
  41. #define KEY_ENTER 'C'
  42. #define KEY_ESC   'D'
  43.  
  44.  
  45. #define ENABLE_COL_1() PTB_PTB0=0; DDRB_DDRB0 = 1           //Columnas como salidas
  46. #define ENABLE_COL_2() PTB_PTB1=0; DDRB_DDRB1 = 1
  47. #define ENABLE_COL_3() PTB_PTB2=0; DDRB_DDRB2 = 1
  48. #define ENABLE_COL_4() PTB_PTB3=0; DDRB_DDRB3 = 1                                                             // Macros y Funciones definiones de pines  Filas y Columnas
  49.  
  50. #define ENABLE_FILA_1() DDRA_DDRA0=0; PTAPUE_PTAPUE0=1      //Filas como entradas
  51. #define ENABLE_FILA_2() DDRA_DDRA1=0; PTAPUE_PTAPUE1=1
  52. #define ENABLE_FILA_3() DDRA_DDRA2=0; PTAPUE_PTAPUE2=1
  53. #define ENABLE_FILA_4() DDRA_DDRA3=0; PTAPUE_PTAPUE3=1
  54.  
  55.  
  56. static void Col1_ON(void){
  57.   ENABLE_COL_1();  
  58. }
  59. static void Col2_ON(void){
  60.   ENABLE_COL_2();
  61. }
  62. static void Col3_ON(void){
  63.   ENABLE_COL_3();
  64. }
  65. static void Col4_ON(void){
  66.   ENABLE_COL_4();
  67. }
  68. static void Enable_Filas(void){
  69.   ENABLE_FILA_1();
  70.   ENABLE_FILA_2();
  71.   ENABLE_FILA_3();
  72.   ENABLE_FILA_4();
  73. }
  74.  
  75. const  vFuncPtrV ColsPtr[NRO_COLUMNAS]={
  76.   Col1_ON,Col2_ON,Col3_ON,Col4_ON
  77. };
  78.  
  79. static void Cols_OFF(void){
  80.   Enable_Filas();  
  81.   COL1_OFF();
  82.   COL2_OFF();
  83.   COL3_OFF();
  84.   COL4_OFF();
  85. }
  86.  
  87. static char Test_Filas(void){
  88.   if(FILA1()) return 1;
  89.   if(FILA2()) return 2;
  90.   if(FILA3()) return 3;
  91.   if(FILA4()) return 4;
  92.   return 0;      
  93. }
  94.  
  95. void Antirrebote(void){
  96.          
  97. }
  98. void Key_Init(void){ //Funcion de Inicializacion de Teclado
  99.   keySt = KEY_TST_Fi;
  100. }
  101. void Key_Run(void){ // Funcion de Ejecucion de Teclado
  102. static char nroColTst=0;
  103.   Cols_OFF();
  104.   Enable_Filas();
  105.   ColsPtr[nroColTst]();
  106.       if  (Test_Filas()){
  107.         teclaPress = teclado[Test_Filas()-1][nroColTst];  
  108.         Buzzer_On();
  109.         ValorReal=Valortecla[Test_Filas()-1][nroColTst];
  110.         keySt=51;
  111.       }else{
  112.          
  113.       nroColTst++;
  114.       nroColTst %=NRO_COLUMNAS;
  115.       Buzzer_Off();
  116.       Cols_OFF();
  117.       keySt=50;
  118.      
  119.       }
  120. }

Este código junto con el LCD.H y el main hacen que cuando teclee un número me salga en la pantalla y corra un dígito a la derecha, la duda es como hago para formar un valor numérico con los dígitos que valla presionando?..me explico, si tecleo 1234 quiero que el valor en una variable sea 1.234(en decimal) o si entro el valor 150 la variable quede con valor 150.

Gracias por la ayuda que me puedan brindar.

Saludos

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Entrada de valores por teclado en C
« Respuesta #1 en: 20 de Septiembre de 2009, 19:58:04 »
Gracias a nuestro amigo Ariel de Ucontrol por su valiosa respuesta a mi inquietud.



Tiene solucion! Grin

Arrancas con "valor = 0"

Cada vez que presionas una tecla, haces "valor = valor * 10 + numero ingresado"

Eso deberia servir para numeros de cualquier cantidad de digitos....a medida que los vas ingresando, multiplicas por 10 y sumas lo ultimo ingresado. Al finalizar, tendras el numero correcto, ya que el primero ingresado habra sido multiplicado por 10 "n" veces, el segundo "n-1" veces, etc hasta el ultimo que no se ha multiplicado nunca, lo que es correcto ya que son las unidades.

Saludos! Grin


 

anything