ภาษาซีเบ้ืองตน้สาหรบั...

58
ภาษาซีเบื องต้นสาหรับ ไมโครคอนโทรเลอร์ ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223) ผศ.ดร.ชัยพร ใจแก้ว และ ผศ.ดร.อภิรักษ์ จันทร์สร้าง ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์

Upload: others

Post on 05-Nov-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

ภาษาซเบองตนส าหรบไมโครคอนโทรเลอร

ปฏบตการเกยวกบวศวกรรมคอมพวเตอร(01204223)

ผศ.ดร.ชยพร ใจแกว และ ผศ.ดร.อภรกษ จนทรสรางภาควชาวศวกรรมคอมพวเตอร

คณะวศวกรรมศาสตร มหาวทยาลยเกษตรศาสตร

Page 2: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

2

คณสมบตของภาษาซ• พฒนาข นโดย Dennis Ritchie เมอป 1972 ท Bell

Telephone Laboratories เพอใชพฒนาระบบปฏบตการยนกซ

• ออกแบบใหงายตอการเขาถงหนวยความจ าโดยตรง• ค าสงในภาษาซงายตอการแปลเปนค าสงภาษาเครอง

➢ กลายเปนทนยมในการสรางซอฟตแวรทเคยเขยนดวยภาษาแอสเซมบล

➢ มความเรวในการท างานสง• เกอหนนการโปรแกรมทไมยดกบสถาปตยกรรมเครอง

Page 3: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

3

ตวอยางโปรแกรมภาษาซ#include <stdio.h>

int main(){int a, b, sum;printf("Enter A: ");scanf("%d", &a);printf("Enter B: ");scanf("%d", &b);sum = a+b;printf("Sum = %d\n", sum);return 0;

}คนคา 0 เพอระบวา

โปรแกรมจบการท างานโดยไมมขอผดพลาด

อานไฟล stdio.h เพอเอาฟงกชนมาตรฐานมาใช

ฟงกชน main ระบจดเรมตนของโปรแกรม คนคากลบเปน int

ประกาศตวแปรแบบ int สามตวคอ a, b และ sum

ฟงกชนมาตรฐาน printf() ใชพมพขอความ

ออกทางหนาจอฟงกชนมาตรฐาน scanf()ใชรบอนพทจากแปนพมพ

Page 4: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

4

การทดสอบโปรแกรมบนพซ• บนทกไฟลดวยนามสกล .c (เชน myprog.c) และใชค าสง gcc ในการคอมไพลโปรแกรม

• ค าสงขางตนจะใหผลลพธเปนไฟลโปรแกรม (executable) ชอ myprog.elf ซงสามารถเรยกทดสอบการท างานได

$ gcc -o myprog.elf myprog.c

$ ./myprog.elfEnter A: 3Enter B: 8Sum = 11

Page 5: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

5

โปรแกรมส าหรบไมโครคอนโทรลเลอร• มกไมใช printf หรอ scanf เพราะมกไมมแปนพมพ/จอภาพ

➢ ตดตอกบอนพท/เอาทพทผานรจสเตอรพเศษ

• ไมมการจบการท างาน (ไม return จากฟงกชน main)

• การรนโปรแกรมตองการขนตอนเพมเตมเพอสงโคดไปยงอปกรณ

อาศยคอมไพเลอรชนดทแปลค าสงใหสถาปตยกรรมอน (เรยกวา cross-compiler) เชน avr-gcc

#include <avr/io.h>

int main(){

DDRD = 0b00001000;PORTD = 0b00000000;while (1)

;}

ก าหนดคาใหรจสเตอรเพอควบคมอนพท/เอาทพท ไมปลอยใหจบการท างาน

แมงานจะเสรจสแลว

Page 6: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

6

ตวอยางการทดสอบโปรแกรมบน MCU• ใชค าสง avr-gcc เพอคอมไพลโปรแกรมส าหรบ MCU เบอร ATMega168

• สกดโคดภาษาเครองออกจากไฟล executable

• ดาวนโหลดโคดภาษาเครองลงสไมโครคอนโทรลเลอร➢ บอรดไมโครคอนโทรลเลอรตองพรอมในโหมด Boot Loader

$ avr-gcc -mmcu=atmega168 –O -o myprog.elf myprog.c

$ avr-objcopy -j .text -j .data -O ihex myprog.elf myprog.hex

$ avrdude -p atmega168 -c usbasp -U flash:w:myprog.hex

Page 7: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

โครงสรางหนวยความจ า

• พ นท 8 บต เกบขอมลไดแตกตางกน 28 = 256 รปแบบ เชน➢ 0, 1, 2, …, 254, 255➢ -128, -127, …, -1, 0, 1, …, 126, 127

7

1 ชอง = 1 ไบต (8 บต)

ต ำแหนงทอย(address)

ขอมลทเกบ(data)

0000 320001 670002 2550003 00004 121

: :

Page 8: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

ตวอยางการแทนขอมล 8 บต

8

คา 8 บตการตความ

จ านวนเตมไมมเครองหมาย

จ านวนเตมมเครองหมาย

อกขระตามมาตรฐาน ASCII

0000 0000 0 0 NUL

0000 0001 1 1 SOH

0000 0010 2 2 STX

: : : :

0011 0000 48 48 '0'

: : : :

0100 0001 65 65 'A'

: : : :

0111 1111 127 127 DEL

1000 0000 128 -128

: : :

1111 1111 255 -1

Page 9: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

ขอมลเกน 8 บต และ Endianness• จ านวนเตมขนาดใหญ เชน 529 ไมสามารถจลงไบตเดยวได• แตกจ านวนเปนหลายหลกในระบบเลขฐาน 256

9

529 = 22561 + 172560 = (2,17)256

ต ำแหนงทอย(address)

ขอมลทเกบ(data)

a :a+1 :a+2 :a+3 :

ต ำแหนงทอย(address)

ขอมลทเกบ(data)

a:a+1:a+2:a+3:

2,17

ล าดบไบตแบบ Big Endian ล าดบไบตแบบ Little Endian

217

172

Page 10: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

10

ชนดขอมลพนฐาน

ชอชนด มาตรฐาน C99 (ระบขนาด)

ขนาด(บต) คาต าสด คาสงสด

char int8_t 8 -128 +127unsigned char

uint8_t 8 0 255

short int16_t 16 -32,768 +32,767unsigned short

uint16_t 16 0 65,535

int - 16/32 -32,768/-2,147,483,648 +32,767/+2,147,483,647unsigned int

- 16/32 0 65,535 หรอ 4,294,967,295

long int32_t >=32 -2,147,483,648 +2,147,483,647unsigned long

uint32_t >=32 0 4,294,967,295

long long int64_t 64 -9,223,372,036,854,775,808 +9,223,372,036,854,775,807unsigned long long

uint64_t 64 0 18,446,744,073,709,551,615

Page 11: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

11

• ใชแทนการอางถงหนวยความจ า ณ ต าแหนงหนง ๆ➢ เพอใชในการเกบขอมล (ทเปลยนคาได) ในขณะประมวลผล

ตวแปร (Variable)

uint16_t a, b, sum;a = 10;b = 5;sum = a+b;

ต ำแหนง คำ: :

1000 2

1001 30

1002 211

1003 5

1005 23

: :

1004 8

10

0

5

0

0

15

b มคา 5 (อางถงคา)&b มคา 1002 (อางถงต าแหนง)

a

b

sum

(สมมตใหใชการเรยงล าดบไบตแบบ Little Endian)

Page 12: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

12

คาคงท (หรอสญพจน – Literal)• จ านวนเตม (ชนดขอมล char, short, long,...)

➢ เชน 10, -30• จ านวนเตมแบบยาว (ชนดขอมล long long)

➢ เชน 123456789012LL• เลข Floating point (ชนดขอมล float, double)

➢ เชน 3.14, 500.0• อกขระโดด (ชนดขอมล char)

➢ เชน 'a'

• คาจรง/เทจ (ชนดขอมล bool)➢ ไดแก true และ false

• สตรง (ชนดขอมล char*)➢ เชน "Hello"

Page 13: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

13

คาคงทจ านวนเตมในฐานอน• คาคงทแบบตวเลขโดยทวไปตความเปนฐานสบ• ตวเลขทน าหนาดวย 0b ตความเปนฐานสอง

➢ 0b00101101 เทากบ 45➢ 0b1111011101001011 เทากบ 63307

• ตวเลขทน าหนาดวย 0x ตความเปนฐานสบหก➢ 0x41 เทากบ 65➢ 0xA00F เทากบ 40975

• ตวเลขทน าหนาดวย 0 ตความเปนฐานแปด➢ 051 เทากบ 41➢ 0775 เทากบ 509

Page 14: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

14

การด าเนนการทางคณตศาสตร• ตวด าเนนการ + - * / มล าดบความส าคญตางกน

➢ * / ถกด าเนนการกอน + -➢ ความส าคญเทากนด าเนนการจากซายไปขวา➢ ใชวงเลบ () เพอจดล าดบการด าเนนการ

int a = 8+3*5-7*2;

int b = 8+(3*5)-(7*2);

int c = (((8+3)*5)-7)*2;

Page 15: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

15

การด าเนนการทางคณตศาสตร• การด าเนนการทางคณตศาสตรบนจ านวนเตมไดผลลพธเปนจ านวนเตมเสมอ (รวมถงการหาร)

• / เปนการหารเอาผลลพธ สวน % เปนการหารเอาเศษ• หากผลลพธมคามากหรอนอยเกนกวาทขนาดตวแปรแบบจ านวนเตมจะเกบได ผลลพธจะถกคดทบกลบ

int a = 56/22349 + 32/30;

uint8_t a = 120+38;

uint16_t b = 3-10;

Page 16: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

16

ตวด าเนนการแบบแกไขและตงคา• ตวด าเนนการทางคณตศาสตรสามารถใชคกบ "=" เพอค านวณคาและตงคาใหมใหตวแปรไดทนท

• ตวอยางsum += x; // เทยบเทากบ sum = sum + xprod *= 2.5; // เทยบเทากบ prod = prod * 2.5y -= 3+a; // เทยบเทากบ y = y – (3+a)

Page 17: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

17

ตวด าเนนการเพมคา• ตวด าเนนการ ++ และ -- สามารถใชเพมและลดคาใหกบตวแปรหนงคา ตามล าดบ

• ตวอยางint n = 0;

n++; // เทยบเทากบ n = n+1 หรอ n += 1n++; // n มคาเปน 2n--; // n มคาเปน 1

Page 18: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

18

ชนดขอมลอน ๆ• เลขทศนยม (floating point)

➢ float (4 ไบต) เกบเลขทศนยมแบบ single precision➢ double (8 ไบต) เกบเลขทศนยมแบบ double

precision** ไมแนะน ำใหใชในไมโครคอนโทรลเลอรขนำดเลก เนองจำกใชทรพยำกรของระบบมำก **

• ตวช (pointer)• อารเรย (array)

Page 19: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

19

การแปลงชนดขอมลตวเลข• เรยกวาการท า type casting

• การเปลยนชนดขอมลทมรายละเอยดสงกวาไปเปนขอมลทรายละเอยดต ากวาอาจเกดการเปลยนแปลงคาของขอมลได

int a = 10;float b = (float) a;

อาจไมตองใสกได

float f = 3.8;int i = (int) f;

Page 20: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

20

นพจนบลน• นพจนและตวแปรแบบบลน (Boolean) ใหคาทเปนไปไดสองคาคอ "จรง" และ "เทจ"

• ในภาษาซ➢ คา 0 มคาเทยบเทา "เทจ"➢ คาทไมใช 0 มคาเทยบเทา "จรง"

• มาตรฐาน C99 รองรบสญพจน true และ false

Page 21: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

21

นพจนบลน• นพจนบลนสามารถน ามาผสมกนผานตวด าเนนการทางตรรกศาสตร

เพอสรางนพจนใหมได• ตวด าเนนการทางตรรกศาสตร

➢ && - AND➢ || - OR➢ ! - NOT

• ตวอยาง

➢ ถา x เปน 10 นพจนขางตนเปนเทจ➢ ถา x เปน 15 นพจนขางตนเปนจรง

(x > 12) && (x < 20)

Page 22: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

22

• เปนตวแปรทเกบต าแหนงของหนวยความจ า➢ เพอใชอางองขอมลในหนวยความจ าต าแหนงอน ๆ

ตวแปรแบบตวช (Pointer)

uint16_t a = 57;uint16_t *p;p = &a;*p = 78;

ต ำแหนง คำ: :

0020 2

0021 30

0022 211

0023 5

0025 23

: :

0024 8

57

0

20

0

p

78

0

a

p มคา 20 (คาของ p)&p มคา 22 (ต าแหนงของ p)*p มคา 78 (คาในต าแหนงท p ชอย)

Page 23: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

23

อารเรยและสตรง• ขอมลแบบอารเรยเปนการรวมกลมขอมลชนดเดยวกนไวเปนแถวล าดบ

• จดเปนตวแปรแบบตวชประเภทหนง

uint16_t arr[3];arr[0] = 50;arr[2] = 89;

arr มคา 20arr[0] มคา 50&arr มคา 20*arr มคา 50

23

8

ต ำแหนง คำ: :

0020 2

0021 30

0022 211

0023 5

0027 12

: :

0026 33

0025

0024

50

0

89

0

arr

Page 24: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

24

ขอมลประเภทสายอกขระ (สตรง)• “สตรง” คออารเรยของอกขระโดด (array of char)

char s[] = "Hello";printf("%c %c %c\n", s[0], s[1], s[2]);

H e l

ผลลพธ:

Page 25: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

25

ขอมลประเภทสตรค (struct)• ใชรวมขอมลใหเปนกลมเดยวกนstruct MyStruct{uint16_t a;uint8_t b[4];

};

int main(){struct MyStruct m;m.a = 3;m.b[0] = 4;m.b[2] = 5;:

}

23

8

ต ำแหนง คำ: :

0020 2

0021 30

0022 211

0023 5

0027 12

: :

0026 33

0025

0024

3

0

4

5

mm.a

m.b

Page 26: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

26

การนยามรปแบบขอมลใหม• ใช typedef เพอสรางรปแบบขอมลทตองการ

➢ เพมความสะดวกในการใช structstruct MyStruct

{

uint16_t a;

uint8_t b[4];

};

typedef struct MyStruct MyStruct

int main()

{

MyStruct m;

:

}

typedef struct

{

uint16_t a;

uint8_t b[4];

} MyStruct;

int main()

{

MyStruct m;

:

}

Page 27: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

27

การใชงานตวชกบสตรค

typedef struct{uint16_t a;uint8_t b[4];

} MyStruct;

int main(){MyStruct m;MyStruct *p = &m;(*p).a = 5; // เทยบเทำ p->a = 5p->b[1] = 4; // เทยบเทำ (*p).b[1] = 4

}

23

8

ต ำแหนง คำ: :

0020 2

0021 30

0022 211

0023 5

0027 12

0026 33

0025

0024

2

0029 7

0028

p

5

0

4

m

20

0

Page 28: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

ขอมลประเภทยเนยน (union)• ใชนยามขอมลกอนเดยวกนใหมมมมองทแตกตางกน

28

50 ? ? ?

78 56 34 12

78 56 34 12

typedef struct {

uint32_t word;

uint8_t byte[4];

} MyStruct;

MyStruct s;

s.word = 0x12345678;

s.byte[0] = 0x50

typedef union {

uint32_t word;

uint8_t byte[4];

} MyUnion;

MyUnion u;

u.word = 0x12345678;

s.word

s.byte

u.word

u.byte

หมายเหต: คาในหนวยความจ าแสดงในฐาน 16

Page 29: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

29

การรบ/แสดงผล• เหมาะส าหรบอปกรณทมหนาจอแสดงผล และใชทดสอบการท างานบางอยางบนเครองพซ

• ฟงกชนมาตรฐาน (เพอการรบ/แสดงผลขอมล) ถกเตรยมไว ในเฮดเดอรไฟล “stdio.h”

• ฟงกชนรบขอมล➢ scanf ส าหรบตวแปรทกชนด (ระบดวย %format)➢ getchar, getch ส าหรบตวแปรชนดอกขระโดด➢ gets ส าหรบตวแปรชนดสตรง

• ฟงกชนแสดงผลขอมล (Output Function)➢ printf ส าหรบตวแปรทกชนด (ระบดวย %format)

Page 30: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

30

การแสดงผลขอมล• ทกอยางในหนวยความจ าลวนเปนตวเลข• การแสดงผลลพธดวยฟงกชน printf จงตองระบรปแบบตามทเราตองการจะเหน

char c = 65;

printf("c (as a number) = %d\n", c);

printf("c (as a character) = %c\n", c);

หนวยควำมจ ำ:

2

30

65

5

23

:

8

c

c (as a number) = 65

c (as a character) = A

ผลลพธ:

Page 31: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

31

%format ใน scanf และ printfชนดขอมล ชนดตวแปร %format

จ านวนเตม

int %d

long %ld

long long %lld

unsigned int %u

unsigned long %lu

unsigned long long %llu

จ านวนมทศนยมfloat %f

double %lf

อกขระโดด char %c

สตรง char array[] %s

Page 32: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

32

ตวอยางการใช scanf

char name[20];

int age;

printf("Enter your name and age: ");

scanf("%s %d", name, &age);

printf("Hello %s. You are %d years old.\n",

name, age);

Enter your name and age: Tony 38

Hello Tony. You are 38 years old.

ผลลพธ:

Page 33: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

33

การด าเนนการระดบบต• ด าเนนการโดยตความจ านวนเตมเปนเลขฐานสอง• ใชมากในโปรแกรมส าหรบไมโครคอนโทรลเลอร

➢ เซตคาบตบางบตใหกบรจสเตอรโดยไมกระทบบตอน➢ อานคาบตบางบตจากรจสเตอร

Page 34: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

34

ตวด าเนนการ AND, OR, NOT• & - ตวด าเนนการ AND

• | - ตวด าเนนการ OR

• ~ - ตวด าเนนการ NOT

uint8_t a = 0b01001011;uint8_t b = 0b01111000;uint8_t c = a & b;

0 1 0 0 1 0 1 1

AND 0 1 1 1 1 0 0 0

---------------

0 1 0 0 1 0 0 0

uint8_t a = 0b01001011;uint8_t b = 0b01111000;uint8_t c = a | b;

0 1 0 0 1 0 1 1

OR 0 1 1 1 1 0 0 0

---------------

0 1 1 1 1 0 1 1

uint8_t a = 0b01001011;uint8_t b = ~a;

NOT 0 1 0 0 1 0 1 1

---------------

1 0 1 1 0 1 0 0

Page 35: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

35

ตวด าเนนการชฟตบต• >> N - ชฟตบตไปทางขวา N บต

➢ เทยบเทาการหารดวย 2N

** การชฟตไปทางขวาจะคงความเปน +/- ของตวตงไวเสมอ **

• << N - ชฟตบตไปทางซาย N บต➢ เทยบเทาการคณดวย 2N

uint8_t a = 0b01001011;uint8_t b = a >> 2;

0 1 0 0 1 0 1 1 >> 2

---------------

0 0 0 1 0 0 1 0

uint8_t a = 0b01001011;uint8_t b = a << 2;

0 1 0 0 1 0 1 1 << 2

---------------

0 0 1 0 1 1 0 0

Page 36: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

36

ตวอยางการเซตคาบต• Ex. ตงคำใหขำ PD3 ท ำงำนเปนเอำทพท ทเหลอเปนอนนพท

➢ คา PD3 ถกนยามไวเทากบ 3 ในไฟลเฮดเดอร avr/io.h จงเขยนไดเปน

• Ex. ตงคำใหขำ PD3 ท ำงำนเปนเอำทพท โดยไมกระทบบนตอน

➢ หรอ

DDRD = (1 << 3);

DDRD = (1 << PD3);

DDRD = DDRD | (1 << PD3);

DDRD |= (1 << PD3);

Page 37: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

37

ตวอยางการเซตคาบต• Ex. ใหขำ PC0, PC1, PC2, PC4 เปนเอำทพท ทเหลอไมเปล ยนแปลง

• Ex. ใหขำ PC3 เปนอนนพท ทเหลอไมเปล ยนแปลง

• Ex. สงลอจนก 1 ไปท PC0 และ PC1 และลอจนก 0 ไปท PC2

DDRC |= (1 << PC0) | (1<<PC1) | (1<<PC2) | (1<<PC4);

PORTC |= (1<<PC0) | (1<<PC1);PORTC &= ~(1<<PC2)

DDRC &= ~(1 << PC3);

Page 38: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

38

ตวอยางการตรวจสอบคาบต• Ex. ตรวจสอบวำขำ PD7 มลอจนกเปน 1 หรอไม

• Ex. ตรวจสอบวำขำ PD5 มลอจนกเปน 0 หรอไม

if (PIND & (1<<PD7))// do something

if ( (PIND & (1<<PD5)) == 0)// do something

Page 39: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

39

ตวอยางการประมวลผลระดบบต• Ex. น ำบนตทมคำนยส ำคญต ำทสด 3 บนตของตวแปร xมำก ำหนดลอจนกใหขำ PC2, PC1 และ PC0 โดยไมกระทบกบลอจนกของขำอน ๆ ของ PORTC

PORTC &= ~(0b00000111); // Clear bits PC2-PC0PORTC |= (x & 0b00000111);

Page 40: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

40

ตวอยางการประมวลผลระดบบต• Ex. ตควำมคำในบนตท 6, 5 และ 4 ของรจสเตอร REG ใหเปนคำในชวง 0-7 เพอเกบคำไวในตวแปร x➢ ชฟตบต [6,5,4] มาทต าแหนง [2,1,0] แลวตดมาเฉพาะบต [2,1,0]

➢ เลอกตดบต [6,5,4] แลวชฟตมาทต าแหนง [2,1,0]

uint8_t x = (REG >> 4) & 0b00000111;

uint8_t x = (REG & 0b01110000) >> 4;

Page 41: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

41

การไหลของโปรแกรม

• โปรแกรมแบบงาย ท างานรวดเดยวจากบนลงลาง

START

END

Statement

โปรแกรมทมค ำสงเดยว

โปรแกรมทมหลำยค ำสง

Statement1

Statement2

Statementn

END

START

Statement3

Page 42: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

42

การควบคมการไหลของโปรแกรม• ค าสงก าหนดเงอนไข

➢ โครงสราง if➢ โครงสราง if…else

• ค าสงวนซ า➢ โครงสราง while loop➢ โครงสราง do…while loop➢ โครงสราง for loop

• โปรแกรมยอย (ฟงกชน)

Page 43: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

43

โครงสราง ifif (condition)

{

statement1;

:

statementN;

}

C Syntax

START

END

Statement

conditiontrue

false

Statement

Flowchart

• สวนของ condition ตความเปนขอมลแบบ int

• ท าค าสงใน {} หาก conditionเปนจรง (ไมเปนศนย)

• หากมค าสงเดยวไมจ าเปนตองใชวงเลบปกกา

Page 44: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

44

โครงสราง if…else

if (condition)

{

statementt1;

statementt2;

}

else

{

statementf1;

statementf2;

}

C SyntaxFlowchart

START

END

Statementf1

conditiontrue false

Statementt1

Statementf2Statementt2

Page 45: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

45

โครงสราง if แบบหลายเงอนไขif (x==1)

Action1;

else if (x==2)

Action2;

else if (x==3)

Action3;

else if (x==4)

Action4;

else

Default_Action;

false

Action1;x==1

Action2;x==2

Action3;x==3

Action4;x==4

true

true

true

true

false

false

false

Default_Action;

Page 46: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

46

โครงสราง switch-caseswitch (x)

{

case 1: Action1;

break;

case 2: Action2;

break;

case 3: Action3;

break;

case 4: Action4;

break;

default: Default_Action;

break;

}

false

Action1;x==1

Action2;x==2

Action3;x==3

Action4;x==4

true

true

true

true

false

false

false

Default_Action;

Page 47: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

47

โครงสราง while ลป

• วนท าค าสง stmt1 ถง stmtNตราบเทาท condition เปนจรง

condition

END

START

true

Statement

Statement

false

while (condition)

{

stmt1;

stmt2;

:

stmtN;

}

Page 48: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

48

โครงสราง do…while ลป

• ท าค าสง stmt1...stmtNและวนท าซ าอกตราบเทาทcondition ยงคงเปนจรง

• นนคอ stmt1...stmtN จะถกกระท าอยางนอยหนงครง END

condition

false

START

Statement1

StatementN

true

do

{

stmt1;

stmt2;

:

stmtN;

} while (condition);

Page 49: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

49

ลปวนนบ (Counting Loop)• หากพจารณาโครงสรางของลปทใชในโปรแกรมสวนใหญ มกจะเปนลปแบบวนนบ

• ลปวนนบจะมสวนประกอบดงตวอยางตอไปนเสมอ

int i, sum = 0;

i = 1;

while (i <= 10)

{

sum = sum + i;

i = i + 1;

}

printf("Sum = %d\n", sum);

ตวแปรทใชนบ

สวนก าหนดคาเรมตน

การปรบคาตวนบ

เงอนไขของตวนบ

ค าสงทถกท าซ า

Page 50: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

50

โครงสราง for ลป• เปนโครงสรางทใหความสะดวกในการเขยนลปวนนบ

• การท างาน1. ท าค าสง init_stmt หนงครง2. ถา condition เปนจรง ท าค าสง statement1...statementN3. ท าค าสง update_stmt จากนนกลบไปท าขอ 2

for (init_stmt; condition; update_stmt)

{

statement1;

statement2;

:

statementN;

}

Page 51: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

51

การท างานของ for ลปSTART

END

falsecondition

true

Statement1

StatementN

init_stmt

update_stmt

for (init_stmt; condition; update_stmt)

{

statement1;

statement2;

:

statementN;

}

Page 52: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

52

โปรแกรมยอย (Subroutine)• ในภาษาซเรยกวา "ฟงกชน" (Function)• เปนสวนของโปรแกรมทมหนาทการท างานชดเจนในตวเอง ซงถกเรยกใชในโปรแกรมหลกอกทหนง

• การเขยนโปรแกรมโดยแยกเปนฟงกชนมขอดหลายประการ➢ ชวยแบงงานทซบซอนเปนงานยอยหลายงาน➢ ลดการเขยนโคดทซ าซอน➢ ซอนรายละเอยดไวในสวนอน ท าใหโปรแกรมเขาใจไดงายข น➢ ฟงกชนทเขยนขนมาสามารถน าไปใชในโปรแกรมอนได

Page 53: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

53

ชนดของฟงกชน• ฟงกชนมาตรฐาน (Standard Functions)

➢ เปนฟงกชนทอยในชดไลบรารของภาษาซ เรยกใชไดทนท➢ เชน printf(), scanf(), ...

• ฟงกชนทผใชก าหนด (User Defined Functions)➢ เปนฟงกชนทผใชสรางข นเอง ➢ เรยกใชใน main() หรอจากฟงกชนอนๆ ไดเหมอนฟงกชนมาตรฐาน

Page 54: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

54

ตวอยางฟงกชนมาตรฐาน

กลมฟงกชน เฮดเดอรไฟล ตวอยางฟงกชน

จดการอนพท/เอาทพท stdio.hscanf, printf, gets, puts

คณตศาสตร math.h sin, cos, exp, pow

แยกประเภทขอมลอกขระ ctype.hisalpha, isdigit, islower, isupper

จดการกบสตรง string.hstrlen, strcpy, strcmp

อน ๆ stdlib.h rand, atoi, atof

Page 55: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

55

ฟงกชนทผใชก าหนดเอง• แบบไมสงคากลบ

➢ ระบชนดขอมล void➢ ไมตองมค าสง return

• แบบสงคากลบ➢ ระบชนดขอมลทตองการ➢ ใชค าสง return สงคาคนตามชนดทระบ

void say_hi(char *name)

{

printf("Hi, %s\n", name);

}

int max(int a, int b)

{

if (a > b)

return a;

else

return b;

}

Page 56: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

56

การไหลของโปรแกรมเมอใชฟงกชน

int incr(int i)

{

int j;

j = i + 1;

return j;

}

int main()

{

int k, m = 4;

k = incr(m);

printf ("k = %d, m = %d\n", k, m);

return 0;

}

Page 57: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

57

ขอผดพลาดทพบบอย#include <stdio.h>

int main ()

{

int i;

scanf("%d", i);

if (i = 0)

puts("false");

else

puts("true");

return 0;

}

สงคา i ให scanf แทนทจะสงต าแหนง

ใชค าสงก าหนดคา (=) แทนการเปรยบเทยบ (==)

Page 58: ภาษาซีเบ้ืองตน้สาหรบั ไมโครคอนโทรเลอร์cpj/204223/slides/h6-c.pdf · ภาษาซีเบ้ืองตน้สาหรบั

58

ขอผดพลาดทพบบอย#include <stdio.h>

int main ()

{

char s[10];

printf("Enter password: ");

scanf("%s", s);

if (s == "pass")

puts("Correct password");

else

puts("Incorrect password");

return 0;

}

ใช == เปรยบเทยบสตรงไมไดใชฟงกชน strcmp() แทน