SWITCH&7-SEG 元件控制
description
Transcript of SWITCH&7-SEG 元件控制
SWITCH&7-SEG 元件控制嵌入式作業系統實作
11/17
週邊 I/O mapI/O offset 說明
IO_REG0 0X0C00 7 Segment( 七段顯示器 )IO_REG1 0X0C02 Switch 和 Keypad 讀入IO_REG2 0X0C04 LED 和 Keypad Scan 輸出
Ox3F00000
Ox3F00C00
Ox3F00C02
Ox3F00C04
Ox3F00C06
2byte = 16bits
2byte = 16bits
2byte = 16bits
IO_REG0
IO_REG1
IO_REG2
各 I/O 之位元定義7 6 5 4 3 2 1 0
15 14 13 12 11 10 9 8
IO_REG0SEG_H SEG_G SEG_F SEG_E SEG_D SEG_C SEG_B SEG_A
COM3 COM2 COM1 COM0
IO_REG1S1.7 S1.6 S1.5 S1.4 S1.3 S1.2 S1.1 S1.0
SCAN_I3
SCAN_I2
SCAN_I1
SCAN_I0
IO_REG2
SCAN_O3
SCAN_O2
SCAN_O1
SCAN_O0
D7 D6 D5 D4 D3 D2 D1 D0
bit
Reg
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)
/*** 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
#define U32 unsigned int#define U16 unsigned short#define S32 int#define S16 short int#define U8 unsigned char#define S8 char
#define UL U32#define UI U16#define UC U8#define C S8#define I S16#define L S32
ExampleUC ch;ch = IO_REG1;
Ch 為 8 bits 變數, IO_REG1 為 16 bits故 ch = IO_REG1 取 IO_REG1 較低 8 位元為變數存放值
IO_REG1S1.7 S1.6 S1.5 S1.4 S1.3 S1.2 S1.1 S1.0
SCAN_I3
SCAN_I2
SCAN_I1
SCAN_I0
7 6 5 4 3 2 1 0
15 14 13 12 11 10 9 8
範例程式 //number array
int number[10] = {0x0fc0, 0x0ff9, 0x0fa4, 0x0fb0, 0x0f99,0x0f92, 0x0f82, 0x0fD8, 0x0f80, 0x0f98};
//segment arrayint 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 & comsegment(3,7);Delay(10);
IO_REG0 = 0x0fff; //clear all seg & comsegment(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)作完請找助教檢查