PSOC_C基本指令 中州技術學院 電子系 副教授 余文俊
C語言程式架構 1.主程式。 2.函式 ( 副程式 ) 3.標頭檔。 #include “stdio.h” void main(void) { unsigned char i, j, k; j=i+j; delay(); } void delay(void) unsigned char i; for(i=1; i<255; i++);
void delay_lms (char j) *主程式 (Main progran): *主程式以main為其函式的名稱。 main ( ) { C語言敘述; } *函式 (Function): void delay_lms (char j) 返回值型態 參數 void delay_1ms(char j) { for(j=0; j<100; j++); } *標頭檔 (Head File): *標頭檔以x.h檔名儲存,它 主要用來定義各硬體I/O位 址,常數、函數的宣告…。 #define FALSE 0 #define TURE l #define COUNTER 100
路徑和檔案名稱 避免使用以下的字符用在路徑上和檔案名稱上(它們是有問題的): \ / : * ? ” < >| & + , = [ ] %$` ‘‧
C語言的常數 1.八進位表示法:以0開頭的數字。 2.十進位的表示法:不以0開頭的數字。 3.十六進位的表示法:以0x開頭的數字。 例:011為八進位表示法,相當於十進位的9。 2.十進位的表示法:不以0開頭的數字。 例:9213。 3.十六進位的表示法:以0x開頭的數字。 例:0x11表示16進位11。即十進位的17。 4.字元表示法:以單引號將英文字母、 阿拉伯數字、符號……括起來表示之。 ‘A’ 表示字母A,即0x41 ‘0’ 表示阿拉伯數字0,即0x30 ‘#’ 表示#符號 5.特殊字元 ( 控制字元 ) 表示法 控制字元 ASCII碼 字 元 名 稱 \0 0x00 空格 (null space) NULL \a 0x07 響鈴 (bell ring) BELL \b 0x08 退格 (backspace) BS \t 0x09 標識 (tab) HT \n 0x0a 跳列 (newline) LF \f 0x0c 跳頁 (form feed) FF \r 0x0d 回轉 (earriage return) CR \" 0x22 雙引號 (double quote) , " \' 0x2c 單引號 (singal quote) , ' \\ 0x5c 倒斜線 (bacrk slash) , \
C語言的變數 格式: 變數資料型態 變數名稱; 【例】 int i; 二、變數的組合 一、變數的名稱開頭字元 格式: 變數資料型態 變數名稱; 【例】 int i; 二、變數的組合 1.大寫英文字母 (A ~ Z) 2.小寫英文字母 (a ~ z) 3.阿拉伯數字 (0 ~ 9) 4.底線_ 一、變數的名稱開頭字元 1.大寫英文字母 (A ~ Z) 2.小寫英文字母 (a ~ z) 3.底線_ 三、變數名稱不可以為系統的保留字 auto break case char continue default do double else enum extern float goto if int long register return short sizeof static struct switch typebef union unsigned void while 四、大寫與小寫的變數,代表不同的變數 (?)
變數的資料型態 ( 基本資料型態 ) 格式:資料形態修飾 資料型態變數 1.資料基本型態 2.資料型態的修飾字:改變資料型態的意義。 char: 存放字元資料型態。代表存放8位元資料。 int: 存放整數的資料型態。代表存放16位元資料。 float: 存放浮點數的資料型態。代表存放32位元資料。 double:存放雙倍精度浮點數的資料型態。代表存放32位元資料。 2.資料型態的修飾字:改變資料型態的意義。 signed: 帶符號。 unsigned:不帶符號。 short: 短。未加入short的變數為short。 long: 長。其資料長度為原資料型態的2 倍。
C語言基本資料型態
另外的資料類型 在m8c.inc
支援的運算符號
支援的運算符號
支援的運算符號
支援的運算符號
支援的運算符號
變數的宣告 格式:資料型態修飾字 資料型態 變數名稱; 1 .宣告變數型態 char i; 宣告變數i為字元資料型態 2 . 宣告變數型態,並給予初始值 char i , j , k =10; unsigned char i=’A’ ;
變數的種類 ( 變數的有效範圍 ) (1)本地變數 (local variable) (2)全區變數 (global variable) (3)外部變數 (external variable)
本地變數 (local variable) 本地變數的有效範圍只有在它所宣告的函式內有效 void main(void) { char i; test(); } void test(void) char i, k; i=100; k=i+k; i的有效範圍 i, k的有效範圍此i與main()中之i不同
全區變數 (global variable) 全區變數的有效範圍是整個檔案內 (*.c )。 檔案A.C中: 檔案B.C中: char delay; 全區變數宣告 void dkk (void) void main(void) { {delay=10;} char delay ; 區域變數delay宣告 delay = delay /10; } void f1 (void) {delay = delay+1;}
外部變數 (external VARIABLE) 外部變數的有效範圍為所有檔案的所有函式 檔案A.C中: 檔案B.C中: EXTERNAL char delay;全區外部變數宣告 void dkk (void) void main(void) {char delay ; 區域變數delay宣告 {delay=10;} delay = delay /10; } void f1 (void) {delay = delay+1;}
變數的等級 1. auto ( 自動變數 ) 2 . static ( 靜態變數 ) 4. bit ( 位元變數 )
IAR-C是以暫存器R0~R7來儲存自動變數。(8051) auto ( 自動變數 ) 以堆疊方式儲存在記憶體空間。 IAR-C是以暫存器R0~R7來儲存自動變數。(8051) void delay (void) { auto char i; 意義相同 char i; }
static ( 靜態變數 ) IAR-C編譯器是以固定位址存放此變 數,使用堆壘方式來存放 IAR-C將它儲存在8051CPU的記憶體 00H~7FH。 static char i; static int j;
C語言的敘述 (statement) 格式: 變數=任何合法的運算式; char a, b, c, j ; a=3+2 ; 結果:a=5 格式: 變數=任何合法的運算式; char a, b, c, j ; a=3+2 ; 結果:a=5 b=a+4 ; 結果:b=9 c=a/b ; 結果:c=0 j=a-b ; 結果:-4
算術運算
關係運算子 關係運算子用來比較變數的值或常數的值,並將結果傳 回給變數。 若為真,則結果為1,若為假,則結果為0。 運算的結果不影響各個變數的值。
一般邏輯運算 ** 邏輯運算的功能是用來判斷敘述的真、偽。 ** 若敘述為真,則結果為1。若敘述為偽,則結果為0。
位元邏輯運算子 ** 位元邏輯運算子會將各變數或常數的每一個位 元 (bit)做邏輯運算,並將結果寫入某變數。
條件控制指令用來控制C語言程式的執行流程 1. for 指令 2. while 指令 3. do_while 指令 4. if ─ else 指令 5. switch ─ case 指令 6. goto 指令(無條件)
for 敘述
for應用例 (1)無限迴圈 (2)時間延遲 (3)執行n次敘述後,繼續往下執行程式。 4.多重迴圈 5..for迴圈不可交叉 【例】 for(;;) ; 與組合語言JMP $相同。 (2)時間延遲 char i; for(i=0;i<100;i + +); 本指令會執行for迴圈100次,後離開for迴圈,繼續往下執行程式。 (3)執行n次敘述後,繼續往下執行程式。 int i; for (i=0 ; i<5 ; i++) { P0=i; } P1=0;執行順序: P0=0 (i=0) P0=1 (i=1) P0=2 (i=2) P0=3 (i=3) P0=4 (i=4) 離開for迴圈 (I=5) 4.多重迴圈 for控制敘述可以有多層迴路控制敘述。先執行 內部迴圈後,依序執行外部迴圈。 5..for迴圈不可交叉 【例】 char i, j, k, l;i=0; j=0; for (k=0 ; k<3 ; k++) { j=j +3; for (l=0; l<3; l++) { i=i +3; } }
while迴圈 指令格式: while (運算) { 敘述 A ; } 敘述 B ; 執行流成圖:
應用例 【例】 char i=3; while (i>0) { P1=i; i ––; } 執行順序: (4) 結束 (1)無限迴圈 (a) while (1); (b) while (1) {敘述 ; } (2)時間廷遲 char i=100 ; while (i > 0) { ––i ; } (3)執行n次敘述 char i=100; while (i > 0) 執行100次 { 敘述 ; – – i; }
do–while指令 【說明】 【指令格式: 】 do { 敘述A;} { 敘述B;} 【說明】 (1) 首先執行完do迴圈的敘述 A後, 才測試while的運算 式是否為真。若運算式為真,則跳至do迴圈內,再執行迴圈內的敘述A。若為假,則跳出此迴圈,執行敘述B。 (2)如果{ }內,只有一個敘述, 可以省略大括弧。 (3)多層迴路與for( ) 相同。 (4)迴圈不得交叉。 【執行流程圖: 】
應用例 char i=0, j=0; do { j=j+10; i=i+4; } while (i<10) { i=100;} 【 程式】 char i=0, j=0; do { j=j+10; i=i+4; } while (i<10) { i=100;} 【執行順序】 (1)i=0,j=0 (2)do迴圈j=10 , i=4 判斷i<10為真 (3)do迴圈j=20 , i=8 判斷i<10為真 (4)do迴圈j=30 , i=12 判斷i<10為假 (5)離開do迴圈 i=100
if-else 【說明】 [流程圖] [流程圖] (1)if{ }else{ } (2)省略else if (運算式) if (運算式) 式是否為真,若運式為真 ,則執行敘述A,執行完 敘述A後,繼續執行敘述 C。若運算式不為真,則 執行敘述B,執行完敘述 B後,再執行敘述C。 (2)if { }:判斷運算式是否 為真,若運算式為真,則 執行敘述A,執行完敘述 A後,則執行敘述C。若 運算式不為真,則跳過敘 述A,執行敘述C。 (3)如{ }內,只有一個敘述 ,可以省略大括弧。 (4)多層迴路與for( ) 規則相同。 (5)迴圈不可交叉。 (1)if{ }else{ } (2)省略else if (運算式) if (運算式) { 敘述A;} { 敘述A;} else 敘述C; { 敘述B;} 敘述C; [流程圖] [流程圖]
應用例 [程式] char i , j; j=0; i=0; if(i>5){j=j+10;} else {j=j+1; } [執行順序] (1)j=0 , i=0 (2)i=33, j=1
switch _ case [流程圖] [指令格式] switch (變數) { case 條件1:敘述1; break; . case 條件N:敘述N; break; default:敘述N+1;break; break; } 敘述A; 【說明】 (1)C語言程式會將 “ 變數 ” 與 “ 條件1” 到“ 條件N” 比較。 若相等,則執行該 “ 條件 ” 的敘述,否則執行default的敘述。 (2)switch的變數,只能是整數或字元。 (3)default 敘述,可有可無。
應用例 [程式] char c , k; c=10; switch (c) { case 2:k=20; break; default:k=255; break; } c=88; [執行順序] (1)c=10,與case 10 相同,所以, k=100,離開switch ─ case迴圈, 繼續往下執行。 (2)c=88 [break指令的用法] 1.在switch-case指令中,扮演中斷case 敘述判斷的功能。 2.可以跳離任何迴圈-for , if –else , while , do-while。 [例] char i=0; for (; ;) { i=i+1; if (i= =10) { break;} } 如果i=10,則 跳離for
Goto指令 指令格式: goto lebel; Example: char h, a=10; test1: a=a+10; if (a<100) goto test1; h=3;
陣列 [1]陣列是一種結構化的資料型態。 [2]它將許多相同型態的變數集合起來, 以一 個名稱來代表。 [3]用陣列的索引值來代表陣列不同的變 數資料。
陣列的宣告 (1)有初始值的陣列宣告 資料型態 變數名稱[長度]={資料1,資料2,……} 註:長度可以省略。 【例】int total[3]={00,03,05} ; 代表 total[0]=0 total[1]=3 total[2]=5 【例】char iso[ ]={1, 2, 5, 10, 16} ; 代表 iso [0]=1 iso [1]=2 iso [2]=5 iso [3]=10 iso [4]=16 (3)無初始值陣列宣告 資料型態 變數名稱 [長度] ; 【例】char money [5] ; 【解】 [1]陣列有5個變數─ money[0] , money[1] , money[2] , money[3] , money[4] [2]它們的資料型態為字元 (char)。
(3)多重陣列 (a)不含初始值 (b)含有初始值 資料型態 變數名稱 [m] [n] … 資料型態 變數名稱 [m] [n]… 【例】char money [3] [2]; 陣列money共有3×2=6個變數, 6個變數如下: money [0] [0] money [0] [1] money [1] [0] money [1] [1] money [2] [0] money [2] [1] (b)含有初始值 資料型態 變數名稱 [m] [n]… ={資料1,資料2,…… }; 【例】char car[2] [2]={1,2,3,4};【說明】 car [0] [0]=1 car [0] [1]=2 car [1] [0]=3 car [1] [1]=4
指標 (pointer) [1]指標是一個變數。 [2]它的內容是指向另一個變數的所在位址。 [3]它的作用就如同組合語言的間接定址法。 [4]在C語言中,如果有一個變數的內容 是另一個變數的位址,那麼就稱為該 變數為另一個 變數的指標變數。
指標運算子 ─ & 和 * 指標變數的宣告 [1]指標運算子 & : 如果放在變數之前,代 變數型態 * 變數名稱 【例】char * ip [1]指標運算子 & : 如果放在變數之前,代 表取得儲存該變數的記憶體位址。 [2]指標運算子* : 如果將它置於一個 指標變數前面,則代表取得該指標 變數所指向的變數內容。 【例】如果變數i被儲存在記憶體1000的位址內 char * ip; ip =&i; 則 ip=1000 例】char i=10 , temp; char *ip; /* 宣告ip為指標變數 */ ip=& i; /* ip指向變數i的位址*/ temp=*ip;/* temp取得ip所指向的變數的內容, 即i的內容。所以 temp=i=10 */ 變數型態 * 變數名稱 【例】char * ip 【說明】ip為指標變數, 其所指向的位址 內容的資料型態 為字元 (char)。 【例】int * kk; 【說明】kk為指標變數, 為整數。
指標變數與陣列的關係(一) 陣列變數實際上就是一個指標。 [例] *採用索引的方式取得資料 i=ytr[3];即i=2。 int ytr [4]={5, 4, 3, 2}; ytr就是一個指標,它指到儲存這個整數陣列中的第一個元素 ( 即5) 的位址 *採用索引的方式取得資料 i=ytr[3];即i=2。 *建立了陣列與指標的關係 int ytr[5], i, *ip; ip=&yrr[0]; 【註】yrr前面不可以有&運算子。 P1=*ip ; 與 P2=yrr[0]==>P1=P2=5
指標變數與陣列的關係(二) char TAB[5]; int datal [5]; char ptr; char *ptr; ptr=&TAB[0]; char TAB [ ]={1,4,5,7,9}; char *ptr; ptr = &TAB[0]; int datal [5]; char *ptr; ptr=& datal [0];
結構 (structure) [1]結構定義 [1]結構的資料型態與陣列的資料型態相似,都是將多個變數收 集在同一個變數名稱下的集合。 [2]結構與陣列最大的不同點是 ─ 陣列中,每一個變數 ( 元素 ) 的資料型態都必須相同;而結構中的每一個變數,都可以擁 有不同的資料型態。 [1]結構定義
[3]結構的使用 [2]結構變數的宣告 typedef struct people { char child; char adult; char man; char women; int total; }; struct people china; /* 宣告china變數資料型態為結構people */ china‧child= 1; /* 令china變數內的元素child=1 */ china‧women=10; /* 令china 變數內的元素women=10 */ [2]結構變數的宣告 struct 結構變數名稱 變數名稱; 【例】struct student a1; 【說明】宣告a1為 student 資料結 束變數。
列舉 (enum) 指令格式1 :不設定初始值 [1]列舉 (enum) 是一種資料型態的定義。 [2]代表一群符號常數的定義的集合。 [3]當列舉被宣告後,列舉中的符號常數就 依序 ( 由左 而右 ) 給序0 , 1 , 2 ,… , n的整數值。 指令格式1 :不設定初始值 enum 變數名稱 {符號常數0,符號常數1,符號常數2,…}; 【例】enum colors {blue, red, green}; 【說明】經上述對列舉宣告後,blue=0 , red=1 , green=2
eunm 變數名稱 {符號常數1=xx , 符號常數2=yy, …… } 指令格式2 設定初始值 eunm 變數名稱 {符號常數1=xx , 符號常數2=yy, …… } xx, yy:整數 【例】enum today {hot=5 , rainny=10 , warm=20 , sunny=18}; 【說明】宣告列舉資料型態today,並設定符號常數初始 值如下:hot=5, rainny=10, warm=20, sunny=18 指令格式3 設定第一個符號常數初始值 enum 變數名稱{符號常數1=xx,符號常數2,符號常數3,……}; xx:表整數 符號常數2=xx+1, 符號常數3 =xx+2, 依此類推 【例】enum var {red=5 , green , blue , yan}; 【說明】red=5 , green=6 , blue=7 , yan=8
等 位 (union) 指令格式 union {成員1,成員2,……}; [1]等位的功用在於節省記憶體的使用 [2]等位內的成員佔有相同一塊的記憶體。 [3]等位所佔的記憶體為成員內元素的最大長度。 [4]每個等位變數只能同時儲存,其中一個變數的值 指令格式 union {成員1,成員2,……}; 【例】union {char i, char j, int k, char l}; 則變數 , i , j , k , l ,儲存在相同記憶體位址內,其最大長度為2 byte (int)。 [應用範例] union {char money, int total}; money=100;/* 設定money=100 */ total=10000;/* 設定total=10000, 同時money的內容己被改變,不再是100 */
PSOC 一般I/O代號 PRT0DR8 bits8051之 P0 PRT1DR8 bits8051之P1 Example :output PRT0DR=0x36; // P0=00110110 Example :input unsigned char hh; hh=PRT0DR; // hh=P0之值
編譯選單選項