一、七段数码管电路原理:
从图 可知要让某个数字亮起必须满足两个逻辑条件:
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
#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
最后数码管上轮流动态显示出来的就是我的生日2018-12-15啦,新的一岁真的要继续冲鸭,咸鱼也得挣扎一下。