| PicManía by RedRaven |
Búsqueda personalizada
|
|
PROYECTOS
: TECLADO MATRICIAL
4x4 |
|
|
|
Teclado Matricial 4 x 4 con Driver Analógico |
| Primera
Parte: |
|
Objetivo: Leer un
teclado matricial de 4 x 4 teclas mediante un único pin del PIC. Y con esto completamos el documento de
Microchip poniéndole valores a lo propuesto por los amables señores de
nuestro proveedor favorito. |
| Segunda
Parte: |
|
|
| void main(void){ int16 ANval; int16 ANval_Acumuleitor=0; int16 ANVal_Result; int16 ANVAL_Minimun=255; int8 CAN_count=0; int8 CAN_maxcount=32; setup_adc_ports(AN0 | VSS_VDD); // Configuro AN0 para lectura ADC, usando como referencia VSS y VDD setup_adc(ADC_CLOCK_INTERNAL); // Configuro velocidad de muestreo la interna del PIC 2-6 us set_adc_channel(0); // Configuro siguiente canal de lectura a AN0; do{ ANVal = read_adc(); // Leo canal ACD y guardo en ANVal ANval_Acumuleitor += ANVal; // Acumulo sucesivas lecturas sobre ANval_Acumuleitor if(++Can_Count==CAN_maxcount){ // Si hago mas de CAN_maxcount lecturas ... ANVal_Result = (int16) ANval_Acumuleitor/CAN_maxcount; // Calculo la media de las lecturas realizadas ... if(ANVal_Result>ANVAL_Minimun){ // Que si resulta mayor que ANVAL_Minimun ... printf("KeyScan %Lu\r\n",ANVal_Result); // La tomo en consideración, en este caso lo muestro, ya haremos la conversión a teclas por margen. } Can_Count=0; // Reinicio Can_Count, el contador de lecturas. ANval_Acumuleitor=0; // Reinicio ANval_Acumuleitor, el acumulador de lecturas. } }while(1); } |
||
|
|
| Tercera
Parte: |
|
En la
Primera Parte discutíamos la
configuración teórica del cómo podríamos leer un teclado matricial 4x4
mediante un único canal de conversión Analógico-Digital: |
| int16 ANval; int16 ANval_Acumuleitor=0; int16 ANVal_Result; int8 CAN_count=0; int8 NumKeys=0; int8 NumKeysMinimun=0; int8 Keys[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int8 Key_Pressed=0; int8 Key_Previous=0; const int16 ANVAL_Minimun=255; const int8 CAN_maxcount=64; const int8 NumKeysForValidKey=15; const int8 NumKeysForDepressed=25; const int8 WideForKey=5; const int16 KeyValues[17]={0,310,318,329,339,445,460,486,508,551,574,614,650,698,736,803,855}; const char KeySimbols[17]={'\0','A','B','C','D','3','6','9','u','2','5','8','X','1','4','7','0'}; void main(void){ setup_adc_ports(AN0 | VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); do{ task_Analog_Keyboard(); } } void task_Analog_Keyboard(void){ int1 flag_Depressed=0; int8 i; ANVal = read_adc(); // Leo canal ACD y guardo en ANVal ANval_Acumuleitor += ANVal; // Acumulo sucesivas lecturas sobre ANval_Acumuleitor if(++Can_Count==CAN_maxcount){ // Si hago mas de CAN_maxcount lecturas ... ANVal_Result = (int16) ANval_Acumuleitor/CAN_maxcount; // Calculo la media de las lecturas realizadas ... if(ANVal_Result>ANVAL_Minimun){ // Que si resulta mayor que ANVAL_Minimun ... for(i=1;i<17;i++){ if(ANVal_Result>(KeyValues[i]-WideForKey) AND ANVal_Result<(KeyValues[i]+WideForKey)){ // Si el valor está dentro del margen de error ~ WideForKey if(++Keys[i]==NumKeysForValidKey){ Key_Pressed=i; // Si alcanzo NumKeysForValidKey marco definitivamente Key_Pressed for(i=0;i<17;i++){Keys[i]=0;} // Limpio los acumulados de Keys hasta el momento break; // Aborto ejecución del bucle para tomar en cuenta la tecla pulsada. } } } } else{ // Si es menor que ANVAL_Minimun estoy en Key_Depressed if(++Keys[0]==NumKeysForDepressed){ if(flag_Depressed==0) flag_Depressed=1; // Si alcanzo NumKeysForDepressed marco definitivamente Key_Depressed } } Can_Count=0; // Reinicio Can_Count, el contador de lecturas. ANval_Acumuleitor=0; // Reinicio ANval_Acumuleitor, el acumulador de lecturas. // Si tengo una Key_Pressed y no es igual a la última Key_Pressed y ya he detectado que he soltado la telca // tomo en consideración los resultados obtenidos: son válidos y estables. if((Key_Pressed!=0) AND (Key_Pressed!=Key_Previous) AND flag_Depressed==1){ printf("Key = %2u Symbol=%c\r\n",Key_Pressed,KeySimbols[Key_Pressed]); // Aqui tenemos disponibles los valores de Key pulsada y/o Simbolo asociado flash_BUZZER(1,50); Key_Previous=Key_Pressed; // Asigno valor actual de tecla al anterior para evitar repeticiones Key_Pressed=0; // Limpio valor actual para seguir investigando teclas pulsadas. } if(flag_Depressed==1){ // Si recibo estado definitivo de Key_Depressed ... flag_Depressed=0; // Marco como leido dicho estado ... Key_Previous=0; // Reinicio valor anterior de tecla pulsada Key_Previous } } } |
||
El resultado el que os mostré mas arriba.![]() Seguro, estable, fiable y confiable. Hasta otra. |
Esta página se modificó el 27/12/2008
|