Я не понимаю использование 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]);
}