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_tchar 。因此,學習位元運算(bitwise operations)是非常重要的。

![圖 1](https://hackmd.io/_uploads/Hy502h25ye.png =500x)

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

![圖 2](https://hackmd.io/_uploads/SJLn56hqyg.png =250x)

接腳是如何連接到七段顯示器的。

#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:

  1. Explain the usage of the following code:
    temp = SEG_BUF[number];
    for (i = 0; i < 8; i++)
        temp = temp >> 1;
    
  2. What does (temp & 0x01) == 0x01 mean?
  3. 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 的組合應用。