本文討論如何在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 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);
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)
文章评论(0条评论)
登录后参与讨论