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

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

de2_70_seg7_00

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 8
8 
9 static unsigned char szMap[] = {
10   63, 6, 91, 79, 102, 109, 125, 7,
11   127, 111, 119, 124, 57, 94, 121, 113
12 };  // 0,1,2,.9, a, b, c, d, e, f
13    
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.com
3 
4 Filename    : hello_world.c
5 Compiler    : Nios II gcc
6 Description : Demo how to display 7 seg. on DE2-70
7 Release     : 10/20/2008 1.0
8 */
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)

posted on 2008-10-21 10:35  真 OO无双  阅读(4903)  评论(4编辑  收藏  举报

导航