Abstract
本文討論如何在Nios II控制8位數的七段顯示器。

Introduction
使用環境:Quartus II 8.0 + Nios II EDS 8.0 + DE2-70 (Cyclone II EP2C70F896C6N)

(原創) 如何在Nios II顯示8位數的七段顯示器? (IC Design) (DE2) (Nios II)討論的是DE2平台,到了DE2-70平台,控制七段顯示器的方式有些改變:

1.七段顯示器多了8個小數點可控制。
2.友晶科技提供了新的七段顯示器ip,其HAL也不太一樣。

本文使用(原創) 哪裡有DE2-70的Nios II reference design可以參考? (SOC) (DE2-70) (Nios II) (SOPC Builder)所提供的範例為基礎討論。

SOPC Builder部分
使用友晶科技所提供SEG7_IF ip

Top Module部分
請參考(原創) 哪裡有DE2-70的Nios II reference design可以參考? (SOC) (DE2-70) (Nios II) (SOPC Builder)

使用HAL控制七段顯示器

將\DE2_70_NIOS_10_seg7\ip\TERASIC_SEG7\software\的SEG7.c與SEG7.h 複製到\DE2_70_NIOS_10_seg7\software\hello_world_0\,必須將SEG7.h與SEG7.c做些修改。

SEG7.h / C

1 #ifndef SEG7_H_2 #define SEG7_H_3 4 #include "alt_types.h"5 6 void SEG7_Clear(void);7 void SEG7_Full(void);8 void SEG7_Hex(alt_u32 Data, alt_u8 point_mask);9 void SEG7_Decimal(alt_u32 Data, alt_u8 point_mask);10 void SEG7_Number(void);11 12 #endif /*SEG7_H_*/

4行

#include "alt_types.h"

增加inlucde alt_types.h,因為alt_u32定義在alt_types.h

6行

void SEG7_Clear(void);void SEG7_Full(void);void SEG7_Hex(alt_u32 Data, alt_u8 point_mask);void SEG7_Decimal(alt_u32 Data, alt_u8 point_mask);void SEG7_Number(void);

提供5個HAL讓我們可以在Nios II用C去控制七段顯示器。

SEG7_Clear():將8個七段顯示器全部清空不顯示(不是0,是完全不顯示)。
SEG7_Full():將8個七段顯示器全部顯示8。
SEG7_Hex():將8個七段顯示器以16進位顯示,第2個參數可控制小數點,如0x10表示顯示第5個小數點。
SEG7_Decimal():將8個七段顯示器以10進位顯示,第2個參數可控制小數點,如0x10表示顯示第5個小數點。
SEG7_Numer(): 將8個七段顯示器從左至右顯示76543210。

SEG7.c / C

1 #include "system.h"2 #include "alt_types.h"3 #include "io.h"4 #include "SEG7.h"5 6 #define SEG7_SET(index, seg_mask) IOWR(SEG7_BASE,index,seg_mask)7 #define SEG7_NUM 88 9 static unsigned char szMap[] = {10   63, 6, 91, 79, 102, 109, 125, 7, 11   127, 111, 119, 124, 57, 94, 121, 11312 };  // 0,1,2,.9, a, b, c, d, e, f13     14 void SEG7_Clear(void) {15   int i;16   17   for(i=0; i<SEG7_NUM; i++)18     SEG7_SET(i, 0x00);19 }20 21 void SEG7_Full(void) {22   int i;23   24   for(i=0; i<SEG7_NUM; i++)25     SEG7_SET(i, 0xFF);26 }27 28 void SEG7_Number(void) {29   int i;30 31   for(i=0;i<SEG7_NUM;i++)32     SEG7_SET(i, szMap[i]);33 }34 35 void SEG7_Hex(alt_u32 Data, alt_u8 point_mask) {36   alt_u8 mask = 0x01;37   alt_u8 seg_mask;38   int i;39     40   seg_mask = 0;41   for(i = 0; i < SEG7_NUM; i++) {42     seg_mask = szMap[Data & 0x0F];43     Data >>= 4;44 45     if (point_mask & mask)46       seg_mask |= 0x80;47       48     mask <<= 1;49     SEG7_SET(i, seg_mask);50   }51 }52 53 void SEG7_Decimal(alt_u32 Data, alt_u8 point_mask) {54   alt_u8 mask = 0x01;55   alt_u8 seg_mask;56   int i;57   seg_mask = 0;58   59   for(i = 0; i < SEG7_NUM; i++) {60     seg_mask = szMap[Data%10];61     Data /= 10;62     63     if (point_mask & mask)64       seg_mask |= 0x80;65       66     mask <<= 1;67     SEG7_SET(i, seg_mask);68   }69 }

1行

#include "system.h"#include "alt_types.h"#include "io.h"#include "SEG7.h"

將原來的include改成如上所示。io.h定義了IOWR()。

hello_world.c / C

1 /* 2 (C) OOMusou 2008 http://oomusou.cnblogs.com3 4 Filename    : hello_world.c5 Compiler    : Nios II gcc6 Description : Demo how to display 7 seg. on DE2-707 Release     : 10/20/2008 1.08 */9 #include <stdio.h>10 #include "system.h"11 #include "unistd.h" // usleep()12 #include "SEG7.h"   // SEG7_Hex()13 14 int main() {15   int i;16   for(i = 0; i != 100; i++)  {17     usleep(1 * 1000 * 1000);18     SEG7_Hex(i, 0x10);19   }20 }

使用SEG7_Hex()從1數到100。

完整程式碼下載
DE2_70_NIOS_10_seg7.7z

Conclusion
七段顯示器是大家常用的debug工具,無論是寫Verilog或是寫C,利用友晶提供的TERASIC_SEG7 ip,我們也可以在Nios II利用C控制七段顯示器。

See Also
(原創) 如何在Nios II顯示8位數的七段顯示器? (IC Design) (DE2) (Nios II)
(原創) 哪裡有DE2-70的Nios II reference design可以參考? (SOC) (DE2-70) (Nios II) (SOPC Builder)

(原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)的更多相关文章

  1. Windows Server 2012 R2在桌面上顯示我的電腦等圖示

    Windows Server 2012 R2在桌面上顯示我的電腦等圖示   從Windows2012開始,微軟取消了服務器桌面個性化選項,如何重新調出配置界面,可以使用微軟命令調出.方法如下: 同時按 ...

  2. 【原】如何在jQuery中实现闭包

    原生JS中,闭包虽好用,但是很难用好,在jQuery中一样,都有一些点需要我们注意.jQuery中使用闭包的常见情况有以下几种: 1.$(document).ready()的参数 我们在写jQuery ...

  3. (原創) Gvim 個人習慣常用設定 (vim)

    不定期更新這篇,因為查詢到好用的設定或者插件就會更新自己的設定. "set nocompatible let $LANG='zh_TW.UTF-8' set langmenu=zh_tw.u ...

  4. WCF最简单的一次通信(有部分參考,多爲原創)

    不廢話,直接上乾貨 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.msdn的wcf教程还要求输 ...

  5. 如何在Win10下设置图片的浏览方式为windows照片查看器

    小编前些天刚装好了win10,一阵心奋啊,今天刚打开一个图片,却发现图片的默认打开方式是window应用商店的app, 这让我觉得特别不舒服,没有之前windows自带的照片查看器好用,后来我本想进入 ...

  6. 如何在WIN7_64环境下安装Oracle10g_64位版本

    转载请注明出处http://www.cnblogs.com/SharpL/p/4338638.html 1.如果之前安装过Oracle软件,建议完全卸载(究竟有没有必要_不知道_我是这么做的) 2.清 ...

  7. Nios II的Boot过程分析

    目录 1       概述....................................................................... 1 2       几种常见的 ...

  8. 关于Nios II的启动分析(转载)

    原文地址:http://hi.baidu.com/goatdai/item/cc33671545d89243e75e06ad 常用到的存储器包括SDRMA.SRAM.FLASH.Onchip_memo ...

  9. 如何在niosII中添加i2c外设_winday_新浪博客

    如何在niosII中添加i2c外设_winday_新浪博客 如何在niosII中添加i2c外设 winday 摘要:本文说明了如何在niosII添加第三方i2c外设,以供参考. 由于本人使用的Alte ...

随机推荐

  1. Level Up - ICPC Southeastern Europe Contest 2019(简单DP)

    题意:Steve玩魔兽世界要做任务升两级,任务在你不同的等级给的经验不同,输入任务数量和升第一级和升第二级需要的经验,接着输入每个任务第一级完成给的经验和花费的时间.第二级级完成给的经验和花费的时间. ...

  2. 关于微信小程序的一点经验

    2018年的11月份,自己做微信小程序相关的项目已经有四个月,这四个月自己走过很多弯路,也学到了不少经验,下面就一一总结: 一,微信小程序的radio组件是可以改变按钮样式的(比如大小,颜色等等) 改 ...

  3. Linux管理,例行性工作,at和cron

    at 仅执行一次就结束调度(服务atd必须启动) at的配置信息 1.我们设定的at进程其实都是被以文本的方式写入到/var/spool/at/目录内,然后这些设定的进程便会等待atd服务来启动这些进 ...

  4. Linux系统安装Dos系统(虚拟机里装)

    结合以下两篇优秀的文章就能完成任务. 1.https://www.jb51.net/os/609411.html 2.http://blog.51cto.com/6241809/1687361 所需要 ...

  5. Deep Dream模型与实现

    Deep Dream是谷歌公司在2015年公布的一项有趣的技术.在训练好的卷积神经网络中,只需要设定几个参数,就可以通过这项技术生成一张图像. 本文章的代码和图片都放在我的github上,想实现本文代 ...

  6. C++静态库和动态库

    静态库与动态库 首先简单介绍一下gcc 指令 ubuntu 下安装gcc g++ 方法 sudo apt install gcc g++ gcc 的简单使用 建立hello.c 源文件 gcc hel ...

  7. lr集合点

    集合点:rendezvous point =====>>loadrunner的虚拟用户中,并发concurrent\ 同时simultaneous的区别: concurrent并发:指虚拟 ...

  8. bat中的特殊字符,以及需要在bat中当做字符如何处理

    bat中的特殊字符,以及需要在bat中当做字符如何处理 (2014-02-27 21:16:55) 转载▼ 标签: bat 特殊字符 分类: develop bat中的特殊字符,以及需要在bat中当做 ...

  9. AJ学IOS 之CoreLocation反地理编码小Demo输入经纬度得到城市

    AJ分享,必须精品 一:效果 输入经纬度,可以得到相应的地名 二:思路 跟地里编码差不多 1.获取用户输入的经纬度 2.根据用户输入的经纬度创建CLLocation对象 3.根据CLLocation对 ...

  10. delphi 捕捉全局异常错误的方法

    private     { Private declarations }   public   procedure GlobalExceptionHandler(Sender: TObject; E: ...