键盘扫描4X4

键盘扫描:

键盘扫描4X4_第1张图片

 

上面的输入口的警告可以不用管。

输入PIO口的input options可以不去设置,默认就可以用了。

#include"system.h"

#include "altera_avalon_pio_regs.h"

#include "altera_avalon_timer_regs.h"//本来想用定时器中断去实现的,但是没有成功,所以这个头文件可以不用

#include "alt_types.h"

#include<stdio.h>

 

void delay_KEY(alt_u16 i)

{

    volatile int k=0;

    while(k<50*i) k++;

}

 

int KeyScan(void)

{

    alt_u8 key=0x00;

    alt_u8 key_tmp=0x00;

        IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_H_BASE,0xf); //output tri-state

        IOWR_ALTERA_AVALON_PIO_DATA(KEY_H_BASE,0xf);       //向行输出1111

       

        IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_L_BASE,0xf); //output tri-state

        IOWR_ALTERA_AVALON_PIO_DATA(KEY_L_BASE,0x0);        //拉低到0

       

        delay_KEY(500);//延时去抖

                          

        IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_L_BASE,0x0); //input tri-state

        key_tmp=IORD_ALTERA_AVALON_PIO_DATA(KEY_L_BASE); //读取KEY_L

        key_tmp=key_tmp&0xf;

        if(key_tmp==1)

            key=0;

        else if(key_tmp==2)

            key=1;

        else if(key_tmp==4)

            key=2;

        else if(key_tmp==8)

            key=3;

        else

            key=16;

           

        IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_L_BASE,0xf); //output tri-state

        IOWR_ALTERA_AVALON_PIO_DATA(KEY_L_BASE,0xf);       //向列输出1111

       

        IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_H_BASE,0xf); //output tri-state

        IOWR_ALTERA_AVALON_PIO_DATA(KEY_H_BASE,0x0);        //拉低到0

       

        delay_KEY(10);//延时去抖

                          

        IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_H_BASE,0x0); //input tri-state

        key_tmp=IORD_ALTERA_AVALON_PIO_DATA(KEY_H_BASE); //读取KEY_H

        key_tmp=key_tmp&0xf;

        if(key_tmp==1)

            key=key+0;

        else if(key_tmp==2)

            key=key+4;

        else if(key_tmp==4)

            key=key+8;

        else if(key_tmp==8)

            key=key+12;

        else

            key=16;

   return key;

}

 

 

int alt_main(void)

//int main(void)

{

    alt_u8 key=16;

    while(1)

    {

    while((key=KeyScan())!=16)

    {

        printf("key= %d/n",key);

        IOWR_ALTERA_AVALON_PIO_DATA(LED_SHOW_BASE,key);

        IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO8_BASE,key);

    }

    }

       

    return 0;

}

上面的程序也是单片机中对于键盘的扫描的线性反转法的等同表示,同样能够成功运行。

 

注意点:

         本程序中用到了printf,要在IDE环境中的下方Console输出,所以需要给系统硬件配置的时候添加jtag_uart, jtag串口通信,才能实现输出到屏幕。

         很多具体的小问题我会在最后的经验总结中总结下,现在还在整理中。最近过的是非人的生活,天天泡在实验室里,并且网上的资料也比较少,而且英文的。。。所以发出来大家都参考下,希望有兴趣于nios系统开发大家一起谈论,可以给我留言,我也是刚开始弄得,属于一个不断摸索并且碰壁的菜鸟一个,呵呵。

 

过几天等系统都做完了,再共享些程序呀。。。今天先到这吧。

 

你可能感兴趣的:(timer,生活,ide,input,delay)