P
praveen_palaparthi
Guest
hi vrienden Ik heb geprobeerd om interface 4x4 matrix toetsenbord om pic 16F877 kan elke geef me de broncode in C om te controleren welke toets wordt ingedruktdit is de code die ik heb geprobeerd in Hitech pic C compiler
/***************** MAIN PROGRAM *****************/
main ()
(
unsigned char i;
unsigned char key_pad [4] [4] = (( 'D', 'E', 'F', 0), (9, 'A', 'B', 'C'), (5,6,7, 8), (1,2,3,4));
OPTION = 0x00; / / enable pull up weerstanden door individuele vergrendeling waarden
INTCON = 0xC8; / / enable Poort B interrupt veranderen
lcd (); / / LCD intialization
keypad_matrix (); / / 4x4 matrix toetsenbord intialization
while (1)
(
PORTB = 0xF0; / / Alle ingangen zijn getrokken om hoge
RA4 = 1;
PORTE = 0x07; / / Alle uitgangen zijn hoog getrokken
for (i = 0; i <= 3; i )
(
switch (i)
(
case 0:
RA4 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [0]);
else if (RB5 == 0)
lcd_display (key_pad [1] [0]);
else if (RB6 == 0)
lcd_display ([2] [0]) key_pad;
if (RB7 == 0)
lcd_display ([3] [0]) key_pad;
break;
case 1:
Re0 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [1]);
else if (RB5 == 0)
lcd_display (key_pad [1] [1]);
else if (RB6 == 0)
lcd_display ([2] [1]) key_pad;
if (RB7 == 0)
lcd_display ([3] [1]); / / controle input is laag key_pad
break;
case 2:
RE1 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [2]);
else if (RB5 == 0)
lcd_display (key_pad [1] [2]);
else if (RB6 == 0)
lcd_display ([2] [2]) key_pad;
if (RB7 == 0)
lcd_display ([3] [2]); / / controleren input is laag key_pad
break;
case 3:
RE2 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [3]);
else if (RB5 == 0)
lcd_display (key_pad [1] [3]);
else if (RB6 == 0)
lcd_display (key_pad [2] [3]);
if (RB7 == 0)
lcd_display ([3] [3]); / / controleren input is laag key_pad
break;
)
)
)
)void interrupt portb_change (void)
(
if (RBIF)
(
RBIF = 0;
PORTB = 0xF0; / / Alle ingangen zijn getrokken om hoge
RA4 = 1;
PORTE = 0x07; / / Alle uitgangen zijn hoog getrokken
)
)
/************ Routines *********************************/
# include <pic.h>
# include "key.h"
# include "delay.h"
# define LCD_RS RB4
# define LCD_RW RB5
# define LCD_E RA2
# define LCD_DATA PORTB
# define LCD_STROBE ((LCD_E = 1), (LCD_E = 0))
__CONFIG (XT & WDTDIS & LVPDIS & Unprotect);
void lcd (void)
(
TRISB = 0xC0;
PORTB = 0;
lcd_init ();
lcd_clear ();
)
void lcd_init (void)
(
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
DelayMs (40);
LCD_DATA = 0x03;
DelayMs (5);
LCD_DATA = 0x03;
DelayUs (100);
LCD_DATA = 0x03;
DelayUs (40);
LCD_DATA = 0x02;
DelayUs (40);
lcd_write (0x20);
DelayUs (40);
lcd_write (0x08);
DelayUs (40);
lcd_write (0x0F);
lcd_write (0x06);
DelayUs (40);
)
void lcd_clear (void)
(
LCD_RS = 0;
lcd_write (0x01);
LCD_STROBE;
)
void lcd_write (unsigned char c)
(
DelayUs (40);
LCD_DATA = ((c>> 4) & 0x0F);
LCD_STROBE;
LCD_DATA = (C & 0x0F);
LCD_STROBE;
)
void keypad_matrix (void)
(
TRISB = 0xF0; / / RB7: RB4 worden genomen als input
TRISA = 0xEF; / / RA4 wordt genomen als output
TRISE = 0xF8; / / RE2: re0 wordt genomen als output)
void lcd_display (unsigned char c) / / displays gegevens op het LCD
(
lcd_goto (0x07);
DelayMs (5);
LCD_DATA = 0;
LCD_RS = 1;
LCD_DATA | = ((c>> 4) & 0x0F);
LCD_STROBE; / / hoog naar laag pols moet worden toegepast om voor het LCD-vergrendeling om in de gegevens
LCD_DATA & = 0xF0;
LCD_DATA | = (C & 0x0F);
LCD_STROBE;
LCD_RS = 0;
)
void lcd_goto (unsigned char pos)
(
LCD_RS = 0;
lcd_write (0x80 pos);
)
Last edited by praveen_palaparthi op 25 april 2008 11:40; bewerkten in totaal 1 keer
/***************** MAIN PROGRAM *****************/
main ()
(
unsigned char i;
unsigned char key_pad [4] [4] = (( 'D', 'E', 'F', 0), (9, 'A', 'B', 'C'), (5,6,7, 8), (1,2,3,4));
OPTION = 0x00; / / enable pull up weerstanden door individuele vergrendeling waarden
INTCON = 0xC8; / / enable Poort B interrupt veranderen
lcd (); / / LCD intialization
keypad_matrix (); / / 4x4 matrix toetsenbord intialization
while (1)
(
PORTB = 0xF0; / / Alle ingangen zijn getrokken om hoge
RA4 = 1;
PORTE = 0x07; / / Alle uitgangen zijn hoog getrokken
for (i = 0; i <= 3; i )
(
switch (i)
(
case 0:
RA4 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [0]);
else if (RB5 == 0)
lcd_display (key_pad [1] [0]);
else if (RB6 == 0)
lcd_display ([2] [0]) key_pad;
if (RB7 == 0)
lcd_display ([3] [0]) key_pad;
break;
case 1:
Re0 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [1]);
else if (RB5 == 0)
lcd_display (key_pad [1] [1]);
else if (RB6 == 0)
lcd_display ([2] [1]) key_pad;
if (RB7 == 0)
lcd_display ([3] [1]); / / controle input is laag key_pad
break;
case 2:
RE1 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [2]);
else if (RB5 == 0)
lcd_display (key_pad [1] [2]);
else if (RB6 == 0)
lcd_display ([2] [2]) key_pad;
if (RB7 == 0)
lcd_display ([3] [2]); / / controleren input is laag key_pad
break;
case 3:
RE2 = 0;
if (RB4 == 0) / / controleren input is laag
lcd_display (key_pad [0] [3]);
else if (RB5 == 0)
lcd_display (key_pad [1] [3]);
else if (RB6 == 0)
lcd_display (key_pad [2] [3]);
if (RB7 == 0)
lcd_display ([3] [3]); / / controleren input is laag key_pad
break;
)
)
)
)void interrupt portb_change (void)
(
if (RBIF)
(
RBIF = 0;
PORTB = 0xF0; / / Alle ingangen zijn getrokken om hoge
RA4 = 1;
PORTE = 0x07; / / Alle uitgangen zijn hoog getrokken
)
)
/************ Routines *********************************/
# include <pic.h>
# include "key.h"
# include "delay.h"
# define LCD_RS RB4
# define LCD_RW RB5
# define LCD_E RA2
# define LCD_DATA PORTB
# define LCD_STROBE ((LCD_E = 1), (LCD_E = 0))
__CONFIG (XT & WDTDIS & LVPDIS & Unprotect);
void lcd (void)
(
TRISB = 0xC0;
PORTB = 0;
lcd_init ();
lcd_clear ();
)
void lcd_init (void)
(
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
DelayMs (40);
LCD_DATA = 0x03;
DelayMs (5);
LCD_DATA = 0x03;
DelayUs (100);
LCD_DATA = 0x03;
DelayUs (40);
LCD_DATA = 0x02;
DelayUs (40);
lcd_write (0x20);
DelayUs (40);
lcd_write (0x08);
DelayUs (40);
lcd_write (0x0F);
lcd_write (0x06);
DelayUs (40);
)
void lcd_clear (void)
(
LCD_RS = 0;
lcd_write (0x01);
LCD_STROBE;
)
void lcd_write (unsigned char c)
(
DelayUs (40);
LCD_DATA = ((c>> 4) & 0x0F);
LCD_STROBE;
LCD_DATA = (C & 0x0F);
LCD_STROBE;
)
void keypad_matrix (void)
(
TRISB = 0xF0; / / RB7: RB4 worden genomen als input
TRISA = 0xEF; / / RA4 wordt genomen als output
TRISE = 0xF8; / / RE2: re0 wordt genomen als output)
void lcd_display (unsigned char c) / / displays gegevens op het LCD
(
lcd_goto (0x07);
DelayMs (5);
LCD_DATA = 0;
LCD_RS = 1;
LCD_DATA | = ((c>> 4) & 0x0F);
LCD_STROBE; / / hoog naar laag pols moet worden toegepast om voor het LCD-vergrendeling om in de gegevens
LCD_DATA & = 0xF0;
LCD_DATA | = (C & 0x0F);
LCD_STROBE;
LCD_RS = 0;
)
void lcd_goto (unsigned char pos)
(
LCD_RS = 0;
lcd_write (0x80 pos);
)
Last edited by praveen_palaparthi op 25 april 2008 11:40; bewerkten in totaal 1 keer