C# 与TM4C123G接口的扫描4x4键盘

C# 与TM4C123G接口的扫描4x4键盘,c#,embedded,C#,Embedded,我想用launchpad扫描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); 我在LCD上得到正确的输出 使用其他值时,显示错误: GPIOPinWrite(GPIO_PORTD_BASE,

我想用launchpad扫描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);
我在LCD上得到正确的输出

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

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

}
//项目//
#包括
#包括
#包括“inc/tm4c123gh6pm.h”
//#包括“inc/hw_i2c.h”
#包括“inc/hw_memmap.h”
#包括“inc/hw_types.h”
#包括“inc/hw_gpio.h”
//#包括“driverlib/i2c.h”
#包括“driverlib/sysctl.h”
#包括“driverlib/gpio.h”
#包括“driverlib/pin_map.h”
//----------------------------------------
//原型
//----------------------------------------
//----------------------------------------
//原型
//----------------------------------------
无效硬件初始化(无效);
//无效(void);
无效延迟(void);
无效LCD_配置();
void CMD_write(int val);
无效数据写入(字符值1);
无效扫描键();
字符a='0';
int valid_ID_flag=0;
真空总管(真空)
{
int i=0;
字符密码[3];
char correct_msg[16]=“密码有效”;
字符错误\u消息[16]=“密码无效”;
硬件初始化();
延迟();
LCD_配置();
延迟();
CMD_write(0x01);
延迟();
//名称显示(计数);
int p=0;

对于(p=0;p我使用的是PD1和PB7..,它们在tiva c系列tm4c123g板中内部短路。因此不要同时使用两个引脚。

请参阅网页:可能更适合电子产品。stackexchange.com1)如果你想要一个答案,请正确格式化文本,并将其简化为实际问题,删除所有不必要的代码。你可能还需要解释使用的不太明显的外部函数。