PIC 16f877a 4x3 Keypad ve LCD Uygulaması

Başlatan MG33, 13 Temmuz 2021, 12:56:42

MG33

İyi günler 4x3 lük keypad'de bastığım tusa göre lcd de ekranda, o tusa karşılık gelen yazıyı göstermek istiyorum. Fakat 3. satır bir türlü calismiyor. 1. ve 2. satırda herhangi bir sıkıntı yok bastığım zaman lcd ekranda yazıyı görebiliyorum(yani 1,4,7,* 2,5,8,0 tuslarına basınca lcd'de yazıyı görebiliyorum). Fakat 3. satırdaki tuslara basınca bir tepki alamıyorumbazen de calisiyor.Bu arada Keypad'i B portundaki bitlere bağladım. Olmayınca TRISB nin bitleriyle oynadım bu seferde 1. satırdaki tuslar calismayip diğer tusların hepsi calisti. Hatanın kod kısmında olduğunu düşünüyorum. Kodu Mplab ortamında pickit3 vasıtasıyla mikrodenetleyiciye yüklüyorum. Ayrıca OPTION_REG e bir sey yapmalımıyım? eğer OPTION_REG = 0b00000111; yaparsam en azında 1. ve 2. satır çalışıyor. Ya da gözden kaçırdığım bir şey mi var ?

Kodun Keypad kısmı şu şekilde:
// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator) //XT yap dene HS den
#pragma config WDTE = OFF      // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = ON      // Brown-out Reset Enable bit (BOR enabled) //
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF        // Flash Program Memory Code Protection bit (Code protection off)


#define _XTAL_FREQ 4000000

// Define pins
#define X_1 RB3
#define X_2 RB4
#define X_3 RB5
#define X_4 RB6
#define Y_1 RB0
#define Y_2 RB1
#define Y_3 RB2

#define Keypad_PORT PORTB
#define Keypad_PORT_Direction TRISB 


#include <xc.h>
#include <stddef.h>
#include <stdint.h>
#include <proc/pic16f877a.h>



char keypad_scanner(void) 
{ 
X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; 

if (Y_1 == 0) 
    {
        __delay_ms(100); 
        while (Y_1==0)
        {
            return '1';
        }
    }

    if (Y_2 == 0) 
    {
        __delay_ms(100); 
        while (Y_2==0)
        {
            return '2';
        }
    }
    
    if (Y_3 == 0) 
    {
        __delay_ms(100); 
        while (Y_3==0)
        {
            return '3';
        }
    }
    
    
X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; 


    if (Y_1 == 0) 
    {
        __delay_ms(100); 
        while (Y_1==0)
        {
            return '4';
        }
    }
    
    if (Y_2 == 0) 
    {
        __delay_ms(100); 
        while (Y_2==0)
        {
            return '5';
        }
    }
    
    if (Y_3 == 0) 
    {
        __delay_ms(100); 
        while (Y_3==0)
        {
            return '6';
        }
    }
    

X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; 
    if (Y_1 == 0) 
    {
        __delay_ms(100); 
        while (Y_1==0)
        {
            return '7';
        }
    }
    
    if (Y_2 == 0) 
    {
        __delay_ms(100); 
        while (Y_2==0)
        {
            return '8';
        }
    }
    
    if (Y_3 == 0) 
    {
        __delay_ms(100); 
        while (Y_3==0)
        {
            return '9';
        }
    }


X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; 

if (Y_1 == 0) 
    {
        __delay_ms(100); 
        while (Y_1==0)
        {
            return '*';
        }
    }
    
    if (Y_2 == 0) 
    {
        __delay_ms(100); 
        while (Y_2==0)
        {
            return '0';
        }
    }
    
    if (Y_3 == 0) 
    {
        __delay_ms(100); 
        while (Y_3==0)
        {
            return '#';
        }
    }
return 'n';    
}

char switch_press_scan(void)      
{
    //bir seye basmadigi surece tariyor.
char key = 'n';            

while(key == 'n')              
key = keypad_scanner();

return key;
}


void InitKeypad(void)
{  
    
    OPTION_REG = 0b00000111;
    Keypad_PORT     = 0x00;
    Keypad_PORT_Direction = 0b00000111;

    
}



void main(void)
{
    char Key = 'n';

  
  
    InitKeypad();
    
    
    
    while(1)
    {
        Key = switch_press_scan();      
    }
    
}

onurinci

16F877 ile benzer bir uygulama yapmıştım, bir kolon cevap vermiyordu.programlayıcıdan RB3 low voltaj enable sigortasını kapattım ,düzelmişti..

ahmet_zxc

adres problemin var diye düşünüyorum

16 ve 20 karakterde adresler değişir.

4x20 LCD adres kodları

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3
94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7
D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7

4x16 LCD adres kodları

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

LCD 'ye yazdırma Komutları

16 ve 20 karakter LCD 'de.......
$FE,1 "Ekranı siler,kursor en başa gider.(1.satıra yazılır.)"
$FE,2 "birinci satıra yazılır."
$FE,$80 "birinci satıra yazılır."
$FE,$C0 "ikinci satıra yazılır."

16 Karakter LCD 'de.......
$FE,$90 "üçüncü satıra yazılır."
$FE,$D0 "dördüncü satıra yazılır."

20 Karakter LCD 'de.......
$FE,$94 "üçüncü satıra yazılır."
$FE,$D4 "dördüncü satıra yazılır."

MG33

Alıntı yapılan: onurinci - 13 Temmuz 2021, 20:06:0116F877 ile benzer bir uygulama yapmıştım, bir kolon cevap vermiyordu.programlayıcıdan RB3 low voltaj enable sigortasını kapattım ,düzelmişti..
hocam bunu config bitsden mi yapacağız eğer ondansa zaten off da eğer başka bir yerdense nasıl yapmam gerekli ?

MG33

Alıntı yapılan: ahmet_zxc - 14 Temmuz 2021, 18:54:11adres problemin var diye düşünüyorum

16 ve 20 karakterde adresler değişir.

4x20 LCD adres kodları

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3
94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7
D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7

4x16 LCD adres kodları

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

LCD 'ye yazdırma Komutları

16 ve 20 karakter LCD 'de.......
$FE,1 "Ekranı siler,kursor en başa gider.(1.satıra yazılır.)"
$FE,2 "birinci satıra yazılır."
$FE,$80 "birinci satıra yazılır."
$FE,$C0 "ikinci satıra yazılır."

16 Karakter LCD 'de.......
$FE,$90 "üçüncü satıra yazılır."
$FE,$D0 "dördüncü satıra yazılır."

20 Karakter LCD 'de.......
$FE,$94 "üçüncü satıra yazılır."
$FE,$D4 "dördüncü satıra yazılır."
hocam lcd nin kütüphanesiyle alakalı oldugunu düsünmüyorum aynı kodu return olan değere gore led yakma projesinde kullandığımda da 3. sutundaki tuslar calismiyor cok nadir calisiyor.

onurinci

şimdi fark ettim,zaten yazdığın kod'da kapalıymış,
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)

OFF verilmiş,benim tezim geçersiz..

MG33

acaba bu sorun 16f877a' nın PORTB pinlerinnin hepsinin weak pull up olmasından kaynaklanıyor olabilir mi 4*3 yerine 4*4 bir keypad kullansam b portunun tüm pinlerini kullanmış olacağım. Çünkü buradaki kişi 4*4 luk keypad kullanmıs ve kodlar benzer. Ya da kesme kullanarak yapmayı düşünüyorum belki o zaman olabilir

onurinci

OPTION_REG = 0b00000111; yapmışsın ,portB'nin tamanı PullUp olmuş.

ete

Bir yanlış anlaşılma olmaması için ufak bir düzeltme yapayım. PORTB nin tamamının Pullup olabilmesi için bütün PORTB nin TRISB registerinden giriş olarak ayarlanması gerekir. Halbuki programda;
Keypad_PORT_Direction = 0b00000111;
komut satırı ile İlk 3 bit giriş ayarlanmış ve Option registeri 7.biti sıfır yapılarak dahili pullup dirençleri bu girişler için aktif edilmiş ama bütün PortB için değil yanlızca ilk üç bit (PORTB.0- PORTB.1 ve PORTB.2)
Programda mantıksal bir hata göremedim. Bu durumda donanım hatası olması kuvvetle muhtemel. Bağlantıları ve özellikle butonları fiziksel olarak kontrol edin bana kalırsa.


Ete

Powered by EzPortal