To be completed!
# 嵌入式系統設計:實驗 2
這是一個透過七段顯示器顯示數字的範例。
#include <stdio.h>
#include "NUC100Series.h"
#include "MCU_init.h"
#include "SYS_init.h"
#include "Seven_Segment.h"
// display an integer on four 7-segment LEDs
void Display_7seg(uint16_t value)
{
uint8_t digit;
digit = value / 1000;
CloseSevenSegment();
ShowSevenSegment(3,digit);
CLK_SysTickDelay(5000);
value = value - digit * 1000;
digit = value / 100;
CloseSevenSegment();
ShowSevenSegment(2,digit);
CLK_SysTickDelay(5000);
value = value - digit * 100;
digit = value / 10;
CloseSevenSegment();
ShowSevenSegment(1,digit);
CLK_SysTickDelay(5000);
value = value - digit * 10;
digit = value;
CloseSevenSegment();
ShowSevenSegment(0,digit);
CLK_SysTickDelay(5000);
}
int main(void)
{
SYS_Init();
OpenSevenSegment();
Display_7seg(399);
}
在這個實驗中,理解「七段顯示器(7-Segment Display)」是最重要的部分。在撰寫專案程式碼之前,請先試著了解這些函式是如何設計來與底層硬體互動的。
在設計嵌入式系統時,另一個重要的觀念是:最小的資料單位是「位元(bit)」,而不是 uint32_t 或 char 。因此,學習位元運算(bitwise operations)是非常重要的。

用一個位元組(8 個位元)來表示七段顯示器的訊號。

接腳是如何連接到七段顯示器的。
#define SEG_N0 0x82
#define SEG_N1 0xEE
#define SEG_N2 0x07
#define SEG_N3 0x46
#define SEG_N4 0x6A
#define SEG_N5 0x52
#define SEG_N6 0x12
#define SEG_N7 0xE6
#define SEG_N8 0x02
#define SEG_N9 0x62
#define SEG_N10 0x22
#define SEG_N11 0x1A
#define SEG_N12 0x93
#define SEG_N13 0x0E
#define SEG_N14 0x13
#define SEG_N15 0x33
uint8_t SEG_BUF[16] = {
SEG_N0, SEG_N1, SEG_N2, SEG_N3,
SEG_N4, SEG_N5, SEG_N6, SEG_N7,
SEG_N8, SEG_N9, SEG_N10, SEG_N11,
SEG_N12, SEG_N13, SEG_N14, SEG_N15
};
void ShowSevenSegment(uint8_t no, uint8_t number)
{
uint8_t temp, i;
temp = SEG_BUF[number];
for (i = 0; i < 8; i++)
{
if ((temp & 0x01) == 0x01)
switch (i) {
case 0: PE0 = 1; break;
case 1: PE1 = 1; break;
case 2: PE2 = 1; break;
case 3: PE3 = 1; break;
case 4: PE4 = 1; break;
case 5: PE5 = 1; break;
case 6: PE6 = 1; break;
case 7: PE7 = 1; break;
}
else
switch (i) {
case 0: PE0 = 0; break;
case 1: PE1 = 0; break;
case 2: PE2 = 0; break;
case 3: PE3 = 0; break;
case 4: PE4 = 0; break;
case 5: PE5 = 0; break;
case 6: PE6 = 0; break;
case 7: PE7 = 0; break;
}
temp = temp >> 1;
}
switch (no) {
case 0: PC4 = 1; break;
case 1: PC5 = 1; break;
case 2: PC6 = 1; break;
case 3: PC7 = 1; break;
}
}
Questions:
- Explain the usage of the following code:
temp = SEG_BUF[number]; for (i = 0; i < 8; i++) temp = temp >> 1; - What does
(temp & 0x01) == 0x01mean? - Explain the usage of the following code:
switch (no) { case 0: PC4 = 1; break; case 1: PC5 = 1; break; case 2: PC6 = 1; break; case 3: PC7 = 1; break; }
# 實作
7-Segment 和 Keypad 的組合應用。