基于ZYNQ的嵌入式学习笔记二(7段数码管显示我的生日)

一、七段数码管电路原理:

从图 可知要让某个数字亮起必须满足两个逻辑条件:
1. 对应的 LED_SEL 必须为’0’;
2. 代表对应笔画的 LEDX_BUSX 必须为’1’;
例如需要最左边的数码管亮起数字 0,则首先必须让 LED_SEL0 为’0’,然后
LED0_BUS 上对应的 8 位二进制数应该为”00111111”,换算成 16 进制就是 0x3F。因此在 3
个 8 位总线上 LED0_BUS 输出 0x3F,LED1_BUS 输出 0,LED_SEL 输出 0xFE 即可让最
左边的 7 段数码管亮起数字 0。

即显示顺序是从“日”字最上面一横开始,顺时针绕一圈,中间一横然后点是最后一位。

 

二、在Vivado中进行Block Design,生成HDL,综合,生成bit流文件并Export之后,在SDK中写入C语言部分,静态显示的代码如下:

连接七段数码管的GPIO由于上次用的是AXI GPIO,这次采用的是EMIO的方式。24位EMIO从低位到高位依次为LED0 BUS[0-7],LED1 BUS[0-7],LED SEL[0-7]。

三、代码:

#include <stdio.h>
#include "xparameters.h" //硬件参数定义头文件
#include "platform.h"    //平台定义头文件
#include "xil_printf.h"  //串口输出库函数头文件
#include "xgpiops.h"     //PS部分GPIO库函数头文件
#include "xstatus.h"     //状态代码定义头文件

#define GPIO_DEVICE_ID  XPAR_XGPIOPS_0_DEVICE_ID //在xparameters.h中找到EMIO对应ID
#define LED_DELAY 100000
#define LED 0x01 //一次点亮1bit
#define LED_BANK 0x02 //输出的pins bank

static int emerge_ledbus(int ledbus0,int ledbus1,int ledsel);
XGpioPs Gpio; //GPIO驱动实例化

int main(void)
{
   int Status;
   int led_bus0[8]={0x5B,0x3F,0x06,0x7F,0x00,0x00,0x00,0x00};
   int led_bus1[8]={0x00,0x00,0x00,0x00,0x06,0x5B,0x06,0x6D};
   int led_sel=0x01;
   xil_printf("Start to display the 7segment leds\r\n");
   XGpioPs_Config *ConfigPtr;
   int Type_of_board;
   /*获取板子信息*/
   switch(Type_of_board) {
   case XPLAT_ZYNQ_ULTRA_MP:
   printf("It's a ZYNQ_ULTRA board\r\n");
   break;
   case XPLAT_ZYNQ:
   printf("It's a ZYNQ board\r\n");
   break;
   }
   /*初始化GPIO驱动*/
ConfigPtr=XGpioPs_LookupConfig(GPIO_DEVICE_ID);//找到ID对应的设备
Status=XGpioPs_CfgInitialize(&Gpio,ConfigPtr,ConfigPtr->BaseAddr);
if(Status!=XST_SUCCESS){
	return XST_FAILURE;
}
XGpioPs_SetDirection(&Gpio,LED_BANK,0xFFFFFF);//设置全1为输出,这和AXI GPIO中刚好相反
XGpioPs_SetOutputEnable(&Gpio,LED_BANK,0xFFFFFF);//1是允许
while(1)
{
	for(int i=0;i<8;i++){
		XGpioPs_Write(&Gpio,LED_BANK,emerge_ledbus(0,0,0xFF));//熄灭的所有灯
		XGpioPs_Write(&Gpio,LED_BANK,emerge_ledbus(led_bus0[i],led_bus1[i],(led_sel<<1)));
		for(int Delay=0;Delay<LED_DELAY;Delay++);
	}
	}
}
static int emerge_ledbus(int ledbus0,int ledbus1,int ledsel)//控制七段数码管
{
	return ledbus0+(ledbus1<<8)+(ledsel<<16);
	/*在24位管脚约束部分由低到高的设置为led0 bus,led1 bus,led sel*/
	}

最后数码管上轮流动态显示出来的就是我的生日2018-12-15啦,新的一岁真的要继续冲鸭,咸鱼也得挣扎一下。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值