把代码下载进去之后,led不受按键控制,移动矩阵按键的位置(不按按键),led就会亮一会或者灭一会,是矩阵按键有问题吗,或者接触不良。
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
int main(void)
{
alt_u8 led = 0;
volatile alt_u32 i=0;
alt_u8 data=0x3;
alt_u8 led_en=0;
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE, 0x0f);//低四位输出,高两位输入
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0);//关闭所有中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30);//清除所有的捕获位
while(1)
{
data=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE);
data=data>>4;
if(data && 0x1)
{
led_en=1;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30);//清除所有的捕获位
}
if(led_en)
{
led = 0;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//点亮LED灯
i = 0;
while(i<500000) //延时功能,非精确延时,数值太小将无法看到灯的闪烁效果
{
data=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE);
data=data>>4;
if(data && 0x2)
{
led_en=0;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30);//清除所有的捕获位
}
i++;
}
led = 0xf;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//熄灭LED灯
i = 0;
while(i<500000) //延时功能,非精确延时,数值太小将无法看到灯的闪烁效果
{
data=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE);
data=data>>4;
if(data && 0x2)
{
led_en=0;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30);//清除所有的捕获位
}
i++;
}
}
}
return 0;
}