扫描4x4键盘与TM4C123G连接

时间:2015-05-01 08:06:20

标签: c# embedded

我想使用TM4C123G启动板扫描4x4键盘。我尝试将引脚D1,D2和A5作为输出引脚,将引脚E1,E2和E3作为输入引脚(带上拉)。

当我将0写入D1并将1写入D2和A5时:

GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1 |GPIO_PIN_2, 0x0D);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 0xFF);

我在液晶显示屏上输出正确的输出。

当我使用其他值时,显示错误:

GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1 |GPIO_PIN_2, 0xFF);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 0x00);

我无法理解问题所在。有人可以帮忙吗?

我正在使用I2C存储器,它使用在运行时连接的引脚A6和A7。

我的代码:

// project //

#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
//#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
//#include "driverlib/i2c.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"


//----------------------------------------
// Prototypes
//----------------------------------------

//----------------------------------------
// Prototypes
//----------------------------------------
void hardware_init(void);
//void ledToggle(void);
void delay(void);
void LCD_configuration();
void CMD_write(int val);
void data_write(char value1);


void scan_key();
char a= '0';
int valid_ID_flag=0;

void main(void)
{
int i=0;
char password[3];
char correct_msg[16]="password valid ";
char incorrect_msg[16]="password invalid";
hardware_init();
delay();
LCD_configuration();
delay();
CMD_write(0x01);
delay();
//name_display(count);



int p=0;
for(p=0;p<3;p++)
{
scan_key();
//delay();

password[p]=a;
}
delay();

CMD_write(0x01);
if (password == "321")
{

CMD_write(0x01);
delay();
for(i=0;i<16; i++)
{
data_write(correct_msg[i]);
delay();
}
}
else
{


CMD_write(0x01);
delay();
for(i=0;i<16; i++)
{
data_write(incorrect_msg[i]);
}
}
delay();
delay();
delay();
delay();
while(1)
{

}


}





void scan_key()
{
int flag=0;
while(flag==0)
{

GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1 |GPIO_PIN_2, 0xFF);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 0x00);

if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1) == 0 && valid_ID_flag==0)
{
delay();
if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1) == 0)
{
flag=1;
//count=count+1;
}
a='4';
data_write(a);

}

if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2) == 0 && valid_ID_flag==0)
{
delay();
while(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2) == 0)
{
flag=1;
//count=count+1;
}
a='5';
data_write(a);
}
if(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3) == 0 && valid_ID_flag==0)
{
delay();
while(GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3) == 0)
{
flag=1;
//count=count+1;
}
a=6;
data_write(54);
}

}
}







void CMD_write(int val)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0x00);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0| GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,val);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,0x10);

delay();
}

void data_write(char value1)
{


GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0x04);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0| GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,value1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,0x10);
delay();
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,0x00);
}

// functions working with LCD

void LCD_configuration()
{
CMD_write(0x38);
CMD_write(0x0f);
CMD_write(0x06);
CMD_write(0x01);
// CMD_write(0x80);
}


//---------------------------------------------------------------------------
// hardware_init()
//
// inits GPIO pins for toggling the LED
//---------------------------------------------------------------------------
void hardware_init(void)
{
//int ui32Period_p;
//Set CPU Clock to 40MHz. 400MHz PLL/2 = 200 DIV 5 = 40MHz
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); //setup clock


SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);




GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);

GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0| GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);


GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);



}



//---------------------------------------------------------------------------
// delay()
//
// Creates a 500ms delay via TivaWare fxn
//---------------------------------------------------------------------------
void delay(void)
{
SysCtlDelay(670000); // creates ~500ms delay - TivaWare fxn

}

1 个答案:

答案 0 :(得分:0)

我使用的是PD1和PB7 ......它们在tiva c系列tm4c123g板内部短路。所以不要同时使用两个引脚。