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)