Manejar teclado matricial y mostrar en lcd

Muchas gracias D@rkbytes,
El post es el #283 donde dejaste los archivos para el manejo del teclado en ensamblador. Es lo que quiero modificar para el pic16f883. En principio solo cambie el pic, pero no funciono.
Disculpa realmente estoy iniciando.
 

Adjuntos

  • Teclado Matricial.rar
    49.8 KB · Visitas: 43
Última edición:
El post es el #283 donde dejaste los archivos para el manejo del teclado en ensamblador. Es lo que quiero modificar para el pic16f883. En principio solo cambie el pic, pero no funciono.
OK. Ese programa es para un PIC16F877A, no para un PIC16F887, por eso no lo encontré. :rolleyes:
Lo que traté fue adaptar el proyecto de un post muy anterior de D@rkbytes que esta en assembler y que funcionaba perfecto con un pic16f887
Prueba ahora con las correspondientes modificaciones a ese programa para trabajar con un PIC16F883.

Suerte.
 

Adjuntos

  • 16F883 Teclado Matricial 4x4.rar
    34.4 KB · Visitas: 53
Buenas tardes, me encuentro haciendo unas simulaciones de mi tesis, para la cual decidí usar la pantalla y el teclado por el puerto D, debido a la cantidad de interrupciones que necesito y debido a que también utilizare un modulo bluetooh y necesito el port C casi por completo.

Mi primer inconveniente sucedió cuando quise normalmente unir el teclado y la pantalla sin mucho lió en el portd. Sucedía que el barrido del teclado chocaba con el de la pantalla y se hacia un lió todo.

Lo arregle pasando el E, RS y RW al port E. Listo, ya funciona bien la pantalla y el barrido.

Ahora tengo el problema de que el teclado, conectándolo comúnmente como lo hacia en el portB no me lee los números en sus respectivos lugares. Donde debería haber un 4 pone un 6 y así sucesivamente, y no son problemas de que esta invertida las conexiones, ya revise, todo esta bien, y cambiando de lugar los cables, se pone peor!.

Alguna sugerencia o ayuda?
 
Ahora tengo el problema de que el teclado, conectándolo comúnmente como lo hacia en el portB no me lee los números en sus respectivos lugares. Donde debería haber un 4 pone un 6 y así sucesivamente, y no son problemas de que esta invertida las conexiones, ya revise, todo esta bien, y cambiando de lugar los cables, se pone peor!.

¿Alguna sugerencia o ayuda?
Si mencionas que no tienes invertidas las conexiones, es necesario que adjuntes tu programa con simulación.

Te podría indicar el siguiente ejemplo para el puerto C Teclado 3x4 en PORTC y cambiarlo al puerto D
Pero no mencionas en que lenguaje programas.
 
Buenas tardes,

Me gustaría que me colaboraran con este tema que he venido trabajando ya hace varias semanas y no he logrado aun. En los proyectos que he utilizado siempre he conectado el teclado por el puerto B a un pic 18F4550 y ha funcionado correctamente. Pero ahora necesito conectarlo por el puerto D del mismo pic, he utilizado varias librerías y hecho lo que dicen muchos tutoriales pero nada ha funcionado aun, si alguien ha realizado ya este ejercicio le agradecería inmensamente de su colaboración.

esta es la librería que estoy utilizando:
Código:
////////////////////////////////////////////////////////////////////////////////////
//                                   KBD.C                                        //
//               FUNCIONES PARA ESCANEO DE UN TECLADO MATRICIAL                   //
//                         4X4 HEXADECIMAL, EN EL PORTB                           //
//       kbd_init()       Debe ser invocada antes que las otras funciones.         //
//       c=lcd_getc(c)    Si há sido presionada una tecla devuelve el caracter c    //
//                  y lo salva en el char c, sino se presiona una tecla       //
//                  retorna el valor /0, esta función puede invocarse         //
//                  frecuentemente para no perder teclas pulsadas.            //
//        NOTA: REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS     //
//               PINES DE COLUMNAS DE RB0(COL0) A RB3(COL3))                   //
//               PINES DE FILAS DE RB4(ROW0)) A RB7(ROW3))                    // 
//                  MODIF.: ING. FRANK GIRALDO - UD                       //
////////////////////////////////////////////////////////////////////////////////////
/*////////////////////////////////////////////////////////////////////////////////// 
*    RB0 RB1 RB2 RB3   
*     |   |   |   |
*     c0  c1  c2  c3  
*   | 1 | 2 | 3 | F | r0 - RB4
*   | 4 | 5 | 6 | E | r1 - RB5
*   | 7 | 8 | 9 | D | r2 - RB6
*   | A | 0 | B | C | r3 - RB7
*
*   COLUMNS=OUTs
*   ROWS=INs
*   SE HABILITAN PULL-UP INTERNAS 
*   SE REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS 
*
*///////////////////////////////////////////////////////////////////////////////////
//
#byte portkbd = 0XF83                  //portkbd = portD
//Keypad connection:   (Column 0 es B0)
//                Bx:
#define COL0 (0 << 0)
#define COL1 (0 << 1)
#define COL2 (0 << 2)
#define COL3 (0 << 3)
#define ROW0 (1 << 4)
#define ROW1 (1 << 5)
#define ROW2 (1 << 6)
#define ROW3 (1 << 7)
#define ALL_ROWS (ROW3|ROW2|ROW1|ROW0)
#define ALL_PINS (ALL_ROWS|COL3|COL2|COL1|COL0)

char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'*','0','#','D'}};

#define KBD_DEBOUNCE_FACTOR 1.2
// Modifique el valor de temporización antirrebote con (KBD_DEBOUNCE_FACTOR = n/333),
// en donde n es el número de veces por segundo en los que ud. invoca
//la función kbd_getc().
//

void kbd_init(){
}

char kbd_getc( )
{
   static BYTE kbd_call_count;
   static short int kbd_down;
   static char last_key;
   static BYTE col;
   BYTE kchar;
   BYTE row;
   //port_d_pullups(TRUE);
   kchar='\0';

   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR)
   {
       switch (col)
       {
         case 0   : set_tris_d(ALL_PINS&~COL0);
                    portkbd=(0b1110);
                    break;

         case 1   : set_tris_d(ALL_PINS&~COL1);
                    portkbd=(0b1101);
                    break;

         case 2   : set_tris_d(ALL_PINS&~COL2);
                    portkbd=(0b1011);
                    break;

         case 3   : set_tris_d(ALL_PINS&~COL3);
                    portkbd=(0b0111);
                    break;
       }

       if(kbd_down)
       {
         if((portkbd & (ALL_ROWS))==(ALL_ROWS))
         {
           kbd_down=FALSE;
           kchar=last_key;
           last_key='\0';
         }
       }
       else
       {
          if((portkbd & (ALL_ROWS))!=(ALL_ROWS))
          {
             if((portkbd & ROW0) == 0)
               row = 0;
             else if((portkbd & ROW1) == 0)
               row = 1;
             else if((portkbd & ROW2) == 0)
               row = 2;
             else if((portkbd & ROW3) == 0)
               row = 3;
             last_key = KEYS[row][col];
             kbd_down = TRUE;
          }
          else
          {
             ++col;
             if(col==4)
             col=0;
          }
       }
      kbd_call_count=0;
   }
  kchar = last_key;
  set_tris_d(ALL_PINS);
  return(kchar);
}

/*char dato;
char tecla()
{
   dato=\'\\0\';
   while(dato==\'\\0\')
   {
      dato=kbd_getc();
      delay_ms(100);
   }
return dato;
} */
Y utilizando picc compiler este es el código que manejo en este momento:

Código:
#include <18F4550.h>
#include <KBD18FD.c>
#use delay(clock=20000000)
#fuses  NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,HS,CPD,NODEBUG
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=n)//n bit  seg //debe hacerse en ambos micros 877A

#define prender output_high   
#define apagar output_low
#define luz1 PIN_C1
#define luz2 PIN_C2
#define pulsador1 PIN_B0

#define LCD_DAT PIN_E0
#define LCD_E PIN_E2
#define LCD_CK PIN_E1
#include <LCD4x20_3PIN.c>

char daton;
long auxsegundos;
long segundos;


void un_digito()
{
   lcd_putc("\f");
   segundos=0;
   auxsegundos=0;
   do{
      daton=kbd_getc();
      lcd_putc(daton);
      delay_ms(60);
      if( daton !=0)
      {
         lcd_gotoxy(8,1);
         lcd_putc(daton); 
         delay_ms(1000);
         // daton=daton-0X30;
         auxsegundos=0;
         segundos=12;
      }
      auxsegundos ++;
      if(auxsegundos < 20)
      {
         auxsegundos = 0;
         segundos ++;
      }
   }while(segundos<12);
}
void main()
{
#zero_ram
set_tris_A(0x00);
set_tris_B(0x00);
set_tris_C(0x80);
set_tris_D(0xff);
set_tris_E(0x00); 


lcd_init();
kbd_init();

setup_comparator(No_analogs);
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

EXT_INT_edge(H_to_L);

output_A(0x00);
output_B(0x00);
output_C(0x00);
output_D(0x00);
output_E(0x00);

lcd_gotoxy(1,1);
lcd_putc("\fBIENVENIDO");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("\fPRUEBA1");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("\fPROTEUS");
delay_ms(500);
un_digito();
      
}
 
Última edición por un moderador:
Buenas tardes.
Me gustaría que me colaboraran con este tema que he venido trabajando ya hace varias semanas y no he logrado aun. En los proyectos que he utilizado siempre he conectado el teclado por el puerto B a un pic 18F4550 y ha funcionado correctamente. Pero ahora necesito conectarlo por el puerto D del mismo pic, he utilizado varias librerías y hecho lo que dicen muchos tutoriales pero nada ha funcionado aun, si alguien ha realizado ya este ejercicio le agradecería inmensamente de su colaboración.
Le hice algunas modificaciones a la librería 4x4 que estás usando para hacerla funcionar un poco mejor,
pero esa librería no puede trabajar conjuntamente con la pantalla por el mismo puerto.

Adjunto el proyecto con la librería modificada y el ejemplo con simulación.

Suerte.
 

Adjuntos

  • 18F4550 Teclado 4x4 en Puerto D.rar
    56.4 KB · Visitas: 64
hola a todos tengo un codigo que no logro comprender podrian ayudarme por favor.

me afloran muchas dudas.

Código:
char  keypadPort at PORTD;

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

char kp, contar=0;

void main(){

Keypad_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);


while (1){
 kp=0;
 do
  kp=Keypad_Key_Click();
 while (!kp);
 switch (kp){
  case  1: kp = 49; break;  // 1
  case  2: kp = 50; break;  // 2
  case  3: kp = 51; break;  // 3
  case  4: kp = 55; break;  // A
  case  5: kp = 52; break;  // 4
  case  6: kp = 54; break;  // 5
  case  7: kp = 55; break;  // 6
  case  8: kp = 52; break;  // B
  case  9: kp = 55; break;  // 7
  case 10: kp = 51; break;  // 8
  case 11: kp = 57; break;  // 9
  case 12: kp = 49; break;  // C
  case 13: kp = 42; break;  // *
  case 14: kp = 48; break;  // 0
  case 15: kp = 45; break;  // #
  case 16: kp = 49; break;  // D
 }
 Lcd_Chr_CP(kp);
 contar++;
 if (contar==10){
  contar=0;
  Delay_1sec();
  Lcd_Cmd(_LCD_CLEAR);
 }
}
}

despues de compilar...

Código:
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F877A -DL -O11111114 -fo8 -N"C:\Users\yamil\Desktop\16F887\teclado2\teclado.mcppi" -SP"C:\mikroc_pro\mikroC PRO for PIC\defs\" -SP"C:\mikroc_pro\mikroC PRO for PIC\Uses\P16\" -SP"C:\Users\yamil\Desktop\16F887\teclado2\" "teclado.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_CMath.mcl" "__Lib_MemManager.mcl" "__Lib_Conversions.mcl" "__Lib_Sprinti.mcl" "__Lib_Sprintl.mcl" "__Lib_Time.mcl" "__Lib_Trigonometry.mcl" "__Lib_Button.mcl" "__Lib_Keypad4x4.mcl" "__Lib_Manchester.mcl" "__Lib_OneWire.mcl" "__Lib_PS2.mcl" "__Lib_Sound.mcl" "__Lib_SoftI2C.mcl" "__Lib_SoftSPI.mcl" "__Lib_SoftUART.mcl" "__Lib_ADC_A_C.mcl" "__Lib_EEPROM.mcl" "__Lib_FLASH_RW.mcl" "__Lib_I2C_c34.mcl" "__Lib_PWM_c21.mcl" "__Lib_SPI_c345.mcl" "__Lib_UART_c67.mcl" "__Lib_PortExpander.mcl" "__Lib_CANSPI.mcl" "__Lib_CF.mcl" "__Lib_GlcdFonts.mcl" "__Lib_Glcd.mcl" "__Lib_LcdConsts.mcl" "__Lib_Lcd.mcl" "__Lib_RS485.mcl" "__Lib_S1D13700.mcl" "__Lib_T6963C.mcl" "__Lib_SPIGlcd.mcl" "__Lib_SPILcd.mcl" "__Lib_SPILcd8.mcl" "__Lib_SPIT6963C.mcl" "__Lib_EthEnc28j60.mcl" "__Lib_EthEnc24j600.mcl" "__Lib_TouchPanel.mcl"  
0 1139 Available RAM: 352 [bytes], Available ROM: 8192 [bytes]  
0 122 Compilation Started teclado.c
57 123 Compiled Successfully teclado.c
0 127 All files Compiled in 500 ms  
0 1144 Used RAM (bytes): 10 (3%)  Free RAM (bytes): 342 (97%) Used RAM (bytes): 10 (3%)  Free RAM (bytes): 342 (97%)
0 1144 Used ROM (program words): 424 (5%)  Free ROM (program words): 7768 (95%) Used ROM (program words): 424 (5%)  Free ROM (program words): 7768 (95%)
0 125 Project Linked Successfully teclado.mcppi
0 128 Linked in 156 ms  
0 129 Project 'teclado.mcppi' completed: 781 ms  
0 103 Finished successfully: 24 nov 2014, 15:56:56 teclado.mcppi

en isis.

Ver el archivo adjunto 121125

Ver el archivo adjunto 121125

no puedo seguir al parecer tengo problema con la memoria del pic.

pero quizas tambien el problema va con la introcuvvion de los datos en la memoria.
 

Adjuntos

  • error lcd+teclado+16f877A.jpg
    error lcd+teclado+16f877A.jpg
    72.1 KB · Visitas: 22
Hola, buenas tardes.

Estoy intentado conseguir un programa que:

Al conectar la placa, me salga este mensaje: Codigo:<espacio><lugar para codigo>
Mientras la placa esté esperando dos ordenes.

1)Seria que nosotros cambiemos el interruptor RA5
2)Pulsemos una tecla del 0 al 9

-Si pulsamos el interruptor RA5,me tendria salir el mensaje: hola
-Si pulsamos una tacla , por ejemplo el 4, tendria que salir el mensaje:
Codigo:<espacio>4


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Creo que el programa podria empezar así
PHP:
                Loop:     call Key_Scan	;Explora el teclado
		                  movlw	0x80
		                  subwf	Tecla,W
		                  btfsc	STATUS,Z	;Hay alguna pulsada ?
		                  goto	mirar_5		;No, seguir explorando
                          goto  modo_normal


                        mirar_5:  btfss PORTA,5           ;El bit 5 esta a 1?
                                  goto loop               ;No lo está
                                  goto modo_configuracion ;Si lo está




                       modo_normal -> aqui vendria la rutina para el código

                       modo_configuración ->aqui vendria la rutina para el hola

Lo de arriba creo que esta bien, mi problema es que tengo aqui el código para los mensajes y para la pantalla y no se relacionarlo. Es este:
PHP:
;El teclado y el LCD.
;
;Haciendo uso de las rutinas incluidas en los ficheros TECLADO.INC y LCD_CXX.INC, se trata 
;de leer el teclado y, visualizar sobre el módulo LCD  la tecla pulsada.
;
;El ejemplo pretende mostrar cómo es posible gobernar dos periféricos distintos conectados
;a la misma puerta (LCD y teclado). Para ello basta reprogramarla dinámicamente en el 
;tiempo según sea necesario.

		List	p=16F876	;Tipo de procesador
		include	"P16F876.INC"	;Definiciones de registros internos
                 
Lcd_var		equ	0x20		;Inicio de las variables para el LCD
Key_var		equ	0x22		;Inicio de las variables del teclado				
Temporal_1	equ	0x28		;Variable temporal nº 1
Temporal_2	equ	0x29		;Variable temporal nº 2
	
		org	0x05
		goto	Inicio
				
		include	"LCD_CXX.INC"	;Incluir rutinas de manejo del LCD
		include	"TECLADO.INC"	;Incluir rutinas de manejo del teclado

Tabla_Mensajes:	movwf	PCL		;Desplazamiento sobre la tabla

Mens_0		equ	$		;Mens_0 apunta al primer carácter
		dt	"Se ha pulsado: ",0x00

;*************************************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje         	movwf   	Temporal_1      	;Salva posición de la tabla
Mensaje_1       	movf    	Temporal_1,W    	;Recupera posición de la tabla
                	call    	Tabla_Mensajes  	;Busca caracter de salida
                	movwf   	Temporal_2      	;Guarda el caracter
                	movf    	Temporal_2,F
                	btfss   	STATUS,Z        	;Mira si es el último
                	goto    	No_es_ultimo
                	return
No_es_ultimo    	call    	LCD_DATO        	;Visualiza en el LCD
                	incf    	Temporal_1,F    	;Siguiente caracter
                	goto    	Mensaje_1
							
Inicio:		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	0x06
		movwf	ADCON1		;Puerta A digital
	
		bcf	STATUS,RP0	;Selecciona página 0 de datos
		clrwdt			;Refrescar WDT
				
		call	UP_LCD		;Configura Puerta A y B como salidas
		call	LCD_INI		;Rutina de inicialización del LCD
		movlw	b'00001100'
		call	LCD_REG	;LCD en ON
		movlw	b'00000001'
		call	LCD_REG	;Borra LCD y HOME

;Salida del mensaje "Tecla pulsada:"
				
		movlw	Mens_0
		call	Mensaje		;Visualiza el mensaje
				
;Bucle principal

Loop:		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ?
		goto	Loop		;No, seguir explorando
				
		movlw	0x8f
		call	LCD_REG	;Posiciona el cursor del LCD
		movf	Tecla,W
		sublw	.9
		btfss	STATUS,C        	;Es mayor que 9 (A, B,C,D,E,F)?
		goto	Mayor_que_9	;Si
		movf	Tecla,W		;No
		addlw	0x30            	;Ajuste ASCII de los caracteres del 0 al 9
		call	LCD_DATO	;Visualizar sobre el LCD
		goto	Loop												

Mayor_que_9	movf	Tecla,W
		addlw	0x37		;Ajuste ASCII de los caracteres de la A a la F
		call	LCD_DATO        ;Visualiza sobre el LCD
		goto	Loop

		end			;Fin del programa fuente

Haber si podeis ayudarme a que me salga lo descrito arriba.
Muchas gracias!!
 
Última edición:
A mi me falla algo. No puedo avanzar en ningún proyecto que utilice keypad-phone y un LCD standar.
Esto ocurre también con proyectos que antes funcionaban hechos por otros.
Vuestros programas y correcciones tampoco funcionan.

Cuando aplico el #define use_portb_kbd TRUE en kbd.c, en vez del programa principal.c, al compilar me da error diciendo que no existe la carpeta __history en C:\program files\PICC\Drivers.
Ahí es donde intenta guardar.
Cuando yo, esta carpeta sólo la veo donde están todos los archivos del proyecto. ¿Esto es normal?

El único programa que me funciona actualmente con kbd_get() sólo me sirve para manejar pulsos/flancos.
Si le meto un printf(lcd_putc,"\d",lectura); todo falla.

PHP:
#include <16f877.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG 
#USE delay(clock=4m)
//#define  use_portb_kbd TRUE
#include <lcd.c>
#include <kbd.c>
#include <stdio.h>
#use standard_io(a)
//MANIPULACION
#BYTE PORTD=0X08 
#BYTE TRISD=0X88


void main(){ 
int k,kant=0;
int PWMH=0,PWML=0,nk=0;
lcd_init();
kbd_init();
port_b_pullups(true); //impedancias
//lcd_gotoxy(1,1);
//lcd_putc("\f prueba"); delay_ms(10);// LCD NO MUESTRA NADA
while(true){
k=kbd_getc();
if (k==0)
{ k=kant;}

kant=k;
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
//printf(lcd_putc,"\f k =  %d",k); delay_ms(300);// SI INCLUYO ESTE "printf" NADA FUNCIONA
for(PWMH;PWMH>0;PWMH--){
OUTPUT_HIGH(PIN_A0);
//delay_ms(50);
}
for(PWML;PWML>0;PWML--){
OUTPUT_LOW(PIN_A0);
//delay_ms(50);
}
}
}
 

Adjuntos

  • CAJERO.rar
    31.4 KB · Visitas: 18
Última edición por un moderador:
La pantalla no muestra nada porque tienes mal las conexiones en el diseño.

Los bucles "FOR" no están bien, porque asignas los valores externamente y eso hará que el bucle no tenga efecto.

En lugar de...
for(PWMH;PWMH>0;PWMH--)
Debe ser...

for(PWMH=k*28;PWMH>0;PWMH--)

Como quiera, así como pretendes generar PWM, no está bien.
La generación PWM debería estar dentro de un único bucle, usando un timer y con una mejor estructura.

Si ese PIC cuenta con módulo CCP para generar PWM, deberías aprovecharlo y no hacerlo por software.
 
Última edición:
E vuelto a mirarlo las conexiones estan bien son las "standar" y funcionan en otros proyectos Solo e modificado la alimentacion del LCD quitandole el potencimetro como haceis vosotros.
No lo e probado pero la parte del codigo que te quejas es lo unico que funciona. Es lo unico que me permite hacer kbd_get() Algo hecho por otra persona. Insisto que mi problema esta cada vec que intento escribir algo en el LCD recogido en una variable que es escrita por kbd_get() el resultado siempre es 0. En este proyecto todo va a peor cada vec que utilizo el printf_LCD No funciona nisiquiera el generador de pulsos, la parte que dices que esta mal.
 
Según tú, están bien las conexiones, pero por estar mal, la pantalla no funciona.
Realiza una conexión directa para que mires bien el orden y verás que debe funcionar.

El potenciómetro es importante físicamente, en la simulación no es tomado en cuenta.
Y si todo va cada vez mal, es porque desde un principio lo hiciste todo mal.

Realiza un nuevo diseño o corrige ese teniendo más cuidado en las conexiones.
Sobre el programa entonces ni hablar, porque dices que así te funciona. :rolleyes:
 
Tenias razon en una cosa en un label ponia LCD6 y en otro LCD 6 por eso no respondia el LCD. E tenidop que pasar del KEYPAD-PHONE y lo e cambiado por 12 botones. Tiene cierta ventaja no necesito 6 bits con el nuebo diseño. Mis preguntas ahora son muy simples, las estoy buscando pero No se que e hecho con el libro de dev c++ Era muy valido de referencia
 
Hola, muy buenas noches. Tengo dudas para realizar una clave.

Sólo sé los comandos básicos, el teclado ya está listo con el tema del barrido, pero tengo dudas sobre el tema de colocar una clave y que al momento de colocar esa clave tiene que aparecer un 7 y si está mal, colocara un 0.
Traté de hacer rutinas de llamadas pero no me ha salido.


PHP:
org 0x00

bsf status,rp0


bcf trisa,0
bcf trisa,1
bcf trisa,2
bcf trisa,3


bcf trisb,0
bcf trisb,1
bcf trisb,2
bcf trisb,3

bsf trisb,4
bsf trisb,5
bsf trisb,6
bsf trisb,7


bcf status,rp0
lopez3
bsf portb,0
bcf portb,1
bcf portb,2
bcf portb,3

btfss portb,4
goto lala
movlw 0x07
movwf porta

lala    btfss portb,5
goto lala1
movlw 0x08
movwf porta

lala1    btfss portb,6
goto lala2
movlw 0x09
movwf porta

lala2    btfss portb,7
goto lala3
movlw 0x0A
movwf porta


lala3    bcf portb,0    
bsf portb,1
bcf portb,2
bcf portb,3

btfss portb,4
goto lero
movlw 0x04
movwf porta

lero    btfss portb,5
goto lero1
movlw 0x05
movwf porta

lero1    btfss portb,6
goto lero2
movlw 0x06
movwf porta

lero2    btfss portb,7
goto lero3
movlw 0x0B
movwf porta

lero3    bcf portb,0
bcf portb,1
bsf portb,2
bcf portb,3

btfss portb,4
goto emi1
movlw 0x01
movwf porta

emi1    btfss portb,5
goto emi2
movlw 0x02
movwf porta

emi2    btfss portb,6
goto emi3
movlw 0x03
movwf porta

emi3    btfss portb,7
goto emi4
movlw 0x0c
movwf porta


emi4    bcf portb,0
bcf portb,1
bcf portb,2
bsf portb,3

btfss portb,4
goto lopez
movlw 0x0F
movwf porta

lopez    btfss portb,5
goto lopez1
movlw 0x00
movwf porta

lopez1    btfss portb,6
goto lopez2
movlw 0x0E
movwf porta


lopez2    btfss portb,7
goto lopez3
movlw 0x0D
movwf porta


end
La pregunta es, ¿cómo logro hacer una combinación, la cual al realizarla me coloque un 7 en el display?
 
Última edición por un moderador:
Deberías comentar el programa y usar etiquetas con nombres coherentes.
Cuando realices un programa más grande, eso de lala, lero, lopez, etc. No te servirá para identificar las rutinas posteriormente.
Sólo sé los comandos básicos
A nivel programación, los comandos hacen referencia a información, e instrucciones al set de palabras del compilador.
La pregunta es, ¿cómo logro hacer una combinación, la cual al realizarla me coloque un 7 en el display?
A ese programa le hacen falta muchas cosas para que realice lo que quieres.

  • No tiene cabecera.
  • No tiene configuración de registros y variables.
  • No incluye librerías ni rutinas para el manejo de LCD o displays de 7 segmentos.
  • Etcétera.
Debes empezar siempre por lo más elemental antes de llevar a cabo un proyecto como el que pretendes.

Como dato extra:
Si recopilas información sobre los posts que existen en el Foro usando el buscador, podrás obtener partes fundamentales de código para lograr lo que deseas.
 
No conosco aun las librerias debido a que soy nuevo y en clases estamos usando el pic simulator aun no le encuentro las librerias y creo que tampoco aun nos van a enseñar a usarlas, la programacion me funciona en proteus me cumple el objetivo de al momento de presionar la tecla me salga el numero pero lo que quiero implementar no me funciona de colocarle una clave especifica de 3 digitos

Si quieres te comparto el proteus con la programacion para que veas que en realidad si me funciona y es muy simple el programa que realize para el teclado
 
OK. Si piensas continuar con lenguaje ensamblador, que a estas alturas ya es obsoleto, te recomiendo que uses algo serio, como MPLAB o MPLAX.

Aprender ensamblador no está nada mal, pero tardarás mucho tiempo en crear un programa si no tienes los conocimientos suficientes.
En cambio, con otros lenguajes de programación de alto nivel, como Basic o C, podrás realizar tu programa en cuestión de minutos u horas.
¿Por qué? Porque éstos lenguajes ya incluyen librerías e instrucciones directas para controlar LCD y otros periféricos más.
Así te evitas escribir librerías y código extra para el manejo de los dispositivos externos.

Y te repito, recopila información. Aquí en Foro existe bastante.
Para poder ayudarte, yo tendría que buscar esa información por ti y crear un proyecto que te corresponde realizar a ti.
 
Última edición:
No me queda otra, Si fuera por mi seguiría solo en C

Eso me estan pasando en una asignatura y el profesor no me da muchos datos solo me dice "Aprende las instrucciones y luego nos da estos ejercicios que tenemos que pensarlo solos
estamos sin libreria tenemos que hacer toda la instrucción

Lo he intentado y vuelto a intentar y aun no llego a la respuesta
 
Pero no me hiciste caso acerca de que recopilaras información sobre los proyectos que existen en el Foro.
Te daré una ayuda, mira éstos enlaces: Resultados de Búsqueda

En algunos de ellos podrás encontrar proyectos realizados en ensamblador y en otros lenguajes.
Utiliza el que más te convenga y realiza los cambios que creas necesarios.
También puedes usar partes de varios programas para crear tu proyecto final.

Los proyectos funcionales del Foro son de libre distribución, subidos por gente que colabora para que otras personas aprendan de sus experiencias y sin fines de lucro.
 
Atrás
Arriba