Использование 0xFF в массиве указателей - PullRequest
0 голосов
/ 03 сентября 2018

Я не понимаю использование 0xFF в массиве указателей. Я хочу управлять клавиатурой. Мой код:

// CONFIGURATION BITS
#pragma config FOSC = HS   // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF   // Low-Voltage In-Circuit Serial Programming Enable bit
#pragma config CPD = OFF   // Data EEPROM Memory Code Protection bit 
#pragma config WRT = OFF   // Flash Program Memory Write Enable bits 
#pragma config CP = OFF    // Flash Program Memory Code Protection bit

#define _XTAL_FREQ 8000000

// DEFINING LCD PINS
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

// DEFINING KEYPAD PINS 
#define KP_R1 PORTBbits.RB1
#define KP_R2 PORTBbits.RB2
#define KP_R3 PORTCbits.RC1
#define KP_R4 PORTCbits.RC2
#define KP_C1 PORTBbits.RB3
#define KP_C2 PORTBbits.RB4
#define KP_C3 PORTBbits.RB6
#define KP_C4 PORTBbits.RB7

#include <xc.h>

#include "lcd.h"

#include <stdio.h>
#include <stdlib.h>

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

void kbd_init();

void kbd_init(){
    // SETTING THE DATA DIRECTION REGISTERS
    PORTB   = 0x00;
    TRISB   = 0xD9;  // RB7-1 RB6-1 RB5-0 RB4-1 RB3-1 RB2-0 RB1-0 RB0-1 ( 1=Input, 0=Output) 
    PORTC   = 0x00;
    TRISC   = 0x90;  // RC7-1 RC6-0 RC5-0 RC4-1 RC3-0 RC2-0 RC1-0 RC0-0 ( 1=Input, 0=Output) 
    OPTION_REGbits.nRBPU = 1; 
}

char old_key;
char *kbd_getc();

char *kbd_getc(){

    char row;
    char key = 0;

    for( row = 0b00000001; row < 0b00010000; row <<= 1 )
    {
        {   // turn on row output
            KP_R1 = (row & 0x0001)>>0;
            KP_R2 = (row & 0x0002)>>1;
            KP_R3 = (row & 0x0004)>>2;
            KP_R4 = (row & 0x0008)>>3;
            __delay_ms(1);
        }
        // read colums - break when key press detected
        if( KP_C1 == 1 ){
            break;  
        }
        key++;
        if( KP_C2 == 1 ){
            break;  
        }
        key++;
        if( KP_C3 == 1 ){
            break;  
        }
        key++;
        if( KP_C4 == 1 ){
            break;  
        }
        key++;
     }

    KP_R1 = 0;
    KP_R2 = 0;
    KP_R3 = 0;
    KP_R4 = 0; 

    if (key!=old_key){
      old_key=key;
      return keyPadMatrix[key];
    }
    else{
      return keyPadMatrix[0x10];
    }

}

void main()
{

    TRISD = 0x00;           //PORTD as output for LCD
    Lcd_Init();
    Lcd_Clear();

    while(1)
    {

        Lcd_Set_Cursor(1,1);

        char *keypress;

        keypress = kbd_getc();

        Lcd_Write_String(keypress);

        __delay_ms(50);

    }
}

Идея состоит в том, что когда вы нажимаете клавишу, ЖК-дисплей показывает эту клавишу, а когда вы ничего не нажимаете, ЖК-дисплей ничего не показывает. Если вы изменяете 0xFF на что-то вроде «w», клавиатура делает свое дело, но вместо того, чтобы что-то показывать, она показывает «w» (как и ожидалось). Но когда вы используете 0xFF, клавиатура не работает. Я не понимаю использование 0xFF в массиве указателей. Я скопировал код с веб-сайта, но внес некоторые изменения, потому что оригинал тоже не работает.

Примечание:

void Lcd_Write_String(char *a)
{
    int i;
    for(i=0;a[i]!='\0';i++)
       Lcd_Write_Char(a[i]);
}
...