hi
i want to implement a keypad using PicBasic PRO, and i want to use the interrupt on change of PORTB. i am using 16F877 and i can't use "polling routine" in this project with , also i can't use any Keypad IC (like 74C922).
i wrote a program and i attach its PROTEUS file its schematic.
thanks in advance,Code:'**************************************************************** '* Name : PORTB_CHANGE.BAS * '* Author : Mostafa Taghavi Kani * '* Notice : Copyright (c) 2006 Embedded Technology * '* : All Rights Reserved * '* Date : 2006/12/14 * '* Version : 1.0 * '* Notes : * '**************************************************************** define OSC 4 'PIC 16F877 DEFINE LCD_DREG PORTA DEFINE LCD_DBIT 0 DEFINE LCD_RSREG PORTA DEFINE LCD_RSBIT 4 DEFINE LCD_EREG PORTE DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 GIE VAR INTCON.7 PEIE VAR INTCON.6 T0IE VAR INTCON.5 INTE VAR INTCON.4 RBIE VAR INTCON.3 T0IF VAR INTCON.2 INTF VAR INTCON.1 RBIF VAR INTCON.0 RBPU VAR OPTION_REG.7 INTEDG VAR OPTION_REG.6 T0CS VAR OPTION_REG.5 T0SE VAR OPTION_REG.7 PSA VAR OPTION_REG.3 PS2 VAR OPTION_REG.2 PS1 VAR OPTION_REG.1 PS0 VAR OPTION_REG.0 i VAR BYTE x VAR BYTE ROW VAR BYTE COL VAR BYTE J VAR BYTE R VAR BIT C VAR BIT TRISB=%11110000 : 'PORTB=%11111111 TRISD=%00000000 i=0 INTCON = %10001000 RBPU=0 ON INTERRUPT GOTO TEST MAIN: IF I==0 THEN LCDOUT $FE,1,"PRESS ANY KEY!" ELSE LCDOUT $FE,1,"(ROW,COLUMN)=","(",#R,",",#C,")" ENDIF PORTB=(PORTB & %11110010) PAUSE 20 PORTB=(PORTB & %11110100) PAUSE 20 PORTB=(PORTB & %11111000) PAUSE 20 GOTO MAIN DISABLE TEST: @ MOVF PORTB,W 'IMPORTANT:reads PORTB and moves the value to W register!!! ROW=(PORTB & %11110000) COL=(PORTB & %00001110) SELECT CASE ROW CASE %00010000 R=1 CASE %00100000 R=2 CASE %01000000 R=3 CASE %10000000 R=4 END SELECT SELECT CASE COL CASE %00000010 C=1 CASE %00000100 C=2 CASE %00001000 C=3 END SELECT i=i+1 RBIF=0 RESUME ENABLE END
with best regards.




Bookmarks