本帖最后由 Milinker_XU 于 2016-1-12 21:49 编辑
有了上一章对GPIO的学习,这一章将会更加轻松。本章我们来使用Buttom控制不同的功能,每个按钮作用不一样。 ◎在LED工程基础上,添加AXI GPIO。将GPIO命名为Buttom,数据宽度保持和mis603一致,5bit。
◎在Ports中在Buttom的下拉列表中选择GPIO_IO_I为外部输出,GPIO_IO不连接到输出。因为Buttom仅仅是输入。此时在mhs中已经可以看到对应的硬件信息了。 ◎在UCF文件中添加Buttom的约束文件。添加完成后,产生网表。
◎同样,在ISE中产生top文件后,进行编译并产生bit文件。 ◎从XPS中进入SDK开发环境,确保system.xml有新添加的ip版本号,新建个空的工程。工程命名为Buttom。
◎同样新建个源文件,命名为buttom.c文件。
◎现在硬件系统中既有输入IO,又有输出IO,那么就可以使用LED灯和Buttom来互相测试。在buttom.c文件中输入测试代码,代码如下所示。
/* * buttom.c * * Created on: 2016-1-10 * Author: Milinker XU */ #include "xparameters.h" #include "xgpio.h" #include "stdio.h" #include "xil_types.h" #include "platform.h" void putnum(unsigned int num); void print(char *ptr); void delay_ms(u16 tnms)//不精确的延迟 { u16 n1,n2; for(n1=0; n1<2500; n1++) for(n2=0;n2<tnms;n2++); } int main() { u8 btn; int i; u32 led; led=0xFFFFFFFF; init_platform(); while(1) { btn=XGpio_In32(XPAR_BUTTOM_BASEADDR); if(btn==15) { printf("You enter the left buttom!\n\r"); led=~0x01; XGpio_Out32(XPAR_LED_BASEADDR,led); } else if(btn==23) { printf("You enter the bottom buttom!\n\r"); led=~0x02; XGpio_Out32(XPAR_LED_BASEADDR,led); } else if(btn==27) { printf("You enter the center buttom!\n\r"); led=~0x04; XGpio_Out32(XPAR_LED_BASEADDR,led); } else if(btn==29) { printf("You enter the UP buttom!\n\r"); led=~0x08; XGpio_Out32(XPAR_LED_BASEADDR,led); } else if(btn==30) { printf("You enter the center right!\n\r"); printf("Let's have water light flow!"); i=0; led=0xFE; while(i<8) { XGpio_Out32(XPAR_LED_BASEADDR,led); led<<=1; i++; delay_ms(100); } } else XGpio_Out32(XPAR_LED_BASEADDR,0xFFFFFFFF); } return 0; } |
◎编译完成后,下载bit文件,并运行软件。 ◎分析上面代码可知:当按下Left按钮时,显示第一个灯亮,按下bottom按钮时,显示第二个灯,按下center按钮时,显示第三个灯,按下up按钮时,显示第四个灯,按下right按钮时,8个led灯依次点亮。
|