LED、DIP SWITCH 元件控制

Download Report

Transcript LED、DIP SWITCH 元件控制

SWITCH&7-SEG元件控制
嵌入式作業系統實作
11/17
週邊I/O map
I/O
offset
說明
IO_REG0
IO_REG1
IO_REG2
0X0C00
0X0C02
0X0C04
7 Segment(七段顯示器)
Switch和Keypad讀入
LED和Keypad Scan輸出
Ox3F00C06
Ox3F00C04
Ox3F00C02
Ox3F00C00
Ox3F00000
IO_REG2
2byte = 16bits
IO_REG1
2byte = 16bits
IO_REG0
2byte = 16bits
各I/O之位元定義
bit
Reg
IO_REG0
IO_REG1
7
6
5
4
3
2
1
0
15
14
13
12
11
10
9
8
SEG_H
SEG_G
SEG_F
SEG_E
SEG_D
SEG_C
SEG_B
SEG_A
COM3
COM2
COM1
COM0
S1.3
S1.2
S1.1
S1.0
SCAN_
I3
SCAN_
I2
SCAN_
I1
SCAN_
I0
SCAN_
O3
SCAN_
O2
SCAN_
O1
SCAN_
O0
D3
D2
D1
D0
S1.7
S1.6
S1.5
S1.4
IO_REG2
D7
D6
D5
D4
DIP Switch & 7 Segment

DIP SWITCH


Creator提供之switch(S1.0~S1.7),邏輯0代表ON,邏
輯1代表OFF
7 Segment

Creator提供之7段顯示器的7個LED(SEG_A~SEG_G)
以及1個小數點(SEG_H),邏輯0代表亮,邏輯1代表滅
7 Segment


COM0 = 0 則 D5 會亮
若要顯示數字5,則


SEG_A = SEG_F = SEG_G = SEG_C = SEG_D = 0
SEG_B = SEG_E = SEG_H = 1
 IO_REG0 = 0xfe92 (在COM0顯示5)
7 Segment
數字
SEG_H
SEG_G
SEG_F
SEG_E
SEG_D
SEG_C
SEG_B
SEG_A
0
0xc0
1
1
0
0
0
0
0
0
1
0xf9
1
1
1
1
1
0
0
1
2
0xa4
1
0
1
0
0
1
0
0
3
0xb0
1
0
1
1
0
0
0
0
4
0x99
1
0
0
1
1
0
0
1
5
0x92
1
0
0
1
0
0
1
0
6
0x82
1
0
0
0
0
0
1
0
7
0xd8
1
1
0
1
1
0
0
0
8
0x80
1
0
0
0
0
0
0
0
9
0x98
1
0
0
1
1
0
0
0
顯示多個七段顯示器一同顯示

由於IO_REG0只有一組顯示七段顯示器的輸出,而4510
的版子卻有4組七段顯示器,如何一起顯示出多個七段顯
示器 ?

利用RC充放電非瞬間
可完成
使SEG_A~SEG_H不亮
並且關閉COM0~COM3
重新輸入想要的COM 以及七段顯器
Delay(10) 使其充電達到一定亮度
變數定義 (def.h)
#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8 unsigned char
#define S8 char
#define UL
#define UI
#define UC
#define C
#define I
#define L
U32
U16
U8
S8
S16
S32
/*** return flag ***/
#define OK
1
#define YES
1
#define ON
1
#define TRUE 1
#define FALSE 0
#define UM
0
#define OFF
0
#define NO
0
#define STRMATCH 0
Example
UC ch;
ch = IO_REG1;
Ch為8 bits變數, IO_REG1為16 bits
故 ch = IO_REG1 取 IO_REG1 較低8位元為變數存放值
IO_REG1
7
6
5
4
3
2
1
0
S1.7
S1.6
S1.5
S1.4
S1.3
S1.2
S1.1
S1.0
SCAN_
I3
SCAN_
I2
SCAN_
I1
SCAN_
I0
11
10
9
15
14
13
12
8
範例程式

//number array
int number[10] = {0x0fc0, 0x0ff9, 0x0fa4,
0x0fb0, 0x0f99,0x0f92, 0x0f82, 0x0fD8,
0x0f80, 0x0f98};

//segment array
int seg[4] = {0x0eff, 0x0dff, 0x0bff, 0x07ff};
範例程式

void segment(int com, int value)
{
//what segment will light
IO_REG0 = seg[com];
//what number will light
IO_REG0 &= number[value];
}
範例程式(1)

int main(void) {
unsigned char dip;
while(1) {
segment(3,7); //display “7” in COM3
}
return 0;
}
範例程式(2)

int main(void) {
unsigned char dip;
while(1) {
IO_REG0 = 0x0fff; //clear all seg & com
segment(3,7);
Delay(10);
IO_REG0 = 0x0fff; //clear all seg & com
segment(2,6);
Delay(10);
// display “7” in COM3 and “6” in COM2
}
return 0;
}
實習
實習一:將範例上的七階顯示器的程式改成顯示為閃爍的〝5684〞
實習二:將範例上的七階顯示器的程式改成以SWITCH的二進位來控制的七
段顯示器(範圍0~255,顯示為10進位)
EX:
 00000111b  “7”  0007
實習三:實作出一個可即時改變上數下數的記數器,每0.4s跳動一次,並
以swtich0做開關控制(範圍0~9999)
(swtch0 off = 上數)
(swtch0 ON = 下數)
(當9999往上數0000)
(當0000往下數9999)
作完請找助教檢查