• 沒有找到結果。

† 7段顯示器

N/A
N/A
Protected

Academic year: 2022

Share "† 7段顯示器"

Copied!
68
0
0

加載中.... (立即查看全文)

全文

(1)

第4章

I/O埠基本輸入輸出控制

(2)

基本輸入輸出控制

† LED

† 7段顯示器

† 指撥開關

† 按鈕開關

† 四位數7段顯示器多工掃描

† 文字型LCD

(3)

I/O 埠結構圖

(4)

埠結構圖(輸出)

(5)

埠結構圖(下拉輸入)

(6)

埠結構圖(上拉輸入)

(7)

A 埠相關的暫存器

„P_IOA_Dir(讀/寫)($7002H ) A 埠的方向暫存器

„P_IOA_Attrib(讀/寫)($7003H) A 埠的屬性暫存器

„P_IOA_Data(讀/寫)($7000H) A 埠的資料暫存器

„P_IOA_Buffer (讀/寫) ($7001H) A 埠的緩衝暫存器

„P_IOA_Latch(讀)($7004H) A 埠的栓鎖暫存器

(8)

B 埠相關的暫存器

„P_IOB_Dir(讀/寫)($7007H ) B 埠的方向暫存器

„P_IOB_Attrib(讀/寫)($7008H) B 埠的屬性暫存器

„P_IOB_Data(讀/寫)($7005H) B 埠的資料暫存器

„P_IOB_Buffer (讀/寫) ($7006H) B 埠的緩衝暫存器

(9)

P_IOA_Data 與 P_IOA_Buffer 區別

†

讀取 IO 埠

„ 從埠讀取資料的兩種方式:從 P_IOA_Data 讀取資料相 當於讀取埠接腳的訊號。 然而,從 P_IOA_Buffer 讀取 資料相當於從資料暫存器中讀取資料。

„ data = *P_IOA_Buffer//從 A 埠資料暫存器中讀取資料

„ data = *P_IOA_Data //從 A 埠接腳讀取資料

†

寫入 IO 埠

„ 這裏有兩種寫入IOA 資料的方法,向 P_IOA_Data 寫入 資料結果等於向 P_IOA_Buffer 寫入資料。

„ data = 0x0000;

„ *P_IOA_Data = data ;//寫資料到 P_IOA_Data

„

(10)

I/O 埠的組合控制設定

具資料反相器的低電位輸

低電位輸出(帶資料反相 器)

1 0

1

具資料反相器的高電位輸

高電位輸出(帶資料反相 0 器)

0 1

懸浮式輸入接腳

1 懸浮 1

0

懸浮式輸入接腳

0 懸浮 1

0

具上拉電阻的輸入接腳

1 上拉 0

0

具下拉電阻的輸入接腳

0 下拉 0

0

功能描述 是否具

喚醒功能 Data 功能

Attribution Direction

(11)

規劃IO埠

†

規劃IOA[3~0] 為具下拉電阻的輸入埠,

IOA[7~4]為具上拉電阻的輸入埠,

IOA[11~8]為具資料暫存器的高電位輸出埠,

IOA[15~12] 為具資料暫存器的低電位輸出埠

†

解:

*P_IOA_Dir = 0xFF00;

*P_IOA_Attrib = 0xFF00;

*P_IOA_Data = 0x0FF0;

(12)

B埠的特殊功能

IOB3設為輸入狀態 外部中斷源(負緣觸發)

EXT2 IOB3

IOB2 為反相輸出方式 IOB4 組成一個 RC

反饋電路 Feedback_Output1

IOB2設為輸入狀態 外部中斷源(負緣觸發)

EXT1 IOB2

SIO 的資料訊號 SDA

IOB1

SIO 的時脈訊號 SCK

IOB0

備註 功能描述

特殊功能 腳位

(13)

B埠的特殊功能 (cont.)

參考UART介面部分 UART 發送埠

Tx IOB10

參考計時器/計數器 部分

TimerB PWM 脈寬調變輸

BPWMO IOB9

參考計時器/計數器 部分

TimerA PWM 脈寬調變輸

APWMO IOB8

參考UART介面部分 UART 接收埠

Rx IOB7

備註 功能描述

特殊功能 腳位

(14)

LED與指撥開關線路圖

(15)

規劃B Port為同相低電位輸出

*P_IOB_Dir=0xffff;

*P_IOB_Attrib=0xffff;

*P_IOB_Data=0x0000 ;

(16)

規劃B Port為反相的低電位輸出

*P_IOB_Dir = 0xffff;

*P_IOB_Attrib = 0x0000;

*P_IOB_Data = 0;

(17)

規劃 A Port 為具下拉電阻輸入

*P_IOA_Dir = 0x0000;

*P_IOA_Attrib = 0x0000;

*P_IOA_Data = 0x0000;

(18)

LED閃爍(B Port)

#include "SPCE061A.H"

int main() {

//規劃BPort為同相低電位輸出

*P_IOB_Dir=0xffff;

*P_IOB_Attrib=0xffff;

*P_IOB_Data=0x0000; //IO初始化完成 while (1) {

*P_IOB_Data=0xff00; //IOB Port 亮

*P_IOB_Data=0xffff; // IOB Port 滅

(19)

IDE 模擬操作(Simulator)

(20)

延遲副程式

void delay(int n) {

int i;

for (i=0; i<n; i++) ;

*P_Watchdog_Clear = 0x0001;

}

(21)

延遲副程式(delay_ms)

void delay_ms(int n) {

int i,j;

for (i = 0; i < n; i++ )

for (j = 0; j < 33 ; j++)

//用示波器量

*P_Watchdog_Clear = 0x0001;

//清除看門狗計數器

}

(22)

LED閃爍(B Port)2

#include "SPCE061A.H"

int main()

{ //規劃BPort為同相低電位輸出

*P_IOB_Dir=0xffff;

*P_IOB_Attrib=0xffff;

*P_IOB_Data=0x0000; //IO初始化完成 while (1) {

*P_IOB_Data=0xff00; //IOB Port 亮 delay_ms(500); // 0.5 秒

*P_IOB_Data=0xffff; // IOB Port 滅 delay_ms(500);

(23)

61開發板

(24)

61實驗箱

(25)

上機操作(ICE)

† 將下載線一邊接電腦Print Port,另外一邊 接開發板(61板)或實驗箱(61箱)

† 調整Jump

† 接上61板或實驗箱(61箱)電源

(26)

IOA 輸入 IOB輸出

void Init_A_Port()

{ //規劃 A Port 為具下拉電阻輸入

*P_IOA_Dir = 0x0000;

*P_IOA_Attrib = 0x0000;

*P_IOA_Data = 0x0000;

}

void Init_B_Port()

{ // B Port為同相低電位輸出

*P_IOB_Dir = 0xffff;

*P_IOB_Attrib = 0xffff;

(27)

程式架構

#include “spce061a.h”

void Init_A_Port();

void Init_B_Port();

void delay_ms( int );

void main()

{ Init_A_Port();

Init_B_Port();

...

}

void Init_A_Port() { ...}

void Init_B_Port() { ... } void delay_ms() { ... }

(28)

LED單燈左移

int main() {

int i;

char

table[8]={0xFFFE,0xFFFD,0xFFFB,0xFFF7,0xFFEF,0xF FDF,0xFFBF,0xFF7F};

Init_B_Port(); //規劃 B Port 為同相低電位輸出 while (1)

for (i =0; i < 8; i++) {

*P_IOB_Data = table[i];

(29)

指撥開關(IOA輸入 IOB輸出)

while (1) {

key = *P_IOA_Data;

key &= 0x00ff;

*P_IOB_Data = key;

}

(30)

清除看門狗計數器 內定約0.75秒自動系統重置

*P_Watchdog_Clear = 0x0001;

(31)

LED花樣變化

1.

B PORT 向左步步高昇(8個LED)

2.

B PORT 向左步步高昇(8個LED)又遞減

3.

B PORT由兩側向中間亮(8個LED)

4.

B PORT由中間向兩側亮(8個LED)

5.

B PORT由兩側向中間亮再中間向兩側亮(8個LED)

6.

B PORT奇數LED同時亮,再來偶數LED同時亮,輪流

交替(8個LED)

7.

B PORT LED左移二回後右移五回,重複輪流(8個 LED)

(32)

掃描按鍵(消除開關彈跳)

unsigned int KeyScan(void) { unsigned int Data;

unsigned int Temp;

Data = *P_IOA_Data; //讀取IOA埠輸入 Data = Data&0x000f; //僅取低4位有效值

if(Data!=0) //非零則表示有鍵按下

{

Delay(); //延時消除彈跳(消除抖動)

Temp = *P_IOA_Data;

Temp = Temp&0x000f; //僅取低4位有效值 if(Data != Temp) Data = 0;

//兩次讀數不相等,則置返回值為0,表示不穩定 }

(33)

開關彈跳Delay

void Delay(void) {

unsigned int Count;

for ( Count = 0; Count <= 3000; Count++ )

*P_Watchdog_Clear = 0x0001;

//清看門狗

}

(34)

掃描按鍵(消除開關彈跳)2

unsigned int KeyScan(void) {

unsigned int Data;

unsigned int Temp;

Data = *P_IOA_Data; //讀取IOA埠輸入 Data = Data & 0x000f; //僅取低4位有效值 delay(10000); //延時去彈跳

*P_Watchdog_Clear = 0x0001; //清看門狗 return Data; //返回鍵值

}

(35)

暫停單燈左移1

int main() {

unsigned int a,key,state=1,i=0;

Init_A_Port(); //規劃 A Port 為帶下拉電阻輸入 Init_B_Port(); //規劃 B Port 為同相低電位輸出 while (1)

{

key = *P_IOA_Data; //讀取 A Port值 key &= 0x000f; //保留右邊 4 bit delay(10000); // 影響靈敏度

if ( key == 0x0001 )

if (state ==1 ) state = 0;

else state = 1;

if (state == 1) {

*P_IOB_Data = table[i++];

if ( i == 8 ) i=0;

} }

(36)

暫停單燈左移2

int main()

{ unsigned int a,key,i=0;

Init_A_Port(); //規劃 A Port 為帶下拉電阻輸入 Init_B_Port(); //規劃 B Port 為同相低電位輸出 while (1)

{

key = KeyScan();

if (key != 0)

if (state == 1) state = 0; else state = 1;

if (state == 1) {

*P_IOB_Data = table[i++];

if ( i == 8 ) i=0;

delay_ms(500);

(37)

七段顯示器示意圖

(38)

七段顯示器接線圖

(39)

0~9往上數

#include "SPCE061a.H"

char

TABLE[10]={0xFFC0,0xFFF9,0xFFA4,0xFFB0,0xFF99,0xFF9 2,0xFF82,0xFFF8,0xFF80,0xFF90}; //共陽

int main() { int i;

Init_B_Port(); //規劃 B Port 為同相低電位輸出 while (1)

for (i = 0; i < 10; i++ ) {

*P_IOB_Data = TABLE[i];

delay_ms(500);

} }

(40)

四位數七段顯示器

† 方法一:4顆七段

„

優點:程式容易撰寫

„

缺點:共須4*9=36隻接腳,消耗電流大

† 方法二: 4顆七段(多工掃描)

„

優點:共須4+8=12隻接腳,消耗電流小

„

缺點:程式較困難,自已送出字型碼

† 方法三: 4顆七段(多工掃描)加7447

„

優點:共須4+4=8隻接腳,消耗電流小

(41)

四位數七段顯示器線路圖

(42)

共陽四位數七段正視圖

(43)

顯示5678

† *P_IOB_Data = 0x00E8;

//個位數

† *P_IOB_Data = 0x00D7;

//十位數

† *P_IOB_Data = 0x00B6;

//百位數

† *P_IOB_Data = 0x0075;

//千位數

† E=1110

† D=1101

† B=1011

† 7=0111

(44)
(45)

LCD模組

† 文字型:2*20, 2*16,4*20(列行)

† 繪圖型:128*64, 320*240,1024*68

(46)

LCD內部方塊圖

(47)

規劃命令

(48)
(49)

寫入命令副程式

void LCD_Cmd(unsigned char cmd) {

*P_IOA_Data =0x8000 ;

// En=1, RW=0, RS=0 write command

*P_IOB_Data = cmd;

// control word

delay(2); // delay

*P_IOA_Data =0x0000;

// E=0; 禁能 LCD

}

(50)

寫入資料副程式

void LCD_SendData(unsigned char data) {

*P_IOA_Data =0xA000 ;

// En=1, RW=0, RS=1 write data

*P_IOB_Data = data; // data word delay(2); // delay

*P_IOA_Data =0x2000; // E=0; 禁能 LCD

}

(51)
(52)

delay副程式

void delay(int n) {

int i;

for (i=0; i<n; i++) ;

*P_Watchdog_Clear = 0x0001;

}

(53)

清除顯示幕副程式

void LCD_Clear_Display() // 清除 顯示幕

{

LCD_Cmd(0x0001);

}

(54)

游標回原位副程式

void LCD_Cursor_Home() {

LCD_Cmd(0x0002);

}

(55)

DD RAM +1,顯示幕不移

void LCD_Entry_Mode_Right() {

LCD_Cmd(0x0006);

}

(56)

DD RAM -1,顯示幕不移

void LCD_Entry_Mode_Left() {

LCD_Cmd(0x0004);

}

(57)

顯示幕ON, 要游標且閃爍

void

LCD_Display_On_Cursor_ON_NOBlink()

{

LCD_Cmd(0x000E);

}

(58)

顯示幕ON, 不要游標

void LCD_Display_On_Cursor_Off {

LCD_Cmd(0x000C);

}

(59)

顯示幕OFF

void LCD_Display_Off() {

LCD_Cmd(0x0008);

}

(60)

顯示幕右移

void LCD_Display_Shift_Right() {

LCD_Cmd(0x001C);

}

(61)

顯示幕左移

void LCD_Display_Shift_Left() {

LCD_Cmd(0x0018);

}

(62)

游標右移

void LCD_Cursor_Shift_Right() {

LCD_Cmd(0x0014);

}

(63)

游標左移

void LCD_Cursor_Shift_Left() {

LCD_Cmd(0x0010);

}

(64)

8 bit傳輸,顯示2行,5*7字型

void LCD_Function_Set() {

LCD_Cmd(0x0038);

}

(65)

設定游標位置 (0~1, 0~19)

void LCD_GotoXY(int row,int col) {

if (row == 0)

LCD_Cmd(0x0080+col);

else LCD_Cmd(0x00C0+col);

}

(66)

LCD_Reset()

void LCD_Reset() {

LCD_Function_Set(); // 8 bit傳輸,顯示2行,5*7 字型

delay(20000);

LCD_Display_Off(); // 顯示幕OFF LCD_Display_On_Cursor_Off();

// 顯示幕ON,不顯示游標,游標不閃爍 LCD_Entry_Mode_Right();

// 顯示完游標右移,游標移位禁能

LCD_Clear_Display(); // 清除顯示幕

(67)
(68)

LCD_Reset副程式

void LCD_Reset() {

LCD_Function_Set();

// 8 bit傳輸,顯示2行,5*7字型 delay(20000);

LCD_Display_Off(); // 顯示幕OFF LCD_Display_On_Cursor_Off(); // 顯示幕 ON,不顯示游標,游標不閃爍

LCD_Entry_Mode_Right();

// 顯示完游標右移,游標移位禁能

LCD_Clear_Display(); // 清除顯示幕

參考文獻

相關文件

 相關係數﹕顯示兩個隨機變數之間線性關係的強度和方向,數值介乎-1 和 1。方向以符號劃分,正值表示相同,負值表示相反。強度則以絕對值 大小衡量,一般而言,小於

— 牛頓, 1643 – 1727 — Euler 關於這個級數的求和方法非常有創意是一個數學系學生應該具備的常識, 但事與願 違。 我在求學的階段並不知道這段有趣的歷史,

z 在使用分壓器時有某些情況必須考慮,以右圖 的分壓器為例,總電壓亦即V CO 為+90V,若三 個電阻均相等,則理論上V AO =V BA =V CB =

• 後段工程是從由矽晶圓切割成一個一個的晶片 入手,進行裝片、固定、接合連接、注模成 形、引出接腳、按印檢查等工序,完成作為元

單晶片電路接受到 A/D 轉換器的信號後,即將此數位信號由顥示器 顯示。此時單晶片 IC 並將此一 A/D 轉換器與指撥設定開關做比較,A/D 轉換器的信號高於設定值時,即由 OUT CONTROL

檢視 檢視「 「 「 「輸出 輸出 輸出 輸出」 」 」 」視窗表示 視窗表示 視窗表示 視窗表示 程式碼沒有任何錯誤

™ “五、四”反帝愛國運動中北京女學生成立的一個愛國組

請問下列程式片段輸出為何?. var yes