Menu Close

RISC-V C语言编程2(2)GPIO输入捕获(按键)

1.原理图分析

 

相关参考文章:

RISC-V教学教案

 

上一篇文章介绍了数码管的显示,其中数码管的位选段选都是作为GPIO的输出,本实验使用按键作为GPIO输入的测试,并结合数码管显示,实现简单的人机界面的交互。

先简单介绍下按键的原理图。这里按键被当作GPIO输入。

  • 按下按键时,按键左侧和右侧接线连通,VCC电压将通过一个电阻降压,然后接地。 这样,FPGA布线将直接接地,从而处于低压状态。
  • 否则,可以将其视为开路。 如果按键是开路,则VCC无法降压,因此不会产生电流流经电阻,FPGA布线的电压将与VCC相同,为高电平。

%title插图%num

图1 按键原理图接线

 

按键相关的寄存器通过查找RISC-V CPU内核可以得知,为GPIO D组,具体地址可以参考地址图

 

2.按键工程

RISC-V C语言编程2(1)数码管工程前面的步骤相同,将目标工程导入Freedom Studio,如图2所示。实验现象是,按下按键(此处仅实现了三个按钮:menu,up和return),相应的数码管显示将从“1”更改为“0”。

实验现象如下:

 

%title插图%num

图2 RISCV_button工程

 

除了RISCV_button的主程序与RISCV_seg_cnt(见RISC-V C语言编程2(1)数码管工程)的主程序不同之外,其他头文件均相同。 因此,这里只会列出main.c文件。 详细信息将在代码模块中注释说明。

  • Main.c
#include <stdio.h>               //引用标准的I / O库,主要用于声明printf函数

#include "platform.h"            //用户自定义的函数库,包括GPIO配置,内存空间以及相关的子函数和参数的定义

#define NOP_DELAY 0x00000100     //定义一个宏,可根据需要修改

int main(void)                   //按键工程主函数
{
    unsigned int  curr_seat = 0x01;           //初始化数码管初始位置
    volatile unsigned int  i;                 //临时变量,用于延迟循环
    unsigned int  curr_gpio_val;              //读取当前按键值

    GPIO_REG(SEAT_DIR) = 0;      //数码管位选方向为输出
    GPIO_REG(SEG_DIR) = 0;       //数码管段选方向为输出
    GPIO_REG(BUT_DIR) = ~0L;     //按键方向位输入
    GPIO_REG(SEG_VAL) = ~SEG__;  //初始化数码管显示为空,取反参见原理图接线

    printf("\r\nThis is a button test program. \r\n");

    while (1)      //主循环
    {
        curr_gpio_val = GPIO_REG(BUT_VAL);        //读取当前按键值
        GPIO_REG(SEAT_VAL) = ~curr_seat;          //设置数码管当前显示位置,取反参见原理图接线

        if(curr_gpio_val & curr_seat)  //决策判断,如果读取的位置不对应
                                       //按键和对应的数码管数值按位相等操作
                                       //按键被取反,参见原理图接线(按键按下-》低电平,按键松开-》高电平)

            GPIO_REG(SEG_VAL) = ~SEG_1;  //显示 ‘1’

        else  //如果读取的位置对应
            GPIO_REG(SEG_VAL) = ~SEG_0;  //显示 ‘0’

        for(i = 0; i < NOP_DELAY; i ++ )   //数码管显示延迟时间
            asm("nop");

        curr_seat = curr_seat << 1;        //数码管显示位置左移一位

        if(curr_seat == 0x08) curr_seat = 0x01;    //决策判断数码管是否显示超过第三位(只有三个数码管对应三个按键)
    }
}

 

按键工程下载:

RISCV_button

Posted in C语言, FPGA, RISC-V, RISC-V, 应用开发, 开发板, 文章, 编程语言

发表评论

相关链接