38
ใบความรู้ท่ี 2 หน่วยท่ี 2
สอนคร้ังท่ี 3-4
ช่ือวชิ า ไมโครคอนโทรลเลอร์ รหัสวชิ า 3104-2011 จํานวนช่ัวโมงรวม 8 ชั่วโมง
ช่ือหน่วย ชุดคาํ ส่งั ของไมโครคอนโทรลเลอร์ จํานวนช่ัวโมงสอน 8 ช่ัวโมง
ช่ือเร่ือง ชุดคาํ สง่ั ของไมโครคอนโทรลเลอร์
สาระสําคญั
การเขียนชุดคาํ สั่งควบคุมให้ไมโครคอนโทรลเลอร์ทาํ งานน้นั มีรูปแบบและเงื่อนไขในการ
เขียนเฉพาะ รูปแบบและเง่ือนไขน้นั ก็คือภาษาที่ใช้เขียนชุดคาํ สั่ง ในปัจจุบนั มีใหเ้ ลือกหลายภาษา
ตามความเหมาะสมกบั งานและความถนดั ของผูใ้ ช้ โดยทวั่ ไปทุกภาษาประกอบดว้ ย โปรแกรม
บรรณาธิกรณ์ (Editor Program) ใชใ้ นการเขียนชุดคาํ สั่ง และคอมไพเลอร์ (Compiler) ซ่ึงทาํ หนา้ ที่
เป็นตวั แปลชุดคาํ สั่งเป็นภาษาเครื่อง (Machine Language)
สาระการเรียนรู้
1. ชุดคาํ สัง่ โปรแกรมภาษาเบสิก
2. ชุดคาํ สัง่ โปรแกรมภาษาแอสเซมบลี
3. ชุดคาํ สัง่ โปรแกรมภาษาซี
จุดประสงค์การเรียนรู้
จุดประสงค์ทว่ั ไป
เพอ่ื ใหม้ ีความรู้และความเขา้ ใจเก่ียวกบั ชุดคาํ ส่งั ของไมโครคอนโทรลเลอร์
จุดประสงค์เชิงพฤติกรรม
1. อธิบายชุดคาํ ส่งั โปรแกรมภาษาเบสิกไดถ้ ูกตอ้ ง
2. อธิบายชุดคาํ ส่งั โปรแกรมภาษาแอสเซมบลี ไดถ้ ูกตอ้ ง
3. อธิบายชุดคาํ สง่ั โปรแกรมภาษาซีไดถ้ ูกตอ้ ง
4. อธิบายการเขียนชุดคาํ ส่งั ภาษาซีควบคุมไมโครคอนโทรลเลอร์ไดถ้ ูกตอ้ ง
39
โปรแกรมภาษาที่ใช้ในการเขียนชุดคาํ ส่ัง ในปัจจุบันมีให้เลือกหลายภาษาตามความ
เหมาะสมกบั งาน การเขียนชุดคาํ ส่ังควบคุมไมโครคอนโทรลเลอร์น้นั มีขอ้ แตกต่างจากการเขียน
ชุดคาํ ส่ังบนเคร่ืองคอมพิวเตอร์แบบต้งั โตะ๊ เพราะวา่ เคร่ืองคอมพิวเตอร์แบบต้งั โต๊ะมีอุปกรณ์การ
เชื่อมต่อซ่ึงมีมาตรฐานแน่นอน แต่การเขียนชุดคาํ ส่ังควบคุมไมโครคอนโทรลเลอร์น้นั ผูใ้ ชจ้ ะตอ้ ง
ออกแบบวงจรเช่ือมตอ่ ใหเ้ หมาะสมกบั ลกั ษณะงานเอง โปรแกรมภาษาที่นกั เขียนโปรแกรม นิยมท่ี
ใช้ เช่น โปรแกรมภาษาเบสิก โปรแกรมภาษาแอสเซมบลี และโปรแกรมภาษาซี
2.1 ชุดคาํ ส่ังโปรแกรมภาษาเบสิก (Basic Languages)
การเขียนโปรแกรมภาษาเบสิก มีลกั ษณะเป็ นบรรทดั ชุดคาํ สั่ง (Command Line) โดยใช้
โปรแกรมบรรณาธิกรณ์เขียนชุดคาํ ส่ังทีละบรรทดั สําหรับพฒั นาเฟิ ร์มแวร์ (Firmware) ซ่ึงเป็ น
ภาษาเครื่องเกบ็ ไวท้ ่ีหน่วยความจาํ ของไมโครคอนโทรลเลอร์ ข้นั ตอนการพฒั นาโปรแกรมแสดงดงั
รูปท่ี 2.1 โปรแกรมที่เกี่ยวขอ้ ง ประกอบดว้ ย
2.1.1 โปรแกรมบรรณาธิกรณ์
ใชส้ าํ หรับเขียนชุดคาํ สง่ั ไดแ้ ก่โปรแกรมไมโครโคด สตูดิโอ (Microcode Studio) ไฟลท์ ี่
ไดม้ ีส่วนขยาย “bas”
2.1.2 โปรแกรมปิ คเบสิกโปร (PIC BASIC PRO)
ใชเ้ ป็นตวั แปลชุดคาํ ส่งั ภาษาเบสิกเป็นภาษาเคร่ือง จะไดไ้ ฟลม์ ีส่วนขยายเป็น “hex”
2.1.3 โปรแกรมท่ีใชบ้ นั ทึกภาษาเครื่องลงหน่วยความจาํ ไมโครคอนโทรลเลอร์
โปรแกรมไมโครโปร (MicroPro) ใชส้ าํ หรับบนั ทึกภาษาเคร่ืองผา่ นทางพอร์ตยเู อสบี
รูปที่ 2.1 ข้นั ตอนการพฒั นาโปรแกรมภาษาเบสิกควบคุมไมโครคอนโทรลเลอร์
40
2.2 ชุดคาํ สั่งโปรแกรมภาษาแอสเซมบลี (Assembly Languages)
การเขียนโปรแกรมภาษาแอสเซมบลี มีลกั ษณะเป็ นบรรทดั คาํ สั่ง ใชค้ าํ ยอ่ ส่ือความหมายแทน
ชุดคาํ สั่ง เรียกวา่ นีโมนิกส์ (Mnemonics) เช่น MOV ยอ่ มาจากชุดคาํ ส่ัง MOVE เป็ นตน้ เริ่มตน้ โดย
การเขียนชุดคาํ ส่ังในโปรแกรมบรรณาธิกรณ์ เม่ือเสร็จสมบูรณ์แลว้ จึงใชต้ วั แปลภาษา (Assembler)
แปลชุดคาํ สั่งเป็ นภาษาเครื่อง จะไดไ้ ฟล์ซ่ึงมีส่วนขยายเป็ น “hex” (ชื่อไฟล์.hex) ข้นั ตอนการพฒั นา
โปรแกรมภาษาแอสเซมบลี แสดงดงั รูปที่ 2.2
รูปที่ 2.2 ข้นั ตอนการพฒั นาโปรแกรมภาษาแอสเซมบลี
2.2.1 รูปแบบการใชช้ ุดคาํ สง่ั ภาษาแอสเซมบลี
รูปแบบการใชช้ ุดคาํ ส่งั ภาษาแอสเซมบลี แสดงดงั ตารางท่ี 2.1
2.2.1.1 รูปแบบโดยทวั่ ไปของชุดคาํ สัง่ ภาษาแอสเซมบลี ประกอบดว้ ย
1) รหัสดาํ เนินการ (Op-code) เป็ นส่วนที่แสดงจุดมุ่งหมายของการกระทาํ
ของแต่ละชุดคาํ ส่งั
2) ตวั ถูกดาํ เนินการ (Operand) หมายถึงส่วนที่ถูกกระทาํ หรือการแสดงถึง
ตาํ แหน่งที่จะกระทาํ ประกอบดว้ ย 2 ส่วน มีการคนั่ ดว้ ยเคร่ืองหมาย “,”
41
2.2.1.2 ชุดคาํ สง่ั หมายเหตุ เป็นขอ้ ความท่ีอธิบายความหมายของชุดคาํ สง่ั
2.2.1.3 ป้าย (Label) ใชก้ าํ หนดเลขท่ีอยหู่ น่วยความจาํ การต้งั ช่ือป้ายจะตอ้ งตามดว้ ย
เคร่ืองหมาย “:” ป้ายตอ้ งเขียนเป็นอนั ดบั แรกของบรรทดั หา้ มเวน้ ช่องวา่ ง
ตารางที่ 2.1 รูปแบบการใชง้ านชุดคาํ สง่ั ภาษาแอสเซมบลีของไมโครคอนโทรลเลอร์ PIC16F877A
Label Op-code Operand Comment
MOV A,#0FFH REG A= 11111111B
MOV P1,A นาํ ค่าขอ้ มูลในรีจิสเตอร์ A ออกไปท่ีพอร์ต P1
LOOP1: ACALL DELAY เรียกชุดคาํ ส่งั ยอ่ ยหน่วงเวลา
MOV P1,#00000000B นาํ คา่ คงตวั 00000000B ออกไปท่ีพอร์ต P1
ACALL DELAY เรียกชุดคาํ สง่ั ยอ่ ยหน่วงเวลา
SJMP LOOP วนไปทาํ ท่ีป้าย LOOP ใหม่
2.2.2 ชุดคาํ สง่ั เทียม (Pseudo instruction)
ชุดคาํ สง่ั เทียม ใชก้ าํ หนดสญั ลกั ษณ์ แปลความหมายการจองพ้ืนที่หน่วยความจาํ แบบไบต์
และแบบบิต บอกจุดเริ่มตน้ และจุดสิ้นสุดของโปรแกรม ประกอบดว้ ย
2.2.2.1 ORG ใชก้ าํ หนดคา่ แอดเดรสเร่ิมตน้ ในพซี ี
2.2.2.2 END บอกใหแ้ อสเซมเบลอร์รู้วา่ เป็นจุดสิ้นสุดของโปรแกรม
2.2.2.3 EQU ใชก้ าํ หนดค่าใหก้ บั สัญลกั ษณ์แทนตาํ แหน่งแอดเดรส
2.2.2.4 BIT ใชก้ าํ หนดค่าแอดเดรสตาํ แหน่งหน่วยความจาํ ที่เขา้ ถึงแบบบิต
2.2.2.5 DB ใชก้ าํ หนดขอ้ มูลโดยใส่ค่าคงที่ขนาดเป็ นไบตใ์ นหน่วยความจาํ ตามตอ้ งการ
2.2.2.6 DS ใชจ้ องเน้ือที่ภายในหน่วยความจาํ ขอ้ มูลแรม
2.3 ชุดคาํ สั่งโปรแกรมภาษาซี (C Languages)
โปรแกรมภาษาซี เป็ นโปรแกรมที่มีความยืดหยุ่น ลกั ษณะของภาษาอยู่ในรูปของฟังก์ชั่น
โปรแกรมหน่ึงอาจประกอบด้วยฟังก์ชั่นเดียวหรือหลายฟังก์ชัน่ โปรแกรมที่ใช้ในคอมพิวเตอร์
ระบบหน่ึง สามารถนาํ ไปใชก้ บั อีกระบบหน่ึงได้ อีกท้งั ภาษาซีสามารถเขา้ ถึงโครงสร้างภายในของ
ไมโครคอนโทรลเลอร์ไดโ้ ดยตรง ทาํ ใหโ้ ปรแกรมภาษาซีสามารถทาํ งานไดอ้ ยา่ งรวดเร็ว เอกสาร
ประกอบการสอนน้ีจึงใช้โปรแกรมภาษาซีเป็ นโปรแกรมหลัก ซ่ึงประกอบด้วยโปรแกรม
42
บรรณาธิกรณ์และซีซีเอสซี คอมไพเลอร์ (CCSC Compiler) ของบริษทั Custom Computer Services
ดาวน์โหลด (Download) โปรแกรมเพื่อการศึกษาจากเวบ็ ไซต์ www.ccsiofo.com โดยซีซีเอสซี
คอมไพเลอร์ เป็ นโปรแกรมที่มีโครงสร้างทางภาษา มีฟังก์ชั่นจากคลัง (Library Function)
เช่นเดียวกนั กบั ภาษาซีมาตรฐาน (ANSI Standard C) ลกั ษณะภาษาอยูใ่ นรูปแบบของฟังก์ชนั่ ทาํ
ความเขา้ ใจได้ง่าย โปรแกรมหน่ึงประกอบด้วยฟังก์ชั่นเดียวหรือหลายฟังก์ชั่นก็ได้ แต่มีส่วน
เพ่ิมเติมที่ใช้เฉพาะกับการควบคุมไมโครคอนโทรลเลอร์ เช่น ชุดคําส่ังประมวลผลก่อน
(Preprocessor Directive) และฟังก์ชนั่ สาํ เร็จรูป (Build in Function) ซ่ึงมาพร้อมกบั คอมไพเลอร์
จุดเด่นของโปรแกรมภาษาซี เมื่อเปรียบเทียบกบั ภาษาเบสิกและภาษาแอสเซมบลี คือมีความ
ยืดหยุ่นในการนาํ ไปใช้กับไมโครคอนโทรลเลอร์ตระกูลอื่น และมีฟังก์ชั่นจากคลัง (Library
Functions) และฟังก์ชนั่ สําเร็จรูป (Build-in Function) ซ่ึงมากบั คอมไพเลอร์นาํ ไปใชง้ านง่ายและ
สะดวก จึงใชใ้ นการพฒั นาต่อยอดสร้างเป็นชิ้นงานไดง้ ่าย
รูปที่ 2.3 ข้นั ตอนการพฒั นาโปรแกรมภาษาซีควบคุมไมโครคอนโทรลเลอร์
43
จากจุดเด่นของภาษาซี เอกสารประกอบการสอนน้ีจึงเลือกโปรแกรมภาษาซีเป็ น
โปรแกรมหลักใ นก ารเรี ย นก ารส อน ข้ันตอนก ารพัฒนาโปรแกรมภาษ าซี ควบคุ ม
ไมโครคอนโทรลเลอร์ แสดงดงั รูปท่ี 2.3
2.3.1 โครงสร้างโปรแกรมภาษาซีมาตรฐาน
โปรแกรมภาษาต่าง ๆ จะมีโครงสร้างเฉพาะที่แตกต่างกนั ออกไป สําหรับโปรแกรม
ภาษาซี มีโครงสร้างและลาํ ดบั การเขียนดงั น้ี แสดงดงั รูปที่ 2.4
2.3.1.1 ชุดคาํ ส่ังประมวลผลก่อน (Preprocessor Directive) ข้ึนตน้ ดว้ ยเครื่องหมาย #
ตวั อยา่ ง เช่น
#include <stdio.h>
หมายความวา่ ใหต้ วั ประเมินผลก่อนไปอ่านขอ้ มูลจากแฟ้ม stdio.h ซ่ึงเป็ นแฟ้ม
ท่ีมีอยูใ่ นคลงั เมื่อโปรแกรมมีการเรียกใชช้ ุดคาํ ส่ังอ่านและบนั ทึก จะตอ้ งใชข้ อ้ มูลจากแฟ้ม stdio.h
ชุดคาํ ส่งั ตวั ประเมินผลก่อนจะตอ้ งเขียนไวต้ อนตน้ ของโปรแกรมเสมอ
2.3.1.2 ชุดคาํ สง่ั มีลาํ ดบั ข้นั การเขียนดงั น้ี
1) ชุดคาํ ส่ังประกาศครอบคลุม (Global Declaration Statement) ใชป้ ระกาศตวั
แปรส่วนกลาง โดยที่ตวั แปรส่วนกลางน้ีทุกส่วนของโปรแกรมสามารถเรียกใชไ้ ด้
2) ต้นแบบฟังก์ชั่น (Function Prototypes) ใช้ประกาศฟังก์ชั่น เพ่ือบอกให้
ตวั แปลโปรแกรมทราบถึง ชนิดของตวั แปรท่ีส่งกลบั และชนิดของค่าต่าง ๆ ท่ีส่งไปกระทาํ การใน
ฟังกช์ นั่
3) ฟังกช์ นั่ หลกั (Main Function) เม่ือส่งั ใหก้ ระทาํ การชุดคาํ ส่ัง ฟังก์ชนั่ หลกั จะ
เป็ นจุดเริ่มตน้ ของการกระทาํ ภายในฟังก์ชัน่ หลกั ประกอบด้วยชุดคาํ สั่งและชุดคาํ สั่งที่เรียกใช้
ฟังกช์ นั่ อ่ืน เม่ือมีการทาํ งานตามชุดคาํ สง่ั และฟังกช์ นั่ ตา่ ง ๆ แลว้ จะมีการส่งค่าและกลบั มาทาํ งานที่
ฟังกช์ นั่ หลกั จนจบฟังกช์ นั่
4) ฟังกช์ นั่ (Functions) ฟังกช์ นั่ หมายถึง กลุ่มของชุดคาํ สั่งท่ีทาํ งานใดงานหน่ึง
โดยเป็นอิสระจากฟังกช์ นั่ หลกั การเขียนฟังก์ชนั่ ข้ึนตน้ ดว้ ยขอ้ มูลท่ีส่งกลบั ชื่อฟังก์ชนั่ วงเล็บและ
ตามดว้ ยเคร่ืองหมายปี กกา ภายในเคร่ืองหมายปี กกกาประกอบดว้ ยชุดคาํ สง่ั ภาษาซี
5) ชุดคาํ สั่งประกาศตวั แปรเฉพาะที่ (Local Declaration Statements) ใช้ประกาศ
ตวั แปรเฉพาะที่ โดยท่ีตวั แปรเฉพาะที่ จะถูกเรียกใชไ้ ดเ้ ฉพาะภายในฟังกช์ นั่ เทา่ น้นั
44
รูปที่ 2.4 โครงสร้างของโปรแกรมภาษาซี
2.3.1.3 ชุดคาํ สั่งหมายเหตุ (Comment Statements) คือขอ้ ความท่ีเขียนไวเ้ พ่ืออธิบาย
ความหมายชุดคาํ ส่ัง ตวั แปลโปรแกรมจะไม่แปลชุดคาํ ส่ังหมายเหตุให้เป็ นภาษาเครื่อง การเขียน
ชุดคาํ ส่งั หมายเหตุทาํ ได้ 2 แบบ ไดแ้ ก่
1) // หนา้ ขอ้ ความหมายเหตุ ตวั อยา่ ง // หมายเหตุ
2) /*..*/ เขียนหมายเหตุไวร้ ะหวา่ งเคร่ืองหมาย ตวั อยา่ ง /* หมายเหตุ */
2.3.2 โครงสร้างโปรแกรมซีซีเอสซี คอมไพเลอร์ (CCSC Compiler)
ภาษาซีสาํ หรับการควบคุมไมโครคอนโทรลเลอร์ บทเรียนน้ีใชโ้ ปรแกรมบรรณาธิกรณ์
และคอมไพเลอร์ของโปรแกรมซีซีเอสซี คอมไพเลอร์ ซ่ึงมีชุดคาํ สั่งเพ่ิมเติมนอกเหนือจากชุดคาํ ส่ัง
ของภาษาซีมาตรฐาน ประกอบดว้ ย
45
2.3.2.1 ชุดคาํ ส่ังประมวลผลก่อน เป็ นชุดคาํ ส่ังท่ีใชจ้ ดั เตรียมขอ้ มูลเพ่ือการประมวลผล
คอมไพเลอร์จะแปลความหมายเป็ นภาษาเคร่ืองเป็ นลาํ ดบั แรกก่อนชุดคาํ ส่ังประเภทอื่น การเขียน
ชุดคาํ สั่งประมวลผลก่อนจะตอ้ งข้ึนตน้ ดว้ ยเคร่ืองหมาย # (Pound Sign) แลว้ ตามดว้ ยชื่อโปรแกรม
หรือชื่อตวั แปรท่ีตอ้ งการกาํ หนดค่า รายละเอียดชุดคาํ ส่ังประมวลผลก่อนของโปรแกรมซีซีเอสซี
คอมไพเลอร์ แสดงดงั ตารางที่ 2.2
ตารางที่ 2.2 รายละเอียดชุดคาํ สัง่ ประมวลผลก่อนของโปรแกรมซีซีเอสซี คอมไพเลอร์
ชุดคาํ สั่งมาตรฐาน ความหมายและตวั อย่างการใช้งาน
#include <File name> นาํ ไฟลท์ ี่อยใู่ น <...> มาคอมไพลด์ ว้ ย
ตวั อยา่ งการใชง้ าน
#include <16F877A.h>
#include “File name” นาํ ไฟลท์ ี่กาํ หนดใน “...” มาคอมไพลด์ ว้ ย
ตวั อยา่ งการใชง้ าน
#include “C:\include\RS232.c”
#define ID STRIING กาํ หนดให้ ID เทา่ กบั STRIING
ตวั อยา่ งการใชง้ าน #define BITS 8
a = a+BITS 8; // เหมือนกบั a = a+8
#define hi (x) (x<<4)
// เหมือนกบั a = (a <<4)
a= hi (x);
#IF expr กาํ หนดการแปลอยา่ งมีเง่ือนไข if (expr) …else …endif
#ELSE ตวั อยา่ งการใชง้ าน
#ENDIF #IF MAX_VALUE > 255
long value; // ถา้ MAX_VALUE มากกวา่ 255 บรรทดั น้ีจะถูกแปล
#else
int value; // ถา้ MAX_VALUE นอ้ ยกวา่ 255 บรรทดั น้ีจะถูกแปล
#end if
46
ตารางที่ 2.2 (ต่อ) ความหมายและตวั อย่างการใช้งาน
ชุดคาํ ส่ังมาตรฐาน
ยกเลิกส่ิงที่ไดก้ าํ หนดไวด้ ว้ ยชุดคาํ สง่ั ประมวลผลก่อน #define
#UNDEF id ตวั อยา่ งการใชง้ าน #define MAXSIZE 150
#ERROR #if MAXSIZE <200
#undef MAXSIZE
ควบคุมคอมไพเลอร์ #define MAXSIZE 100
#priority #endif
#ORG
สร้างขอ้ ผดิ พลาดเตือนในขณะคอมไพลโ์ ปรแกรม
กาํ หนดอปุ กรณ์ ตวั อยา่ งการใชง้ าน
#DEVICE CHIP #if BUFFER_SIZE>16
#FUSE options #error Buffer size is too large
#endif // ถา้ มากกวา่ 16 ขอ้ ความหลงั #error จะเตือน
ความหมายและตัวอย่างการใช้งาน
กาํ หนดความสาํ คญั ของการเกิดอินเตอรัพต์
ตวั อยา่ งการใชง้ าน : #priority rtcc,rb
การกาํ หนดจุดเร่ิมตน้ ในการใชง้ านพ้นื ท่ีหน่วยความจาํ รอม
ตวั อยา่ งการใชง้ าน
#ORG 0x1E00, 0x1FFF
MyFunc () { // ฟังกช์ นั่ น้ีกาํ หนดหน่วยความจาํ รอมที่ 1E00
}
ความหมายและตัวอย่างการใช้งาน
กาํ หนดเบอร์ของไมโครคอนโทรลเลอร์ที่ใชง้ าน
ตวั อยา่ งการใชง้ าน # device PIC16F877A
#device PIC16F877A*=16 ADC=10
กาํ หนดองคป์ ระกอบเง่ือนไข (configuration) ไมโครคอนโทรลเลอร์
ตวั อยา่ งการใชง้ าน
#fuses HS //ใชค้ วามถี่คริสตอลชนิดความเร็วสูง
#fuses NOWDT //ไมใ่ ชว้ อตด็อกไทเมอร์
47
ตารางท่ี 2.2 (ต่อ)
ฟังก์ช่ันจากคลงั ความหมายและตัวอย่างการใช้งาน
#USE delay (clock) กาํ หนดความถ่ีคริสตอลท่ีใชก้ บั ไมโครคอนโทรลเลอร์
ตวั อยา่ งการใชง้ าน : #use delay (Clock=2000000)
# USE FAST_IO กาํ หนดการใชง้ านพอร์ตอินพตุ หรือเอาตพ์ ตุ โดยการเขา้ ถึงรีจิสเตอร์
ตวั อยา่ งการใชง้ าน : #use fast_io (A)
# USE FIXED_IO กาํ หนดใหเ้ ป็ นพอร์ตอินพตุ หรือเอาตพ์ ุตอยา่ งใดอยา่ งหน่ึงตลอดการ
ใชง้ าน
ตวั อยา่ งการใชง้ าน : #use fixed_io (a_outputs=PIN_A2, PIN_A3)
# USE I2C กาํ หนดการใชง้ านฟังกช์ นั่ จากคลงั I2C BUS ที่เก่ียวขอ้ งกบั ฟังกช์ นั่
I2C_START, I2C_STOP, I2C_READ, I2C_WRITE, I2C_POOL
ตวั อยา่ งการใชง้ าน : #use I2C (master, sda=PIN_B0, scl=PIN_B1)
#use I2C (slave, sda=PIN_C4, scl=PIN_C3,address=0xa0, FORCE_HW)
# USE RS232 กาํ หนดการใชง้ านพอร์ตอนุกรม อตั ราบอด และขาพอร์ตใชเ้ ป็น
อินพตุ เอาตพ์ ตุ อนุกรม
ตวั อยา่ ง : #use RS232(baud=9600, xmit=PIN_A2, rcv=PIN_A3)
# USE STANDARD_IO คา่ เร่ิมตน้ สาํ หรับกาํ หนดการทาํ งานของพอร์ตตลอดการใชง้ าน
ตวั อยา่ งการใชง้ าน : #use standard_io (A)
ฟังก์ชั่นขยายชุดคาํ ส่ัง ความหมายและตวั อย่างการใช้งาน
#int_xxx กาํ หนดใหฟ้ ังกช์ นั่ ที่ต่อจาก #int_xxx เป็นฟังกช์ นั่ อินเตอร์รัพตต์ ามท่ี
กาํ หนดในชุดคาํ สัง่ ประมวลผลก่อน xxx แทนช่ืออินเตอร์รัพตต์ า่ ง
ตวั อยา่ งการใชง้ าน
#int_AD //Analog to digital
adc_handler () {
adc_active=FALSE;
}
#int_rtcc noclear
Isr() {
…}
48
ตารางที่ 2.2 (ต่อ) ความหมายและตวั อย่างการใช้งาน
ฟังก์ช่ันขยายชุดคาํ ส่ัง
#int_DEFAULT กาํ หนดใหฟ้ ังกช์ นั่ ท่ีต่อจาก #int_default เป็นฟังกช์ นั่ อินเตอร์รัพต์
เร่ิมตน้ ถา้ อินเตอร์รัพตถ์ ูกการกระตุน้ และไม่มีการกาํ หนดฟังกช์ นั่
#INLINE อินเตอร์รัพต์
ตวั อยา่ งการใชง้ าน
ควบคุมหน่วยความจํา #int_default
#ASM default_isr()
#ENDASM {
Printf(“Unexplained interrupt\r\n”);
}
กาํ หนดใหฟ้ ังกช์ นั่ ท่ีต่อจาก #inline เป็นฟังกช์ นั่ แบบ inline function
เมื่อมีการเรียกใชฟ้ ังกช์ นั่ น้ี รหสั ของฟังกช์ นั่ ท่ีกาํ หนดเป็น inline จะ
ถูกคดั ลอกไปยงั ที่มีการเรียกใชง้ าน
ตวั อยา่ งการใชง้ าน
#inline swapbyte (int &a, int &b) {
int t; t = a;
a = b, b = t; }
ความหมายและตัวอย่างการใช้งาน
กาํ หนดจุดเริ่มตน้ และสิ้นสุดชุดคาํ สง่ั ภาษาแอสเซมบลี
ตวั อยา่ งการใชง้ าน
int find_parity (int data) {
int count;
#asm
movlw 0x8
movwf count
movlw 0
#aendsm
}
49
ตารางท่ี 2.2 (ต่อ)
ควบคุมหน่วยความจํา ความหมายและตวั อย่างการใช้งาน
#BIT id = const.const กาํ หนดการใชง้ านบิตขอ้ มูล
ตวั อยา่ งการใชง้ าน
#BIT id = id.const
#bit T0IF = 0xb.2
…
T0IF = 0xb.0; // clear Timer 0 interrupt flag
#BYTE id = const กาํ หนดการใชง้ านไบตข์ อ้ มูล
ตวั อยา่ งการใชง้ าน
#BIT id = id
#byte status = 3
#LOCATE id = const ใชจ้ องหน่วยความจาํ เร่ิมตน้ ท่ีตอ้ งการใหก้ บั ตวั แปรที่กาํ หนดข้ึน
ตวั อยา่ งการใชง้ าน
float x;
#locate x = 0x50
#RESERVE สงวนพ้นื ท่ีหน่วยความจาํ ชุดคาํ สัง่ ประมวลผลก่อน #device ตอ้ ง
กาํ หนด ก่อนใชง้ าน
ตวั อยา่ งการใชง้ าน
#device PIC16F877A
#reserve 0x60 : 0x6f
#ROM กาํ หนดใหเ้ ขียนขอ้ มูลไปที่หน่วยความจาํ EEPROM ในตาํ แหน่งที่
กาํ หนด
ตวั อยา่ งการใชง้ าน
#rom 0x2100 = {1,2,3,4,5,6,7,8}
กาํ หนดใหร้ ีจิสเตอร์ภายในมีค่าเป็นศูนย์ ก่อนท่ีโปรแกรมจะเร่ิมตน้
#ZERO_RAM
ทาํ งาน
ตวั อยา่ งการใชง้ าน
#zero_ram
Void main() {
}
ที่มา : (ประจิน พลงั สันติกุล, PIC C Programming กบั ccsc คอมไพเลอร์, (กรุงเทพฯ : แอพซอฟตเ์ ทค, 2551), 47-63.
50
2.3.2.2 ตวั แปร เป็ นชื่อของหน่วยความจาํ ที่ตาํ แหน่งใด ๆ เมื่อนาํ ขอ้ มูลไปเก็บไวใ้ น
หน่วยความจาํ ตาํ แหน่งน้นั ๆ จะกล่าวว่า ตวั แปรน้นั มีค่าเท่ากบั ขอ้ มูลท่ีเก็บไว้ ตวั แปรสามารถเก็บ
ค่าชนิดต่าง ๆ ตามที่ไดป้ ระกาศไวใ้ นโปรแกรมเท่าน้นั ตวั แปรเหล่าน้ีจะไม่สามารถเก็บค่าชนิดอื่น
นอกเหนือจากชนิดท่ีประกาศไว้ และค่าท่ีเก็บไวใ้ นตวั แปรน้ีสามารถเปลี่ยนค่าไดต้ ลอดเวลา ข้ึนกบั
ชุดคาํ ส่งั ภายในโปรแกรม ประกอบดว้ ย
1) ตวั แปรที่ใชเ้ กบ็ ขอ้ มูลชนิดจาํ นวนเตม็ (Integer)
2) ตวั แปรท่ีใชเ้ กบ็ ขอ้ มูลชนิดจาํ นวนจริง (Float)
3) ตวั แปรที่ใชเ้ กบ็ ขอ้ มูลชนิดอกั ขระ (Character)
4) ตวั แปรท่ีใชเ้ กบ็ ขอ้ มูลชนิดสายอกั ขระ (String)
2.3.2.3 กฎการต้งั ช่ือตวั แปร มีขอ้ กาํ หนดดงั น้ี
1) หา้ มใชต้ วั อกั ษรพิเศษ เช่น !, @, #, $, %, * เป็นตน้
2) ประกอบดว้ ย a ถึง z, 0 ถึง 9 และ _ เท่าน้นั
3) อกั ขระตวั แรกตอ้ งเป็น a ถึง z, และ _
4) หา้ มใชช้ ื่อซ้าํ กบั คาํ สงวน (Keyword) หรือคาํ ท่ีมีอยใู่ นคลงั ขอ้ มูลของภาษาซี
และฟังกช์ นั่ สาํ เร็จรูป เช่น char, float, int, output_b เป็นตน้ ดงั ตารางที่ 2.3
5) ตวั พมิ พใ์ หญ่ ตวั พมิ พเ์ ลก็ มีความหมายที่แตกตา่ งกนั เช่น Abc กบั abc หา้ ม
เวน้ ช่องวา่ งระหวา่ งชื่อของตวั แปร
ตารางท่ี 2.3 รายละเอียดของคาํ สงวนซ่ึงกาํ หนดโดยซีซีเอสซี คอมไพเลอร์
auto double unsigned case union static void else
long switch continue return for signed break float
char extern volatile struct default goto const if
short int register enum sizeof while do typedef
ทมี่ า : (ประจิน พลงั สนั ติกลุ , PIC C Programming กบั ccsc คอมไพเลอร์, (กรุงเทพฯ : แอพซอฟตเ์ ทค, 2551), 65-67.
2.3.2.4 ชนิดขอ้ มูล (Data Types) ขอ้ มูลที่นาํ มาใชเ้ ขียนโปรแกรมมีหลายชนิด ขอ้ มูลมี
ขนาดท่ีแตกต่างกนั ไปตามชนิดขอ้ มูล เน่ืองจากไมโครคอนโทรลเลอร์ขนาดของหน่วยความจาํ มี
จาํ นวนจาํ กดั นอ้ ยกวา่ คอมพิวเตอร์ชนิดต้งั โต๊ะมาก ดงั น้นั ซีซีเอสซี คอมไพเลอร์จึงกาํ หนดขนาด
และชนิดขอ้ มูลตามขนาดหน่วยความจาํ ของไมโครคอนโทรลเลอร์ แสดงดว้ ยตารางท่ี 2.4
51
ตารางที่ 2.4 รายละเอียดชนิดขอ้ มูลซ่ึงกาํ หนดโดยโปรแกรมซีซีเอสซี คอมไพเลอร์
ชนิดข้อมูล การใช้ในโปรแกรม ขนาดข้อมูล ช่วงของข้อมูล
character char ตวั อกั ขระ 8 บิต ตวั อกั ขระรหสั แอสก้ี
integer int1 ตวั เลข 1 บิต 0 หรือ 1
integer int8 ตวั เลข 8 บิต 0 หรือ 255
integer int16 ตวั เลข 1 บิต 0 หรือ 65,535
integer int32 ตวั เลข 32 บิต 0 ถึง 4,294,967,295
single –precision float ตวั เลขทศนิยม 32 บิต 3.4 x10-38 ถึง 3.4 x1038
floating-point
short integer short ตวั เลข 1 บิต 0 ถึง 255
long integer long ตวั เลข 16 บิต 0 ถึง 65,535
integer int ตวั เลขจาํ นวนเตม็ 8 บิต 0 หรือ 255
void void ไมก่ าํ หนด -
ที่มา : (ประจิน พลงั สันติกลุ , PIC C Programming กบั ccsc คอมไพเลอร์, (กรุงเทพฯ : แอพซอฟตเ์ ทค, 2551), 65-67.
2.3.2.5 ประเภทการเก็บขอ้ มูลตวั แปรและฟังก์ชนั่ ของซีซีเอสซี คอมไพเลอร์ มีรายละเอียด
2 ส่วน คือ ชนิดขอ้ มูล (Data Type) และวิธีการเก็บขอ้ มูล (Storage Class) เม่ือเราสร้างตวั แปรข้ึนมา
จะระบุเพียงชนิดขอ้ มูล เช่น int, char เป็นตน้ โปรแกรมจะจดั ใหเ้ ป็ นชนิด auto (สามารถปรับเปลี่ยนได้
โดยอตั โนมตั ิ) ถ้าตอ้ งการใช้งานบนหน่วยความจาํ โปรแกรมหรือบนรีจิสเตอร์จะต้องระบุใน
ข้นั ตอนการสร้าง ตวั กาํ หนดประเภทหน่วยความจาํ แสดงรายละเอียดดงั ตารางที่ 2.5
ตารางท่ี 2.5 ตวั กาํ หนดประเภทหน่วยความจาํ ของโปรแกรมซีซีเอสซี คอมไพเลอร์
คุณสมบัติ รายละเอยี ด
auto เป็นการระบุเป็นประเภทหน่วยความจาํ อตั โนมตั ิ ใชไ้ ดภ้ ายในฟังกช์ นั่ เท่าน้นั
(automatic)
static ประกาศเป็นแบบครอบคลุม คา่ เริ่มตน้ ท่ี 0 ใชภ้ ายในหรือภายนอกฟังกช์ นั่ กไ็ ด้
extern เป็นการบอกใหร้ ู้วา่ ตวั แปรท่ีถูกประกาศมีการใชง้ านแลว้ ในฟังกช์ นั่ อ่ืน
register เป็นการประกาศไวใ้ นหน่วยความจาํ ความเร็วสูง
ที่มา : (ประจิน พลงั สันติกลุ , PIC C Programming กบั ccsc คอมไพเลอร์, (กรุงเทพฯ : แอพซอฟตเ์ ทค, 2551), 65-67.
52
2.3.2.6 ตวั แปรชนิดตวั เลข (Numeric variable types) แบ่งไดเ้ ป็ น 2 กลุ่มคือ
1) ตวั แปรจาํ นวนเตม็ (Integer) หมายถึงตวั แปรที่ใชเ้ ก็บค่าท่ีเป็นจาํ นวนเตม็
เช่น char, int, short, long, unsigned char, unsigned int, unsigned short และ unsigned long
ตัวอย่างท่ี 2.1 แสดงการจดั เก็บตวั แปรจาํ นวนเต็ม โดยใชเ้ น้ือที่ 8 บิต ประกอบดว้ ยบิตเครื่องหมาย
(Sign Bit) 1 บิตและบิตขอ้ มูล 7 บิต การจดั เก็บตวั แปรจาํ นวนเตม็ ที่ประกอบดว้ ยบิตเครื่องหมาย
แสดงดงั รูปท่ี 2.5 และการจดั เก็บตวั แปรจาํ นวนเตม็ ท่ีไม่มีการเก็บเคร่ืองหมายแสดงดงั รูปท่ี 2.6
รูปที่ 2.5 การจดั เก็บตวั แปรจาํ นวนเตม็ ซ่ึงประกอบดว้ ยบิตเคร่ืองหมาย
ตัวอย่างที่ 2.2 การจดั เก็บตวั แปรจาํ นวนเตม็ ใชเ้ น้ือที่ 8 บิต โดยไมม่ ีบิตเคร่ืองหมาย
รูปท่ี 2.6 การจดั เกบ็ ตวั แปรจาํ นวนเตม็ โดยไม่มีบิตเครื่องหมาย
2) ตวั แปรจาํ นวนจริง (Real Variables) หรือตวั แปรจุดลอยตวั (Floating-point
Variables) หมายถึงตวั แปรท่ีใชเ้ กบ็ คา่ ที่เป็นจาํ นวนจริง ซ่ึงเป็นตวั เลขท่ีเป็นจุดทศนิยม ใชเ้ น้ือที่เกบ็
ขอ้ มูลจาํ นวน 32 บิต
ตวั อย่างที่ 2.3 การจดั เก็บตวั แปรจาํ นวนจริงชนิด float ใชเ้ น้ือท่ีเก็บขอ้ มูลจาํ นวน 32 บิต ประกอบดว้ ย
บิตเคร่ืองหมาย (Sign Bit) 1 บิต เลขช้ีกาํ ลงั (Exponent) 8 บิตและแมนทิสซา (Mantissa) 23 บิต
แสดงดงั รูปที่ 2.7
รูปท่ี 2.7 การจดั เกบ็ ตวั แปรจาํ นวนจริง
53
ตวั แปรจาํ นวนจริง เขียนไดห้ ลายแบบดงั น้ี
(ก) แบบตรึง (Fixed Point) เช่น 9.35, -100.602 และ +2.0 เป็นตน้
(ข) แบบจุดลอยตวั (Floating Point) เช่น 9.35e-3 และ -100.602e2 เป็นตน้
2.3.3 การประกาศตวั แปรภาษาซีมาตรฐาน
โดยเขียนชุดคาํ ส่งั ข้ึนตน้ ดว้ ยชนิดขอ้ มูล และจบชุดคาํ สง่ั ดว้ ยเคร่ืองหมายอฒั ภาค “;”
ชนิดขอ้ มูล ชื่อตวั แปร;
ถา้ ตอ้ งการประกาศตวั แปรชนิดเดียวกนั หลายตวั ตอ้ งคนั่ ระหว่างตวั แปรด้วย
จุลภาค “,” และจบชุดคาํ ส่งั ดว้ ยเคร่ืองหมายอฒั ภาค “;” รูปแบบการประกาศตวั แปร
ชนิดขอ้ มูล ช่ือตวั แปร1, ช่ือตวั แปร2, ... ;
ตัวอย่างที่ 2.4 การประกาศตวั แปรชนิดเดียวกนั หลายตวั
int count; // ประกาศตวั แปรชื่อ count ใชเ้ ก็บขอ้ มูลชนิด integer
float x, y; // ประกาศตวั แปรช่ือ x และ y ใชเ้ กบ็ ขอ้ มูลชนิด float
2.3.3.1 ตวั แปรชนิดอกั ขระ (Character Variable Types)
ตวั แปรชนิดอกั ขระ (char) ถูกจดั เก็บไวใ้ นหน่วยความจาํ ในรูปแบบจาํ นวนเต็ม
ขนาด 1 ไบต์ ดงั น้นั ตวั แปรชนิดอกั ขระจึงสามารถใชง้ านไดท้ ้งั แบบอกั ขระและจาํ นวนเต็ม ตวั อยา่ ง
การใชต้ วั แปรชนิดอกั ขระ printf (“% c % d\n”, ‘a’, ‘a’) ; เป็นฟังกช์ นั่ ที่ใชส้ าํ หรับใหแ้ สดงอกั ขระ a
ในรูปแบบ char (% c) และสัง่ ใหแ้ สดงผลในรูปแบบของจาํ นวนเตม็ (% d)
ตัวอย่างที่ 2.5 การประกาศตวั แปรชนิดอกั ขระ
#include <stdio.h>
void main () {
printf (“%c %d\n”, ‘a’, ‘a’) ;
}
ผลการกระทาํ a 97
54
หลกั การประกาศใชง้ านหรือการต้งั ชื่อตวั แปรในภาษาซีมาตรฐาน สามารถนาํ ไปใชก้ บั
ซีซีเอสซี คอมไพเลอร์ได้
2.3.4 การประกาศใชง้ านตวั แปรของซีซีเอสซี คอมไพเลอร์
2.3.4.1 การประกาศใชง้ านตวั แปรระบุประเภทหน่วยความจาํ ไมโครคอนโทรลเลอร์มี
หน่วยความจาํ ขนาดเล็ก เพื่อให้เกิดความเร็วในการประมวลผล จึงตอ้ งใชช้ ุดคาํ สั่งช้ีเฉพาะกาํ หนด
ในการประกาศใชง้ าน รูปแบบการประกาศ
ประเภทหน่วยความจาํ ชนิดขอ้ มูล ชื่อตวั แปร;
ตัวอย่างที่ 2.6 การประกาศตวั แปรระบุประเภทหน่วยความจาํ
register int8 reg8; // ใช้ reg8 แทน register int8 ได้
regi8 ri8; // การใชง้ านตวั แปร ri8 มีขอ้ มูลเป็น register int8
2.3.4.2 การประกาศใชง้ านตวั แปรประเภทโครงสร้าง (Structured Variable) ตวั แปร
ประเภทโครงสร้าง หมายถึง กลุ่มของตวั แปรซ่ึงอยูร่ วมกนั ภายใตช้ ื่อเดียวกนั ตวั แปรที่อยูร่ วมกนั
อาจจะเป็ นชนิดเดียวกนั หรือต่างชนิดก็ได้ ประโยชน์เพื่อรวบรวมขอ้ มูลที่สัมพนั ธ์กนั ให้อยู่ภายใต้
ชื่อตวั แปรโครงสร้างเดียวกนั รูปแบบการประกาศ
Struct { ชื่อตวั แปร
ชนิดตวั แปร ชื่อตวั แปร [จาํ นวนสมาชิก1];
ชนิดตวั แปร ช่ือตวั แปร [จาํ นวนสมาชิก2];
} ชื่อที่ใชใ้ นการอา้ งอิงตวั แปรโครงสร้าง;
ตวั อย่างที่ 2.7 การประกาศตวั แปรโครงสร้าง
structure
{
byte time; // ตวั แปรขนาด 8 บิต
byte command : 4; // ตวั แปรขนาด 4 บิต
byte source : 4; // ตวั แปรขนาด 4 บิต
} msg;
55
2.3.4.3 การประกาศใชช้ ุดคาํ ส่ัง typedef สร้างชนิดขอ้ มูลช่ือใหม่ โดยสามารถนาํ ชนิด
ขอ้ มูลท่ีมีอยู่เดิมมาต้งั ชื่อใหม่ได้ ประโยชน์ของ typedef คือ ทาํ ให้ชุดคาํ ส่ังประกาศตวั แปรกระชบั
และนาํ ไปใชก้ บั เครื่องไดห้ ลายระบบโดยเปลี่ยนเฉพาะ typedef รูปแบบการใชช้ ุดคาํ ส่งั typedef
typedef ประเภทหน่วยความจาํ ชนิดขอ้ มูล ชื่อที่กาํ หนด
ตัวอย่างที่ 2.8 การใชง้ านคาํ สั่ง typedef
typedef register int8 reg8; // ใช้ reg8 แทน register int8 ได้
regi8 ri8; // การใชง้ านตวั แปร ri8 มีขอ้ มูลเป็นregister int8
2.3.4.4 การประกาศใชง้ านตวั แปรแถวลาํ ดบั (Array) ตวั แปรแถวลาํ ดบั หมายถึง เน้ือที่
ในหน่วยความจาํ ท่ีเรียงต่อกัน ใช้ในการเก็บข้อมูลชนิดเดียวกนั หลายจาํ นวน การเขา้ ถึงข้อมูล
สามารถใช้ชื่อตวั แปรชื่อเดียวกนั ตามดว้ ยดชั นีกาํ กบั (Subscript) ท่ีบอกถึงตาํ แหน่งของขอ้ มูลใน
แถวลาํ ดบั น้นั รูปแบบและตวั อยา่ งการประกาศใชง้ าน
ชนิดขอ้ มูล ชื่อตวั แปรแถวลาํ ดบั [n] // ขนาด 1 มิติ
ตวั อย่างท่ี 2.9 int num [5]; // ตวั แปร num เป็นตวั แปรแถวลาํ ดบั มีขนาด 4 สมาชิก
รูปที่ 2.8 ลกั ษณะการจดั เก็บตวั แปรแถวลาํ ดบั ในหน่วยความจาํ
ทม่ี า : (มูลนิธิ สอวน., 2549, 114)
56
2.3.4.5 การอา้ งถึงสมาชิกแตล่ ะหน่วยของตวั แถวลาํ ดบั สามารถอา้ งถึง ดงั น้ี
ช่ือตวั แปรแถวลาํ ดบั [ดรรชนีกาํ กบั ]
ดรรชนีกาํ กับ หมายถึงนิพจน์หรือตวั แปรจาํ นวนเต็ม มีค่าต้งั แต่ 0 จาํ นวน
สมาชิกลบหน่ึง ตวั อยา่ งการอา้ งถึงสมาชิกในแถวลาํ ดบั สามารถอา้ งถึงสมาชิกแต่ละหน่วยของตวั
แปรแถวลาํ ดบั n[ ] โดยใช้ n[0], n[1], n[2], n[3] และ n[4]
ตวั อยา่ งที่ 2.10 การใชช้ ุดคาํ สั่งอา้ งถึงสมาชิกในแถวลาํ ดบั
int n [5];
n[4] = 25;
2.3.4.6 การประกาศใชง้ านตวั แปรแถวลาํ ดบั เพ่ือเก็บขอ้ มูลชนิดอกั ขระ ในการเก็บขอ้ มูล
ท่ีเป็ นสายอกั ขระ (String) ตอ้ งเก็บแต่ละอกั ขระไวใ้ นตวั แปรแถวลาํ ดบั โดยอกั ขระหน่ึงตวั คือ
สมาชิกหน่วยหน่ึงของแถวลาํ ดบั ซ่ึงใชเ้ น้ือท่ี 1 ไบตแ์ ละจบสายอกั ขระดว้ ย ‘\0’ รูปแบบการประกาศใช้
งานตวั แปรแถวลาํ ดบั เพื่อเก็บขอ้ มูลชนิดอกั ขระ1
char ช่ือตวั แปรลาํ ดบั [n];
ตัวอย่างท่ี 2.11 การประกาศใชง้ านตวั แปรแถวลาํ ดบั เพื่อเก็บขอ้ มูลชนิดอกั ขระ “MICRO” ซ่ึงมีขนาด
5 ตวั อกั ษรและวธิ ีการเก็บขอ้ มูล แสดงดงั รูปท่ี 2.9
char string [6];
รูปที่ 2.9 ลกั ษณะการจดั เกบ็ สายอกั ขระ “MICRO” ในหน่วยความจาํ
1 มูลนิธิ สอวน., การเขยี นโปรแกรมคอมพวิ เตอร์ภาษาซี, พมิ พค์ ร้ังท่ี 2 (กรุงเทพฯ: ด่านสุทธาการพิมพ,์ 2549), 118.
57
ตวั อย่างที่ 2.12 การใชง้ านตวั แปรแถวลาํ ดบั ในการควบคุมการแสดงผลแอลอีดีตวั เลข 7 ส่วน โดย
การสร้างตวั แปรข้ึนมาเก็บคา่ การแสดงผลของตวั เลขฐานสิบหก
char num_LED[8] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, // แสดงตวั เลข 0, 1, 2, 3, 4
0x6D, 0x7D, 0x07}; // แสดงตวั เลข 5, 6, 7
รูปท่ี 2.10 ผลจากการใชค้ าํ ส่งั
เมื่อตอ้ งการแสดงผล ให้ส่งค่าประจาํ ตาํ แหน่งไปให้กบั ตวั แปรแถวลาํ ดบั เช่น
ตอ้ งการแสดงเลขสาม เขียนชุดคาํ สง่ั ไดด้ งั น้ี num_LED[3] // ส่งค่า 3 ไปใหก้ บั ตวั แปรแถวลาํ ดบั
2.3.4.7 การประกาศใชง้ านตวั แปรแถวลาํ ดบั สองมิติ เพื่อใชเ้ ก็บขอ้ มูลชนิดต่าง ๆ โดย
มองเป็นรูปตารางขอ้ มูล รูปแบบการประกาศแสดงดงั รูปที่ 2.11
ชนิดขอ้ มูล ชื่อตวั แปรแถวลาํ ดบั [nrows][ncolums];
เม่ือ ชนิดขอ้ มูล คือชนิดของขอ้ มูลที่เกบ็ ในตวั แปรแถวลาํ ดบั
nrows หมายถึง จาํ นวนแถวเป็นจาํ นวนเตม็ บวก
ncolums หมายถึง จาํ นวนสดมภเ์ ป็นจาํ นวนเตม็ บวก
ตัวอย่างที่ 2.13 int y [3] [4]; // ตวั แปร y เป็นตวั แปรแถวลาํ ดบั มีขนาด 3×4 สมาชิก
รูปท่ี 2.11 ผลจากการใชค้ าํ ส่งั
58
การเกบ็ ขอ้ มูลตวั แปรแถวลาํ ดบั สองมิติในหน่วยความจาํ มีลาํ ดบั ดงั รูปที่ 2.12
รูปที่ 2.12 การเกบ็ ขอ้ มูลของตวั แปรแถวลาํ ดบั สองมิติในหน่วยความจาํ
ตวั อยา่ งท่ี 2.14 การประกาศตวั แปรแถวลาํ ดบั 2 มิติ เพื่อเก็บขอ้ มูลชนิดอกั ขระ
char str [2] [8] = { “MICRO”, // ‘M’, ‘I’, ‘C’, ‘R’, ‘O’, ‘\0’, ‘\0’‘\0’
“CONTROL”, // ‘C’, ‘O’, ‘N’, ‘T’, ‘R’, ‘\O’, ‘\L’‘\0’};
2.3.5 ตวั คงท่ี (Constant)
ลกั ษณะการใช้งานคลา้ ยตวั แปร ค่าที่เก็บในตวั คงที่จะคงเดิมไม่มีการเปลี่ยนแปลงจนจบ
โปรแกรม แต่คา่ คงที่เกบ็ ในตวั แปรสามารถเปล่ียนแปลงไดต้ ลอดเวลา การประกาศตวั คงที่ ทาํ ได้ 2 วธิ ี
ดงั น้ี
2.3.5.1 ใชค้ าํ หลกั const ตามรูปแบบดงั น้ี
const ชนิดขอ้ มูล ชื่อตวั แปร = ค่าที่เก็บในตวั แปร;
ตัวอย่างท่ี 2.15 char const name[17] = {“Microcontrollers”};
const int i = 120; // กาํ หนดให้ i เป็นตวั คงที่ชนิด int และเกบ็ ค่า 120
const float pi = 3.14; // กาํ หนดให้ pi เป็นตวั คงท่ีชนิด float เก็บค่า 3.14
59
2.3.5.2 ใชต้ วั ประเมินผลก่อน ตามรูปแบบดงั น้ี
#define ช่ือตวั คงที่ คา่ คงที่;
ตัวอย่างที่ 2.16 การประกาศตวั คงท่ีโดยใชช้ ุดคาํ ส่งั #define
#define COL 10 // กาํ หนดให้ COL เป็นตวั คงท่ี ชนิด int และเก็บคา่ 10
#define PI 3.14; // กาํ หนดให้ PI เป็นตวั คงที่ ชนิด float และเกบ็ ค่า 3.14
2.3.6 ลาํ ดบั หลีก (Escape Sequence)
ในการแสดงผล บางสิ่งบางอยา่ งที่จะแสดง อาจไม่ใช่ตวั อกั ษร จึงไม่สามารถท่ีจะเขียน
สิ่งที่จะแสดงไวใ้ นโปรแกรมได้ เช่น ตอ้ งการเขียนโปรแกรมใหส้ ่งเสียง (แสดงผลเป็ นเสียง) หรือ
ตอ้ งการใหเ้ ลื่อนข้ึนบรรทดั ใหม่ก่อนแสดงขอ้ ความ ดงั น้นั ในการเขียนโปรแกรมให้แสดงผลสิ่งที่
ไม่ใช่ตวั อกั ขระปกติ จะต้องใช้ลาํ ดบั หลีก เพื่อช่วยในการกาํ หนดอกั ขระพิเศษหรือส่ิงที่ไม่ใช่
อกั ขระท่ีตอ้ งการใหโ้ ปแกรมแสดง
ลาํ ดบั หลีก จะเขียนดว้ ยเคร่ืองหมายทบั กลบั หลงั “\” แลว้ ตามดว้ ยอกั ขระ ในการทาํ งาน
เครื่องหมายทบั กลบั หลงั จะบอกให้คอมไพเลอร์ทราบวา่ ให้หลีกเล่ียงการตีความอกั ขระท่ีตามหลงั
มาน้ีในลกั ษณะปกติ เพราะอกั ขระเหล่าน้ีจะมีความหมายพิเศษแตกต่างออกไป ลาํ ดบั หลีกท่ีใชใ้ น
การแสดงผลส่ิงท่ีไม่ใช่อกั ขระปกติ แสดงดงั ตารางที่ 2.6
ตารางที่ 2.6 ลาํ ดบั หลีกที่ใชใ้ นการแสดงผลส่ิงท่ีไมใ่ ช่อกั ขระปกติ
ลาํ ดบั หลกี ผลการกระทาํ
\n ข้ึนบรรทดั ใหม่ (New Line)
\t เล่ือนไปยงั จุดต้งั ระยะ (Tab) ถดั ไป
\a เสียงกระดิ่ง (Bell)
\b ถอยไปหน่ึงที่วา่ ง (Backspace)
\f ข้ึนหนา้ ใหม่ (Form Feed)
\\ แสดงเคร่ืองหมายทบั กลบั หลงั (Backslash)
\’ แสดงเครื่องหมายฝนทอง (Single Quote)
\” แสดงเครื่องหมายฟันหนู (Double Quote)
ทม่ี า : (มลู นิธิ สอวน., 2549, 15)
60
2.3.7 นิพจน์ (Expressions)
ในภาษาซี นิพจน์ หมายถึงส่ิงที่ประมวลผลแลว้ สามารถเป็นค่าตวั เลขได้ ซ่ึงแต่ละนิพจน์
จะมีระดบั ความยากง่ายในการประมวลผลที่แตกตา่ งกนั
นิพจน์ท่ีมีระดบั การประมวลผลแบบง่ายท่ีสุด จะประกอบดว้ ย ตวั แปรเพียงตวั เดียว หรือ
ค่าคงที่ นิพจน์ที่มีลกั ษณะเป็นคา่ คงที่ เช่น 100, ‘g’ เป็นตน้
นิพจนท์ ่ีเป็ นคา่ คงที่และเป็นสัญลกั ษณ์ เช่น
#define VAT 7
#define PI 3.14159
const int a = 35;
const char ch = ‘m’;
จากชุดคาํ สง่ั ในภาษาซีดงั กล่าวขา้ งตน้ ทาํ ให้ VAT, PI, a และ ch ต่างเป็นนิพจนท์ ี่เป็ น
ค่าคงท่ี นิพจน์ท่ีมีลกั ษณะเป็ นตวั แปร เช่น
int count;
float count;
char ch;
จากชุดคาํ ส่งั ในภาษาซีดงั กล่าวขา้ งตน้ ทาํ ให้ count, count และ ch ต่างเป็ นนิพจน์ที่เป็ น
ตวั แปร ดงั น้นั นิพจน์ จึงหมายถึง จาํ นวนใดจาํ นวนหน่ึงตอ่ ไปน้ี
2.3.7.1 จาํ นวนเตม็ จาํ นวนเดียว
2.3.7.2 จาํ นวนจริงจาํ นวนเดียว
2.3.7.3 ตวั เลขจาํ นวนเต็ม หรือ ตวั เลขจาํ นวนจริงหลายจาํ นวนท่ีเช่ือมโยงกนั ดว้ ยตวั
ดาํ เนินการ +, -, *, / หรือ % ซ่ึงเรียกวา่ การคาํ นวณทางคณิตศาสตร์
สาํ หรับนิพจนท์ ี่มีระดบั การประมวลผลท่ีซบั ซอ้ น จะประกอบดว้ ยนิพจน์ท่ีมีระดบั การ
ประมวลผลอยา่ งง่ายหลายนิพจน์และเช่ือมต่อกนั ดว้ ยตวั ดาํ เนินการ2 เช่น
นิพจน์ท่ีประกอบดว้ ย 2 นิพจน์ และ 1 ตวั ดาํ เนินการ
54 * 7;
นิพจน์ท่ีมีความซบั ซอ้ นมากข้ึน เช่น
Temp1 * 2 /(sqrt+ score2 * 5)*.001;
2 เร่ืองเดียวกนั , 19.
61
2.3.8 ชุดคาํ ส่งั กาํ หนดคา่ (Assignment Statement)
คือชุดคาํ ส่ังท่ีใชส้ าํ หรับสั่งใหน้ าํ ผลลพั ธ์ของนิพจน์ที่อยดู่ า้ นขวาของตวั ดาํ เนินการเท่ากบั
“=” มาเก็บไวใ้ นตวั แปรที่อยู่ด้านซ้ายของตวั ดาํ เนินการเท่ากบั ชุดคาํ ส่ังกาํ หนดค่าใช้กาํ หนดค่า
ใหก้ บั ตวั แปร มีรูปแบบการใชด้ งั น้ี3
ตวั แปร = นิพจน์;
ตวั อย่างท่ี 2.17 การเขียนชุดคาํ สัง่ โดยใชต้ วั ดาํ เนินการกาํ หนดคา่
Temp = 10.5; // ตวั แปร Temp มีคา่ เทา่ กบั 10.5
Result = 25 * 6; // ตวั แปร Result มีค่าเทา่ กบั 150
2.3.9 การคาํ นวณทางคณิตศาสตร์
ในการเขียนโปรแกรม เพ่ือทาํ การคาํ นวณทางคณิตศาสตร์ จะตอ้ งใชต้ วั ดาํ เนินการต่าง ๆ
ซ่ึงมีวธิ ีการใชง้ านและการทาํ งานดงั ตารางที่ 2.7
ตารางท่ี 2.7 ตวั ดาํ เนินการในการคาํ นวณทางคณิตศาสตร์
การ ตวั ตวั อย่าง การทาํ งาน
คํานวณ ดาํ เนินการ
บวก + c = a + b; นาํ ค่าที่เกบ็ ไวใ้ น a บวกกบั คา่ ท่ีเก็บใน b ผลลพั ธ์เกบ็ ไวใ้ น c
ลบ - c = a - b; นาํ คา่ ท่ีเกบ็ ไวใ้ น b ลบออกจากค่าที่เกบ็ ใน a
ผลลพั ธ์เก็บไวใ้ น c
คูณ * c = a * b; นาํ คา่ ท่ีเก็บไวใ้ น a คูณกบั คา่ ที่เก็บใน b ผลลพั ธ์ไวเ้ ก็บใน c
นาํ ค่าที่เกบ็ ไวใ้ น a เป็นตวั ต้งั ค่าท่ีเกบ็ ใน b เป็นตวั หาร เก็บ
ผลหารไวใ้ น c ถา้ ท้งั ตวั ต้งั และตวั หารต่างเป็นจาํ นวนเตม็
หาร / c = a / b; ค่าที่เกบ็ ใน c จะเป็นจาํ นวนเตม็ ถา้ ตวั ต้งั หรือตวั หารตวั ใดตวั
หน่ึงเป็นจาํ นวนจริง ผลลพั ธ์ที่ไดจ้ ะเป็นจาํ นวนจริง
มอดูลสั % c = a % b; นาํ ค่าที่เก็บไวใ้ น a เป็นตวั ต้งั คา่ ท่ีเกบ็ ใน b เป็นตวั หารแลว้
เก็บเศษไวใ้ น c
ทมี่ า : (มลู นิธิ สอวน., 2549, 21)
3 เรื่องเดียวกนั , 20.
62
2.3.10 ลาํ ดบั การดาํ เนินการในนิพจนท์ ่ีมีตวั ดาํ เนินการหลายตวั
ในกรณีท่ีนิพจนม์ ีตวั ดาํ เนินการหลายตวั จะตอ้ งดาํ เนินการตามลาํ ดบั ต่อไปน้ี
1) ()
2) * / %
3) + -
ถา้ ในนิพจนม์ ีตวั ดาํ เนินการที่มีลาํ ดบั เท่ากนั จะประมวลผลจากซา้ ยไปขวา
2.3.11 ตวั ดาํ เนินการเอกภาค (Unary Operator)
คือ การใชต้ วั ดาํ เนินการกบั ตวั แปรตวั เดียว ในที่น้ีจะแสดงการใชต้ วั ดาํ เนินการ 2 ตวั กบั
ตวั แปรตวั เดียว ซ่ึงมีลกั ษณะการใช้ 2 แบบ คือ
1) ตวั ดาํ เนินการเอกภาคเติมหลงั (Postfix mode) หมายถึง ตวั ดาํ เนินการเอกภาค
อยหู่ ลงั ตวั แปร เช่น a++ หมายถึง ใหเ้ พม่ิ ค่าใหต้ วั แปร a ข้ึนอีก 1
2) ตวั ดาํ เนินการเอกภาคเติมหนา้ (Prefix Mode) หมายถึงตวั ดาํ เนินการเอกภาค
อยหู่ นา้ ตวั แปร เช่น ++a หมายถึง ใหเ้ พิ่มคา่ ใหต้ วั แปร a ข้ึนอีก 1
การใชต้ วั ดาํ เนินการเอกภาคท้งั 2 แบบมีการใชง้ านดงั ตารางท่ี 2.8
ตารางที่ 2.8 การใชต้ วั ดาํ เนินการเอกภาค
การคํานวณ ตัวดาํ เนินการ ตวั อย่าง การทาํ งาน
เพิ่มคา่ ตวั ถูกดาํ เนินการทีละหน่ึง ++ x++ x = x +1
++x x = x +1
เพิม่ ค่าตวั ถูกดาํ เนินการทีละหน่ึง ++ --x x = x -1
x-- x = x -1
ลดคา่ ตวั ถูกดาํ เนินการทีละหน่ึง --
ลดค่าตวั ถูกดาํ เนินการทีละหน่ึง --
ทม่ี า : (มูลนิธิ สอวน., 2549, 27)
จะเห็นไดว้ า่ การใชต้ วั ดาํ เนินการเอกภาคท้งั 2 แบบ มีการทาํ งานเหมือนกนั แต่ในความ
เป็ นจริง ตวั ดาํ เนินการเอกภาคเติมหลงั มีความแตกต่างจากตวั ดาํ เนินการเอกภาคเติมหนา้ เม่ือมีการ
ใช้งานร่วมกบั การทาํ งานอื่นภายในชุดคาํ ส่ังเดียวกนั ตวั ดาํ เนินการเอกภาคเติมหลงั จะทาํ งานอื่น
ภายในชุดคาํ ส่งั เดียวกนั ก่อน จึงจะเพ่ิมค่าใหต้ วั แปร ตวั ดาํ เนินการเอกภาคเติมหนา้ จะเพิ่มค่าใหก้ บั
ตวั แปรก่อนแลว้ จึงจะทาํ งานอ่ืนภายในชุดคาํ ส่งั เดียวกนั
63
2.3.12 ตวั ดาํ เนินการประกอบ (Compound Operator)
เป็ นการใช้ตวั ดําเนินการหน่ึงตวั ร่วมกับเครื่องหมายเท่ากับ การใช้ตวั ดาํ เนินการ
ประกอบจะช่วยใหเ้ ขียนชุดคาํ ส่ังไดส้ ้ัน และเร็วข้ึน การใชต้ วั ดาํ เนินการประกอบ มีการใชง้ านดงั
ตารางท่ี 2.9
ตารางที่ 2.9 การใชต้ วั ดาํ เนินการประกอบ การทาํ งาน
ตัวดาํ เนินการประกอบ ตัวอย่าง
x=x+y
+= x+ = y x=x-y
-= x- = y x=x*y
*= x* = y x=x/y
/= x/ = y x=x%y
%= x% = y x = x&y
&= x& = y
ลาํ ดบั ข้นั ในการดาํ เนินการในกรณีที่ตวั ดาํ เนินการประกอบ ตวั ดาํ เนินการเอกภาคหลาย
ตวั จะประมวลผลตามลาํ ดบั ต่อไปน้ี
1) ()
2) ++ --
3) * / %
4) + -
5) += *= /= -= %=
ถา้ ในชุดคาํ สง่ั มีตวั ดาํ เนินการที่มีลาํ ดบั เท่ากนั จะประมวลผลจากซา้ ยไปขวา
2.3.13 การแปลงชนิดขอ้ มูล (Type Cast)
เป็นการใชต้ วั ดาํ เนินการหน่ึงตวั การแปลงชนิดขอ้ มูลมีหลายวิธี แต่ท่ีกล่าวในท่ีน้ีคือ
การแปลงชนิดขอ้ มูลโดยการกาํ หนดชนิดไวท้ ี่หนา้ ขอ้ มูลน้นั รูปแบบการใชช้ ุดคาํ ส่ังการแปลงชนิด
ขอ้ มูล โดยท่ี (ชนิดขอ้ มูล) นิพจน์ อาจมีหลายชุดแลว้ เชื่อมโยงกนั ดว้ ยตวั ดาํ เนินการ รูปแบบการใช้
ชุดคาํ ส่งั การแปลงชนิดขอ้ มูล
ตวั แปร = (ชนิดขอ้ มูล) นิพจน์;
64
ตวั อย่างท่ี 2.18 การเขียนชุดคาํ สัง่ แปลงชนิดขอ้ มูล
#include<stdio.h>
void main () {
int x;
x = 5.6 + 3.5;
x = (int) 5.6 + (int) 3.5 ;} // แปลง 5.6 ใหเ้ ป็น 5 และแปลง 3.5 ใหเ้ ป็น 3
ผลการกระทาํ คาํ สง่ั 8
2.3.14 การควบคุมโปรแกรม
โดยทว่ั ไปลาํ ดบั การกระทาํ การในโปรแกรมจะเป็ นแบบบนลงล่าง (Top-down) โดย
ปริยาย การกระทาํ การเริ่มตน้ ที่ฟังก์ชนั่ main () แลว้ กระทาํ ทีละชุดคาํ ส่ัง ต้งั แต่ชุดคาํ ส่ังแรกจนถึง
จนถึงชุดคาํ สั่งสุดท้ายตามลาํ ดับ จนกระทัง่ จบฟังก์ชั่น ส่วนใหญ่ในฟังก์ชั่นจะประกอบด้วย
ชุดคาํ สั่งควบคุม เพื่อควบคุมลาํ ดบั การกระทาํ การภายในโปรแกรม โดยอาจใหม้ ีการเลือกทาํ เพียง
บางชุดคาํ ส่ัง หรือ ให้ทาํ บางชุดคาํ ส่ังหลายคร้ัง ดงั น้นั จะเห็นไดว้ ่า ชุดคาํ ส่ังควบคุมโปรแกรมจะ
ช่วยเพิ่มขีดความสามารถในการกระทาํ การให้มีประสิทธิภาพทาํ ให้โปรแกรมสามารถทาํ งานได้
หลากหลายรูปแบบ อาทิ สามารถกาํ หนดเงื่อนไขโปรแกรมเลือกกระทาํ การหรือไม่กระทาํ การบาง
ชุดคาํ สั่ง ในโปรแกรมภาษาซีมีชุดคาํ ส่ังที่นกั เขียนโปรแกรมสามารถใชเ้ พ่ือควบคุมลาํ ดบั ของการ
กระทาํ การโปรแกรมหลายชนิด ซ่ึงจะอธิบายรายละเอียดต่อไป
2.3.14.1 ตวั ดาํ เนินการสัมพนั ธ์ ใชส้ ําหรับเปรียบเทียบนิพจน์ ผลของการเปรียบเทียบ
นิพจน์ที่มีตวั ดาํ เนินการสมั พนั ธ์ใหผ้ ลลพั ธ์เป็นจริงหรือเท็จ มีวธิ ีการใชง้ านดงั ตารางท่ี 2.10
ตารางท่ี 2.10 ความหมายและตวั อยา่ งการใชต้ วั ดาํ เนินการสัมพนั ธ์
ตวั ดาํ เนินการ ความหมาย ตัวอย่าง
= = เท่ากบั x = = y
> มากกวา่ x>y
< นอ้ ยกวา่ x<y
>= มากกวา่ หรือเท่ากบั x >= y
<= นอ้ ยกวา่ หรือเทา่ กบั x <= y
!= ไม่เทา่ กบั x != y
65
นิพจน์ที่มีการใชต้ วั ดาํ เนินการสัมพนั ธ์ เมื่อการเปรียบเทียบไดผ้ ลลพั ธ์เท่ากบั ศูนยจ์ ะ
แปลความหมายว่าเท็จ แต่ถ้าผลลัพธ์เท่ากับหน่ึงจะแปลความหมายว่าจริง ตวั อย่าง การแปล
ความหมายของนิพจน์ เม่ือกาํ หนดให้ x = 5; y = 10 สรุปผลการแปลความหมายได้ ดงั ตารางท่ี 2.11
ตารางที่ 2.11 ตวั อยา่ งการแปลความหมายการใชต้ วั ดาํ เนินการสัมพนั ธ์
นิพจน์ ผลลพั ธ์ ความหมาย นิพจน์ ผลลพั ธ์ ความหมาย
x==y 0 เทจ็ x <= y 1 จริง
จริง
x>y 0 เทจ็ x != y 1 จริง
x >= y 0 เทจ็ x*x < y*y 1
x+y >= x*y 0 เทจ็
2.3.14.2 ตวั ดาํ เนินการลอจิก (Logical Operator) ใช้สําหรับเช่ือมโยงความสัมพันธ์
ระหวา่ งนิพจนล์ อจิกต้งั แต่ 2 นิพจน์ข้ึนไป ผลจากการเชื่อมโยงความสัมพนั ธ์ดงั กล่าว จะให้ผลลพั ธ์
เป็นจริงหรือเทจ็ ตวั ดาํ เนินการลอจิก มีวธิ ีการใชด้ งั ตารางที่ 2.12
ตารางที่ 2.12 ความหมายและตวั อยา่ งการใชต้ วั ดาํ เนินการลอจิก
ตัวดําเนินการ ความหมาย ตวั อย่าง
&& และ (and) x &&y
|| หรือ (and) x || y
! ไม่ (not) !x
ตารางที่ 2.13 ตวั อยา่ งการใชต้ วั ดาํ เนินการลอจิก
x y นิพจน์ ผลลพั ธ์ การแปลความหมาย
nonzero (จริง) nonzero (จริง) x &&y 1 จริง
0 เทจ็
nonzero (จริง) 0 (เทจ็ ) x &&y 0 เทจ็
0 เทจ็
0 (เทจ็ ) nonzero (จริง) x &&y 1 จริง
1 จริง
0 (เทจ็ ) 0 (เทจ็ ) x &&y 1 จริง
nonzero (จริง) nonzero (จริง) x || y
nonzero (จริง) 0 (เทจ็ ) x || y
0 (เทจ็ ) nonzero (จริง) x || y
ทมี่ า : (มลู นิธิ สอวน., 2549, 58)
66
2.3.14.3 ลาํ ดบั ในการดาํ เนินการ ในนิพจน์ท่ีประกอบดว้ ยตวั ดาํ เนินการต่าง ๆ หลายชนิด
จะตอ้ งดาํ เนินการตามลาํ ดบั ดงั ต่อไปน้ี
1) ()
2) ++, --, +, -, ! (ตวั ดาํ เนินการเอกภาค)
3) *, /, %
4) +, -
5) <, <=, > และ >=
6) = =, !=
7) &&
8) ||
9) =, +=, -=, *=, /=, %=
ในกรณีท่ีนิพจน์มีตัวดําเนินการท่ีอยู่ในลําดับเดียวกันหลายตัว จะต้อง
ดาํ เนินการตวั ดาํ เนินการท่ีอยดู่ า้ นซา้ ยของนิพจนก์ ่อน มีวธิ ีการใชด้ งั ตารางที่ 2.14
ตารางท่ี 2.14 ตวั อยา่ งการใชล้ าํ ดบั ในการดาํ เนินการ
นิพจน์ การดาํ เนินการ ผลลพั ธ์ การแปลความหมาย
‘e’ + 1 = ‘f’ (‘e’ + 1) = = ‘f’ 1 จริง
3 < k + 3 && 0 (3 < ( k + 3)) && 0 0 เทจ็
20 * 3/5 || 0 && 5 ((20 * 3) / 5) || (0 && 5) 0 จริง
2.3.14.4 ชุดคาํ ส่งั ใหเ้ ลือกทาํ
1) ชุดคาํ ส่ัง if เป็ นชุดคาํ ส่ังให้ตรวจสอบผลลพั ธ์จากนิพจน์ ถา้ ผลลพั ธ์เป็ น
จริงใหท้ าํ งานตามชุดคาํ สง่ั ที่มีอยภู่ ายใน ชุดคาํ สง่ั if มี 2 รูปแบบ รูปแบบท่ี 1
if (นิพจน)์
ชุดคาํ สง่ั A;
67
ตัวอย่างท่ี 2.19 การใชช้ ุดคาํ สั่งในกรณีตรวจสอบเง่ือนไขก่อนกระทาํ การ
#include <stdio.h>
void main ()
{
int x, y, z;
y = 1; z = 5; x = y * z;
if (x = = 5) x++; // ถา้ x เทา่ กบั 5 เพิม่ คา่ x ข้ึนอีก 1
}
ผลการกระทาํ การ x = 6
ใชส้ ําหรับกรณีที่ชุดคาํ สั่งภายในชุดคาํ ส่ัง if มีเพียงชุดคาํ สั่งเดียวถา้ นิพจน์ใหผ้ ลลพั ธ์
เป็ นจริง จะกระทาํ การชุดคาํ ส่ัง A แต่ถา้ นิพจน์เป็ นเท็จจะไม่กระทาํ การชุดคาํ ส่ัง A แต่จะจบการ
ทาํ งานในชุดคาํ ส่งั if แลว้ ไปกระทาํ การชุดคาํ สง่ั ท่ีอยถู่ ดั ไป
2) รูปแบบการเขียนชุดคาํ ส่งั if แบบท่ี 2
if (นิพจน์)
{
ชุดคาํ ส่งั 1;
ชุดคาํ สง่ั 2;
...
ชุดคาํ ส่งั n;
}
ใชส้ ําหรับกรณีท่ีชุดคาํ ส่ังภายในชุดคาํ ส่ัง if มีมากกว่า 1 ชุดคาํ ส่ัง ชุดคาํ ส่ังเหล่าน้นั
จะตอ้ งอยภู่ ายในเคร่ืองหมายปี กกา “{…}” ถา้ นิพจนใ์ หผ้ ลลพั ธ์เป็นจริง จะกระทาํ การชุดคาํ ส่ัง 1 ถึง
ชุดคาํ ส่งั n แต่ถา้ นิพจนเ์ ป็นเทจ็ จะไมก่ ระทาํ การชุดคาํ สั่ง 1 ถึงชุดคาํ ส่ัง n ตวั อยา่ งการเขียนชุดคาํ ส่ัง
if แบบท่ี 2
68
ตัวอย่างที่ 2.20 การใชช้ ุดคาํ ส่งั ตรวจสอบเง่ือนไขก่อนกระทาํ การ ดว้ ยชุดคาํ สง่ั if แบบที่ 2
#include <stdio.h>
void main () {
int x, y;
scandf (“%d%d”, &x, &y); // รับคา่ จาํ นวนเตม็ 2 ค่ามาเก็บไวใ้ น x และ y
if (x > y) // เปรียบเทียบคา่ ของ x และ y ถา้ ท่ีเก็บใน x มีคา่ มากกวา่ y
{ x = x - y; // จะนาํ ผลลพั ธ์ของ x – y ไปเก็บไวใ้ น x
printf (“x is greater than y”); // แสดงขอ้ ความ x is greater than y
}
}
ผลการกระทาํ การ x = 6
3) ชุดคาํ ส่ัง if – else เป็ นชุดคาํ ส่ังให้ตรวจสอบผลลพั ธ์จากนิพจน์ ถา้ ผลลพั ธ์
เป็นจริงใหท้ าํ งานตามชุดคาํ ส่งั ที่อยภู่ ายในชุดคาํ ส่ัง if หากผลลพั ธ์เป็ นเท็จ กระทาํ การชุดคาํ ส่ังที่อยู่
ภายใน else การเขียนรูปแบบชุดคาํ สัง่ if - else แบบที่ 1
if (นิพจน)์ ชุดคาํ สัง่ A;
else ชุดคาํ สั่ง B;
ตัวอย่างที่ 2.21 การใชช้ ุดคาํ ส่งั ตรวจสอบเงื่อนไขก่อนกระทาํ การดว้ ยชุดคาํ สั่ง if - else แบบท่ี 1
#include <stdio.h>
void main () {
int x, y;
scandf (“%d%d”, &x, &y); // รับค่าจาํ นวนเตม็ 2 ค่ามาเก็บไวใ้ น x และ y
if (x > y) // เปรียบเทียบค่าของ x และ y
printf (x is greater than y ); // ถา้ x มากกวา่ y แสดง x is greater than y
else
printf (x is less than y ); // ถา้ ค่า x นอ้ ยกวา่ y แสดง x is less than y
}
69
ใชส้ าํ หรับกรณีที่ชุดคาํ ส่ังภายในชุดคาํ ส่ัง if ที่จะถูกกระทาํ การมีเพียงชุดคาํ ส่ังเดียว ถา้
นิพจน์เป็ นจริงจะกระทาํ การชุดคาํ ส่ัง A ถา้ นิพจน์เป็ นเท็จจะกระทาํ การชุดคาํ ส่ัง B การเขียน
รูปแบบชุดคาํ สั่ง if - else แบบที่ 2
4) ชุดคาํ สง่ั if – else แบบที่ 2
if (นิพจน์)
{
ชุดคาํ ส่งั 1;
ชุดคาํ สง่ั 2;
...
ชุดคาํ สง่ั n;
}
else
{
ชุดคาํ ส่งั n + 1;
ชุดคาํ สง่ั n + 2;
...
ชุดคาํ ส่งั m;
}
ใชส้ าํ หรับกรณีท่ีชุดคาํ สั่งท่ีถูกกระทาํ มีมากกวา่ 1 ชุดคาํ สั่ง เมื่อนิพจน์เป็ นจริง กลุ่มของ
ชุดคาํ สั่งที่จะถูกกระทาํ ตอ้ งอยูภ่ ายในเครื่องหมายปี กกา หรือกรณีชุดคาํ สั่งที่ถูกกระทาํ มีมากกวา่ 1
ชุดคาํ ส่ัง เม่ือนิพจน์เป็ นเท็จ กลุ่มของชุดคาํ สั่งที่จะถูกกระทาํ ตอ้ งอยู่ภายในเคร่ืองหมายปี กกา ถ้า
นิพจนใ์ หผ้ ลลพั ธ์เป็นจริง จะกระทาํ การชุดคาํ สั่ง 1 ถึงชุดคาํ ส่ัง n แต่ถา้ นิพจน์เป็ นเท็จจะกระทาํ การ
ชุดคาํ ส่งั n+1 ถึงชุดคาํ สง่ั m แสดงดงั ตวั อยา่ งที่ 2.22 เป็ นการใชช้ ุดคาํ ส่ัง if – else เพ่ือคาํ นวณระดบั
คะแนน และนบั จาํ นวนนกั ศึกษาในแต่ระดบั คะแนนความหมายโปรแกรม ถา้ x มีค่ามากกวา่ หรือ
เทา่ กบั 50 จริง จะนาํ ค่าคงท่ี p ไปเก็บไวใ้ น grade แลว้ เพ่ิมค่า p ข้ึนอีกหน่ึง ถา้ x มีค่านอ้ ยกวา่ 50 จะ
นาํ ค่าคงท่ี f ไปเก็บไวใ้ น grade แลว้ เพ่มิ ค่า f ข้ึนอีกหน่ึง
70
ตวั อย่างท่ี 2.22 การใชช้ ุดคาํ ส่งั แบบท่ี 2
#include<stdio.h>
void main ()
{
int x, p, f;
char grade;
p = 0; f = 0;
scanf (“%d”, &x);
if (x>= 50)
{
grade = ‘p’;
}
else
{
grade = ‘F’;
f ++;
}
}
5) ชุดคาํ สัง่ switch
ชุดคาํ ส่ัง switch เป็ นชุดคาํ สั่งท่ีให้เลือกทาํ ชุดคาํ ส่ัง หรือกลุ่มชุดคาํ ส่ังใด ๆ
โดยพิจารณาจากค่าของนิพจน์ ถา้ ค่าของนิพจน์เท่ากบั ค่าใดก็จะเริ่มกระทาํ การชุดคาํ ส่ังท่ีอยู่หลงั
คาํ หลกั case น้นั และกระทาํ การชุดคาํ ส่งั อื่นที่ตามมาท้งั หมด เม่ือค่าของนิพจน์จะต้องเป็ นตัวเลข
จาํ นวนเต็มหรืออกั ขระเท่าน้นั ชุดคาํ ส่ัง switch จะตรวจสอบนิพจน์ แลว้ นาํ ผลไปเปรียบเทียบกบั
ค่าท่ีตามหลงั คาํ หลกั case ถา้ เท่ากบั ค่าท่ีตามหลงั คาํ หลกั case ค่าใดก็จะกระทาํ การที่ขอ้ ความน้ัน
จากน้นั จะไปกระทาํ การท่ีขอ้ ความถดั ไปทุกชุดคาํ ส่ังที่ตามมา ในกรณีที่ผลลพั ธ์ของนิพจน์ไม่ตรง
กบั ค่าท่ีตามหลงั คาํ หลกั case จะไปกระทาํ การที่ชุดคาํ สั่งท่ีอยูเ่ บ้ืองหลงั default ผลลพั ธ์ของนิพจน์
ตอ้ งเป็นชนิด long, int, หรือ char อยา่ งใดอยา่ งหน่ึงเท่าน้นั
71
6) ชุดคาํ ส่งั break
ชุดคาํ ส่ัง break ใช้สําหรับควบคุมการกระทาํ การ โดยบงั คบั ให้หยุดการ
กระทาํ การชุดคาํ สั่ง switch เพื่อป้องกนั ไม่ให้การกระทาํ การชุดคาํ สั่งอื่นท่ีตามมาภายในชุดคาํ ส่ัง
switch ตวั อยา่ งรูปแบบการเขียนชุดคาํ สง่ั break ร่วมกบั ชุดคาํ สง่ั switch
switch (นิพจน์)
{
case 0 : printf (“command 0”);
break;
case 1 : printf (“command 1”);
break;
default : printf (“bad command”);
break;
}
2.3.14.4 การวนซ้าํ หมายถึง การควบคุมให้กระทาํ การบางชุดคาํ ส่ังหลายรอบ ซ่ึงจะ
ช่วยให้การเขียนโปรแกรมทาํ ไดง้ ่าย สะดวก ไม่ตอ้ งเขียนขอ้ ความชุดคาํ สั่งเดิมหลายคร้ัง ทาํ ให้
โปรแกรมมีความกระชบั สามารถตรวจสอบความผดิ พลาดไดง้ ่าย ชุดคาํ สง่ั วนซ้าํ มี 3 ชนิด ไดแ้ ก่
1) ชุดคาํ ส่งั for เป็นชุดคาํ ส่งั ที่สัง่ ใหก้ ระทาํ การชุดคาํ ส่ัง หรือกลุ่มของชุดคาํ ส่ัง
วนซ้าํ หลายรอบ โดยมีจาํ นวนรอบในการวนซ้าํ ที่แน่นอน รูปแบบการเขียนชุดคาํ สัง่ for
for (ค่าเร่ิมตน้ ; เง่ือนไข;ค่าเพม่ิ หรือค่าลด)
ชุดคาํ สง่ั ;
เม่ือ ค่าเร่ิมตน้ เงื่อนไข คา่ เพิ่มหรือคา่ ลด เป็นนิพจน์
ชุดคาํ สง่ั หมายถึง ชุดคาํ ส่งั ท่ีจะถูกกระทาํ ซ้าํ ซ่ึงอาจจะมีชุดคาํ ส่งั เดียวหรือ
หลายชุดคาํ สง่ั ก็ได้
ชุดคาํ สง่ั for มีข้นั ตอนการทาํ งาน ดงั น้ี
1. คาํ นวณคา่ เร่ิมตน้ ของตวั แปร ท่ีใชค้ วบคุมการวนซ้าํ
2. คาํ นวณหาผลลพั ธ์จากเง่ือนไข ที่อยูใ่ นรูปของนิพจน์ความสัมพนั ธ์ ซ่ึงจะ
ใหผ้ ลเป็นจริง (ศูนย)์ หรือเทจ็ (คา่ ที่ไม่เป็นศูนย)์
72
3. ถา้ ผลจากขอ้ 2 มีคา่ เป็นเทจ็ หรือ ศูนย์ ไปที่ขอ้ 7
4. ถา้ ผลจากขอ้ 2 มีค่าเป็ นจริง หรือ ค่าท่ีไม่ใช่ศูนย์ ชุดคาํ สั่งที่อยู่ภายใน
ชุดคาํ สง่ั for จะถูกกระทาํ
5. คาํ นวณค่าใหมข่ องตวั แปรท่ีใชค้ วบคุมการวนซ้าํ
6. กลบั ไปที่ขอ้ 2
7. จบการกระทาํ การชุดคาํ ส่ัง for และชุดคาํ ส่ังแรกที่อยถู่ ดั จากชุดคาํ ส่ัง for
จะถูกกระทาํ ในลาํ ดบั ต่อไป
ตัวอย่างที่ 2.23 การใชช้ ุดคาํ ส่งั for
#include<stdio.h>
int n;
void main ()
{
for (n = 1; n <= 3; n++)
printf (“%d”, n);
}
ผลการกระทาํ การ 123
2) ชุดคาํ สั่ง while เป็ นชุดคาํ ส่ังวนซ้าํ ที่สั่งให้กระทาํ การชุดคาํ ส่ังที่อยูภ่ ายใน
ชุดคาํ สง่ั while หลายรอบจนกระทง่ั เงื่อนไขเป็นเทจ็ หรือ ศูนย์ จึงจะจบการวนซ้าํ รูปแบบการเขียน
ชุดคาํ สง่ั while
while (เง่ือนไข)
ชุดคาํ สั่ง;
เมื่อเงื่อนไข ตอ้ งอยู่ในรูปของนิพจน์ที่ให้ผลลัพธ์เป็ นจริงหรือเท็จ และ
ชุดคาํ สง่ั while อาจจะมีชุดคาํ ส่งั เดียวหรือหลายชุดคาํ ส่งั กไ็ ด้
ชุดคาํ ส่งั while มีข้นั ตอนการทาํ งาน ดงั น้ี
1. คาํ นวณหาคา่ ของเง่ือนไข
2. ถา้ คา่ ของเง่ือนไข มีค่าเป็นเทจ็ หรือ ศูนย์ ไปท่ีขอ้ 5
3. ถา้ ค่าของเง่ือนไข มีค่าเป็ นจริง หรือ ค่าท่ีไม่ใช่ศูนย์ ชุดคาํ ส่ังท่ีอยภู่ ายใน
ชุดคาํ ส่งั while จะถูกกระทาํ
73
4. กลบั ไปท่ีขอ้ 1
5. จบการกระทาํ การชุดคาํ ส่ัง while และชุดคาํ ส่ังแรกที่อยถู่ ดั จากชุดคาํ สั่ง
while จะถูกกระทาํ ในลาํ ดบั ต่อไป
ตัวอย่างท่ี 2.24 การใชช้ ุดคาํ สง่ั while
#include<stdio.h>
int n;
void main ()
{
n = 1;
while (n <= 3)
{
printf (“\n%d”, n);
n++;
}
}
ผลการกระทาํ การ
1
2
3
3) ชุดคาํ ส่ัง do-while เป็ นชุดคาํ ส่ังวนซ้ํา ที่สั่งให้กระทาํ การชุดคาํ สั่งท่ีอยู่
ภายในชุดคาํ ส่ัง do- while หน่ึงรอบ แลว้ จึงจะตรวจสอบเง่ือนไข ถา้ เงื่อนไขเป็ นเท็จ จะจบการ
ทาํ งานทนั ที รูปแบบการเขียนชุดคาํ สง่ั do-while
do
ชุดคาํ สง่ั ;
while (เงื่อนไข);
โดยที่ เง่ือนไข ตอ้ งอยใู่ นรูปของนิพจนท์ ่ีใหผ้ ลลพั ธ์เป็นจริงหรือเทจ็
74
ชุดคาํ สั่งภายใน do-while อาจมีชุดคาํ สั่งเดียวหรือหลายชุดคาํ ส่ังก็ได้ มี
ข้นั ตอนการทาํ งานดงั น้ี
1. กระทาํ การชุดคาํ ส่งั ท่ีอยภู่ ายในชุดคาํ ส่งั do-while
2. คาํ นวณหาค่าของเง่ือนไข
3. ถา้ ค่าของเงื่อนไข มีค่าเป็ นเทจ็ หรือ ศูนย์ ไปท่ีขอ้ 5
4. ถา้ คา่ ของเง่ือนไข มีค่าเป็นจริง หรือ ค่าท่ีไมใ่ ช่ศูนย์ กลบั ไปที่ขอ้ 1
5. จบการกระทาํ การชุดคาํ สั่ง do-while และชุดคาํ สง่ั แรกท่ีอยถู่ ดั จาก
ชุดคาํ ส่งั do-while จะถูกกระทาํ ในลาํ ดบั ตอ่ ไป
ตัวอย่างท่ี 2.25 การใชช้ ุดคาํ ส่งั while-while
#include<stdio.h>
int n;
void main () {
n = 1;
do
{
printf (“%d”, n);
n++;
} while (n <= 3);
}
ผลการกระทาํ การ 123
2.3.15 ฟังกช์ นั่
ฟังก์ชั่น (Function) คือ กลุ่มของชุดคาํ สั่ง มีวตั ถุประสงค์ เพื่อแบ่งโปรแกรมเป็ น
ส่วนย่อย ๆ แต่ละฟังก์ชนั่ เขียนข้ึนเพ่ือให้ทาํ งานอย่างใดอย่างหน่ึง นอกจากฟังก์ชนั่ main() แลว้
โปรแกรมภาษาซีประกอบดว้ ยฟังก์ชั่นอ่ืนก่ีฟังก์ชัน่ ก็ได้อาจมีการส่งขอ้ มูลไปและกลบั ระหว่าง
ฟังกช์ นั่ ฟังก์ชนั่ อาจเรียกใชฟ้ ังกช์ นั่ อ่ืนหรือตวั เองได้ โดยการทาํ งานของโปรแกรมจะเริ่มทาํ งานที่
ชุดคาํ สง่ั แรกในฟังกช์ นั่ main() ก่อน
75
2.3.15.1 ฟังกช์ นั่ ที่เรียกใชฟ้ ังกช์ นั่ อื่น มีรูปแบบ
ชนิดขอ้ มูล ช่ือฟังกช์ นั่ (การประกาศพารามิเตอร์ - ถา้ มี)
{
การประกาศตวั แปรเฉพาะท่ี
กลุ่มชุดคาํ ส่งั
[return]
}
ชนิดขอ้ มูล คือ ขอ้ มูลที่ฟังกช์ นั่ ส่งกลบั ถา้ ใช้ void ฟังกช์ นั่ ไมส่ ่งกลบั ขอ้ มูลใดๆ
การประกาศพารามิเตอร์ คือ การกาํ หนดชนิดตวั แปรที่เป็ นตวั รับค่า ถา้ มีมากกวา่
1 ตวั ใชจ้ ุลภาค “,” คนั่ ระหวา่ งแตล่ ะตวั
การประกาศตวั แปรเฉพาะที่คือ การประกาศตวั แปรที่ใชโ้ ดยเฉพาะในฟังกช์ นั่
return คือ ชุดคาํ ส่งั ที่ใชใ้ นการส่งค่ากลบั ค่าที่ส่งกลบั คือ คา่ หลงั return
2.3.15.2 การส่งผา่ นขอ้ มูลระหวา่ งอาร์กิวเมนตแ์ ละพารามิเตอร์มีข้นั ตอนการทาํ งาน
1) คาํ นวณนิพจน์ที่เป็นอาร์กิวเมนต์
2) คดั ลอกค่าอาร์กิวเมนตใ์ หก้ บั พารามิเตอร์ ท่ีอยใู่ นลาํ ดบั ตรงดนั
3) ทาํ งานตามชุดคาํ ส่งั ในฟังกช์ นั่ จนจบ หรือเม่ือพบชุดคาํ ส่งั Return
4) ส่งกลบั ค่าท่ีอยใู่ นชุดคาํ สัง่ Return (ถา้ มี)
2.3.15.3 ตน้ แบบฟังก์ชนั่ (Prototype function) ลาํ ดบั การกาํ หนดฟังก์ชนั่ อาจกาํ หนด
ฟังก์ชัน่ ท่ีถูกเรียกก่อนฟังก์ชัน่ เป็ นตวั เรียก ในกรณีท่ีกาํ หนดฟังก์ชัน่ ที่เป็ นตวั เรียกไวก้ ่อน ตอ้ งมี
ตน้ แบบฟังก์ชัน่ ก่อนฟังก์ชนั่ ที่เป็ นตวั เรียก โดยส่วนมากมกั กาํ หนดตน้ แบบฟังก์ชัน่ ของฟังก์ชั่น
ท้งั หมดในโปรแกรม หลงั ชุดคาํ ส่งั ตวั ประเมินผลก่อน รูปแบบการเขียนตน้ แบบฟังกช์ นั่
ชนิดขอ้ มูล ช่ือฟังกช์ นั่ (ชนิดของพารามิเตอร์)
เม่ือชนิดขอ้ มูล คือ ชนิดขอ้ มูลที่ฟังกช์ นั่ จะส่งกลบั ถา้ ฟังกช์ นั่ ไม่ส่ง
ชนิดของพารามิเตอร์ คือ ชนิดขอ้ มูลของพารามิเตอร์ ถา้ มีมากกว่า 1 ตวั ใช้
จุลภาค “,” คนั่ ระหวา่ งแต่ละตวั กรณีไม่มีพารามิเตอร์ใหใ้ ส่ void
รูปแบบการเขียนตน้ แบบฟังกช์ นั่
#include<stdio.h>
76
void fun (void)// ตน้ แบบฟังกช์ นั่
void main () // ฟังกช์ นั่ ที่เป็นตวั เรียก
{
...
fun ( );
...
}
void fun ( ) // ฟังกช์ นั่ ที่ถูกเรียก
{
...
}
2.3.15.4 ฟังกช์ นั่ จากคลงั (Library Function)
นอกเหนือจากการกาํ หนดฟังกช์ นั่ เองแลว้ สามารถเรียกใชฟ้ ังกช์ นั่ จากคลงั ได้
การเรียกฟังก์ชนั่ จากคลงั เหมือนการเรียกฟังก์ชนั่ ที่กาํ หนดเอง แต่ไม่ตอ้ งกาํ หนดฟังก์ชนั่ น้นั ๆ ใน
โปรแกรม โดยตอ้ งมีชุดคาํ ส่ังตวั ประมวลผลก่อน #include ตอนตน้ ของโปรแกรม ในบทเรียนน้ีจะ
กล่าวถึงเฉพาะฟังก์ชั่น ที่มีการเรียกใช้งานสําคญั ๆ พอสังเขป ดงั ตารางท่ี 2.15 ข้อมูลเพ่ิมเติม
สามารถศึกษาได้จากโฟลเดอร์ C:\Program Files\PICC\Drivers ของซีซีเอสซี คอมไพเลอร์
คอมไพเลอร์ รูปแบบการเขียนชุดคาํ ส่งั เรียกใชฟ้ ังกช์ นั่
#include (ชื่อแฟ้มขอ้ มูลท่ีเก็บการทาํ งานของฟังกช์ นั่ )
77
ตารางท่ี 2.15 ตวั อยา่ งฟังกช์ นั่ จากคลงั ท่ีมีการเรียกใชง้ าน
ฟังก์ชั่น ความหมาย
LCD.C เป็นฟังกช์ นั่ รองรับการแสดงผลบนจอภาพผลึกเหลว (Liquid Crystal Display)
KBD.C เป็นฟังกช์ นั่ รองรับการใชง้ านแป้นพมิ พ์ (Keyboard)
TOUCH.C เป็นฟังกช์ นั่ รองรับการติดต่อสื่อสารกบั อุปกรณ์ที่สื่อสารดว้ ยระบบบสั 1-wire
LCD420.C เป็ นฟังกช์ นั่ รองรับการแสดงผลบนจอภาพผลึกเหลว ขนาด 4 บรรทดั 20 ตวั อกั ษร
GLCD.C เป็นฟังกช์ นั่ รองรับการแสดงผลบนจอภาพผลึกเหลวแบบกราฟฟิ ค
TONE.C เป็นฟังกช์ นั่ รองรับการแสดงผลดว้ ยสัญญาณเสียง
ตัวอย่างที่ 2.26 การเขียนชุดคาํ สัง่ เรียกใชฟ้ ังกช์ นั่ จากคลงั
#include (lcd.c) // ใชเ้ ม่ือตอ้ งการแสดงผลบนจอภาพผลึกเหลว
#include (touch.c) // ใชเ้ ม่ือตอ้ งการติดต่อกบั อุปกรณ์ท่ีส่ือสารดว้ ยระบบบสั หน่ึงสาย
#include (tones.c) // ใชเ้ ม่ือตอ้ งการแสดงผลดว้ ยสญั ญาณเสียง
2.3.16 ตวั ช้ี (Pointer)
เป็ นลกั ษณะเด่นของเครื่องมือดาํ เนินการท่ีสาํ คญั ท่ีสุดในภาษาซี ตวั ช้ี มีประโยชน์มาก
ในการจดั การโครงสร้างขอ้ มูลแบบพลวตั (Dynamic Data Structure) เช่น รายการเชื่อมโยง (Linked
List) ตวั ช้ียงั มีประโยชน์ในแง่ของประสิทธิภาการทาํ งาน ช่วยให้โปรแกรมทาํ งานไดเ้ ร็วข้ึนและ
ประหยดั เน้ือท่ีในหน่วยความจาํ เน้ือหาในส่วนน้ีจะแสดงในหวั ขอ้ การใชง้ านตวั ช้ีกบั ฟังกช์ นั่
2.3.16.1 การประกาศตวั แปรชนิดตวั ช้ี จะเก็บค่าเลขที่อยขู่ องหน่วยความจาํ ซ่ึงแตกต่าง
จากตวั แปรชนิดอ่ืนที่จะเก็บค่าที่แทจ้ ริง รูปแบบการประกาศใชต้ วั แปรชนิดตวั ช้ี
ชนิดขอ้ มูล *ชื่อตวั แปร
int *iptr
2.3.16.2 ตวั ดาํ เนินการตวั ช้ี ประกอบดว้ ยตวั ดาํ เนินการเลขท่ีอยู่ (Address Operator) และ
ตวั ดาํ เนินการอา้ งอิง (Dereferencing Operator)
78
1) ตวั ดาํ เนินการเลขท่ีอยู่
ตวั ดาํ เนินการน้ีจะใชเ้ ครื่องหมาย & นาํ หนา้ ตวั แปร หมายความถึงตาํ แหน่งท่ี
อยขู่ องตวั แปรน้นั ในหน่วยความจาํ รูปแบบการประกาศใชต้ วั แปรชนิดตวั ช้ี
ตวั แปรชนิดตวั ช้ี = & ตวั แปรเก็บเลขท่ีอยู่
iptr = & i;
2) ตวั ดาํ เนินการอา้ งอิง ตวั ดาํ เนินการน้ีใช้เคร่ืองหมายดอกจนั (*) นาํ หนา้ ตวั
แปรชนิดตวั ช้ี ซ่ึงจะอา้ งถึงค่าขอ้ มูลท่ีตวั แปรชนิดตวั ช้ีน้ันช้ีไป ซ่ึงค่าของข้อมูลท่ีตวั ช้ีอา้ งอิงน้ี
สามารถถูกเปล่ียนแปลงค่าได้ เช่น การเพ่ิมค่า โดยใช้ชุดคาํ ส่ัง (*iptr)++ จะเป็ นการเพิ่มค่าท่ีตวั ช้ี
iptr ช้ีไป การแสดงค่าท่ีตัวช้ีช้ีไปก็สามารถทําได้โดยใช้ชุดคําส่ัง printf (“%d”,*iptr);
ตวั อย่างท่ี 2.27 ตวั อยา่ งการใชง้ านดาํ เนินการตวั แปรชนิดตวั ช้ี
int i; // i เป็นตวั แปรชนิด int สมมุติมีเลขท่ีอยู่ 0x10;
int j; // j เป็นตวั แปรชนิด int สมมุติมีเลขท่ีอยู่ 0x12;
int *iptr // *iptr เป็นตวั แปรชนิดตวั ช้ี สมมุติมีเลขท่ีอยู่ 0x14;
ผลจากการใชช้ ุดคาํ สง่ั แสดงไดด้ งั รูปที่ 2.13
รูปท่ี 2.13 ผลจากการใชช้ ุดคาํ สั่งตวั แปรชนิดตวั ช้ี
ชุดคาํ สง่ั เพิ่มต่อจากตวั อยา่ งท่ี 2.27
i = 20; // ใหน้ าํ ค่า 20 ไปเกบ็ ท่ีตวั แปร i ซ่ึงอยทู่ ่ีเลขท่ี 0x10
iptr = &i; // กาํ หนดใหต้ วั ช้ี iptr ไปช้ีขอ้ มูลที่เลขที่อยขู่ องตวั แปร i (0x10)
j = *iptr; // นาํ ขอ้ มูลตาํ แหน่งซ่ึงตวั ช้ีกาํ ลงั ช้ีอยู่ มากาํ หนดคา่ ใหก้ บั ตวั แปร j
79
ผลจากการกระทาํ ชุดคาํ ส่ังรูปที่ 2.13 แสดงดงั รูปที่ 2.14 ตวั ช้ี *iptr ทาํ หนา้ ที่เก็บเลขที่
อยขู่ องตวั แปร i ซ่ึงเป็ นชนิดเลขจาํ นวนเต็ม เครื่องหมายดอกจนั (*) เป็ นเครื่องหมายบอกใหท้ ราบ
วา่ iptr เป็นตวั แปรชนิดตวั ช้ี
จากชุดคาํ ส่ัง j = *iptr รูปท่ี 2.57 เป็ นการส่ังให้นาํ ขอ้ มูลชนิดเลขจาํ นวนเต็ม (มีค่าเท่ากบั
20) ที่เกบ็ อยใู่ นหน่วยความจาํ เลขท่ี 0x10 มาเก็บท่ีตวั แปร j เป็นผลให้ j มีค่าเท่ากบั 20 ดว้ ย
รูปท่ี 2.14 ผลจากการใชช้ ุดคาํ สัง่ ตวั แปรชนิดตวั ช้ี
2.3.16.3 การใชต้ วั ช้ีกบั ตวั แปรชนิดแถวลาํ ดบั
ตวั แปรชนิดตวั ช้ีสามารถช่วยอาํ นวยความสะดวกในการเขา้ ถึงขอ้ มูล ที่เก็บอยู่
ในแถวลาํ ดบั ได้ โดยในข้นั ตอนแรกจะตอ้ งกาํ หนดใหต้ วั แปรชนิดตวั ช้ีช้ีไปยงั สมาชิกตวั แรกของตวั
แปรแถวลาํ ดบั เสียก่อน ซ่ึงมี 2 รูปแบบ แสดงดงั รูปท่ี 2.15
รูปที่ 2.15 รูปแบบการใชต้ วั ช้ีกบั ตวั แปรชนิดแถวลาํ ดบั
ตวั อย่างท่ี 2.28 การใชต้ วั ช้ีในการอา้ งถึงแถวลาํ ดบั แสดงดงั รูปที่ 2.16
int a[10];
int *aPtr;
aPtr = a;
80
รูปที่ 2.16 การใชต้ วั ช้ีในการอา้ งถึงแถวลาํ ดบั
หลงั จากชุดคาํ ส่ัง aPtr = a; สามารถใชต้ วั แปรชนิดตวั ช้ีน้ีในการเขา้ ถึงขอ้ มูลใน
แต่ละสมาชิกของแถวลาํ ดบั ได้ ดงั น้ี
1) การเพิ่มค่าตวั ช้ีหน่ึงลาํ ดบั (increment pointer) คือการส่ังให้ตวั ช้ีเลื่อนไปยงั
สมาชิกตวั ถดั ไปหน่ึงลาํ ดบั โดยใชเ้ คร่ืองหมายบวกบวก เช่น aPtr++; หรือ aPtr = aPtr+1;
2) การลดค่าตวั ช้ีหน่ึงลาํ ดบั (decrement pointer) คือการส่ังใหต้ วั ช้ีเล่ือนไปยงั
สมาชิกตวั ก่อนหนา้ หน่ึงลาํ ดบั โดยใชเ้ คร่ืองหมายลบลบ เช่น aPtr--; หรือ aPtr = aPtr-1;
3) การเพิ่มหรือลดค่าตัวช้ีมากกว่าหรือน้อยกว่าหน่ึงลําดับ (add/subtracts
pointer) คือการสั่งใหต้ วั ช้ีเล่ือนไปยงั สมาชิกตวั ถดั ไปหรือตวั ก่อนหนา้ ตามตวั เลขท่ีระบุ
4) การนาํ ตวั แปรชนิดตวั ช้ีมาลบกนั คือการนาํ ตวั แปรชนิดตวั ช้ีสองตวั มาลบ
กนั ซ่ึงผลลพั ธ์ที่ไดค้ ือ ระยะห่างระหว่างสมาชิกในตวั แปรแถวลาํ ดบั +1 หรือจาํ นวนสมาชิกท่ีอยู่
ระหวา่ งตวั ช้ีท้งั สองบวกดว้ ย 1
5) การเปรียบเทียบตวั แปรชนิดตวั ช้ี คือการตรวจสอบวา่ ตวั ช้ีใดช้ีไปท่ีสมาชิก
ลาํ ดบั ท่ีมากกวา่ นอ้ ยกวา่ หรือช้ีไปที่สมาชิกตวั เดียวกนั โดยการเปรียบเทียบน้ีจะคืนค่าจริงหรือเท็จ
ดงั น้นั จึงมกั นาํ ไปใชร้ ่วมกบั ชุดคาํ ส่งั if หรือชุดคาํ สง่ั while
ตัวอย่างท่ี 2.29 การเปรียบเทียบตวั แปรชนิดตวั ช้ี
if (aPtr = = bPtr)
printf(“finish”);
การตรวจสอบวา่ ตวั แปรชนิดตวั ช้ี aPtr ช้ีไปที่สมาชิกตวั เดียวกนั กบั ตวั ช้ี bPtr หรือไม่
if (aPtr > bPtr)
printf(“aPtr is behind bPtr”);
81
2.3.16.4 การใชต้ วั ช้ีกบั สายอกั ขระ ตวั แปรชนิดตวั ช้ีสามารถนาํ มาประมวลผลกบั สาย
อกั ขระไดโ้ ดยสามารถส่งั ใหต้ วั ช้ีช้ีไปท่ีสายอกั ขระไดเ้ ช่นเดียวกนั กบั ตวั แปรแถวลาํ ดบั โดยไมต่ อ้ งมี
เคร่ืองหมาย & อยหู่ นา้ ตวั ช้ี
ตัวอย่างท่ี 2.30 การใชต้ วั ช้ีกบั สายอกั ขระ
#include<stdio.h>
void strcopy (char *s1,char *s2) {
while (*s2 != ‘\0’)
{
*s1 = *s2;
s1++;
s2++;
}
}
void main () {
printf (“This program will copy your string \n”);
scanf (“%s”, str1);
strcopy (str1, str2);
printf (“The original string is %s\n”, str1);
printf (“The new copied string is %s\n”, str2);
}
ผลการกระทาํ การ
รูปท่ี 2.17 ผลการกระทาํ จากชุดคาํ ส่งั
82
สรุป
ภาษาเบสิก มีลกั ษณะภาษาเป็นบรรทดั คาํ สง่ั ใชโ้ ปรแกรมบรรณาธิกรณ์เขียนชุดคาํ สั่งคร้ังละ
บรรทดั และใชโ้ ปรแกรมอินเทอร์พรีเตอร์ทาํ หนา้ ที่แปลชุดคาํ ส่งั เป็นภาษาเคร่ือง
ภาษาแอสเซมบลี มีลกั ษณะภาษาเป็ นบรรทดั คาํ ส่ังเช่นกนั ใชน้ ีโมนิกส์ส่ือความหมายแทน
ชุดคาํ ส่งั การพฒั นาชุดคาํ สง่ั ดว้ ยการใชโ้ ปรแกรมบรรณาธิกรณ์เขียนชุดคาํ ส่ัง เม่ือเสร็จสมบูรณ์แลว้
โปรแกรมแอสเซมเบลอร์ ทาํ หนา้ ท่ีแปลนีโมนิกส์เป็นภาษาเครื่อง
ภาษาซีและซีซีเอสซี คอมไพเลอร์ ใชโ้ ปรแกรมสาํ หรับใชเ้ ขียนชุดคาํ สั่ง (บรรณาธิกรณ์) และ
โปรแกรมสาํ หรับใชแ้ ปลชุดคาํ สั่ง (คอมไพเลอร์) รวมอยดู่ ว้ ยกนั ทาํ ให้สะดวกในการใชง้ าน ทาํ งาน
เป็ นฟังก์ชนั่ ประกอบดว้ ยฟังกช์ นั่ เมน ฟังก์ชนั่ จากคลงั และฟังก์ชนั่ ท่ีผใู้ ชก้ าํ หนด โปรแกรมหน่ึง
อาจจะประกอบดว้ ยฟังก์ชนั่ เดียวหรือหลายฟังกช์ นั่ ก็ได้ โครงสร้างภาษาของซีซีเอสซีคอมไพเลอร์
ประกอบดว้ ย
ชุดคาํ สง่ั ตวั ประมวลผลก่อน ใชเ้ ครื่องหมาย “#” นาํ หนา้ และเขียนไวต้ อนตน้ ของชุดคาํ ส่งั
ชุดคาํ ส่ังประกาศตวั แปรครอบคลุม ใชป้ ระกาศตวั แปรส่วนกลาง ตวั แปรน้ีทุกส่วนของ
ชุดคาํ สง่ั สามารถเรียกใชไ้ ด้
ฟังก์ชนั่ หมายถึงกลุ่มของชุดคาํ สั่ง มีหนา้ ที่ทาํ งานเฉพาะและเสร็จสิ้นภายในฟังก์ชนั่ การ
พฒั นาชุดคาํ สั่งจะตอ้ งมีฟังกช์ นั่ เมนเป็ นหลกั คอมไพเลอร์เร่ิมตน้ แปลชุดคาํ ส่ังในฟังกช์ นั่ เมนก่อน
ภายในฟังกช์ นั่ เมนประกอบดว้ ยชุดคาํ สั่งเรียกใช้ฟังก์ชนั่ ย่อยต่างๆ เม่ือทาํ งานในฟังก์ชนั่ ย่อยต่างๆ
เสร็จแลว้ จะมีการส่งค่าและกลบั มาทาํ งานท่ีฟังกช์ นั่ เมนจนจบชุดคาํ สง่ั ฟังกช์ นั่ ประกอบดว้ ย
ฟังกช์ นั่ ท่ีผา่ นค่าขอ้ มูลไปให้กบั ฟังก์ชนั่ อ่ืน เป็ นฟังก์ชนั่ ท่ีผา่ นเฉพาะค่าขอ้ มูลไปให้กบั
ฟังกช์ นั่ เทา่ น้นั เมื่อฟังกช์ นั่ ทาํ งานเสร็จแลว้ จะไมม่ ีผลใดๆ กบั ตวั แปรท่ีผา่ นคา่ ใหก้ บั ฟังกช์ นั่
ฟังก์ชนั่ ที่ผ่านค่าอา้ งอิง เป็ นฟังก์ชนั่ ท่ีผ่านเฉพาะค่าอา้ งอิงไปให้กบั ฟังก์ชนั่ เมื่อฟังก์ชนั่
ทาํ งานเสร็จแลว้ จะมีผลกบั ตวั แปรท่ีผา่ นคา่ ใหก้ บั ฟังกช์ นั่
ฟังกช์ นั่ จากคลงั เป็นฟังกช์ นั่ สาํ เร็จรูปใชต้ ิดตอ่ กบั อุปกรณ์ต่าง ๆ มีวธิ ีการเรียกใชใ้ หเ้ ขียน
ชุดคาํ ส่งั ตวั ประมวลผลก่อน #include ไวต้ อนตน้ ของชุดคาํ สง่ั
คาํ สง่ั หมายเหตุ คือขอ้ ความอธิบายความหมายของชุดคาํ ส่ัง คอมไพเลอร์จะไม่นาํ ไปแปล
เป็ นภาษาเคร่ือง เขียนได้ 2 แบบ คือใช้เคร่ืองหมาย “//” ไวห้ น้าข้อความหมายเหตุและใช้
เครื่องหมาย “/*” ไวห้ นา้ และ “*/” ไวห้ ลงั ขอ้ ความหมายเหตุ
ตวั แปร เป็ นช่ือของหน่วยความจาํ ที่ตาํ แหน่งใดๆ สําหรับใช้เก็บขอ้ มูล ตวั แปรสามารถ
เกบ็ ชนิดขอ้ มูลที่ประกาศไวเ้ ท่าน้นั และขอ้ มูลสามารถเปลี่ยนค่าไดต้ ลอดเวลา ตวั แปรมี 4 ชนิด เช่น
83
ตวั แปรชนิดเก็บขอ้ มูลจาํ นวนเตม็ (Integer) ตวั แปรชนิดเก็บขอ้ มูลจาํ นวนจริง (Float) ตวั แปรชนิด
เกบ็ ขอ้ มูลอกั ขระ (Character) และตวั แปรเกบ็ ขอ้ มูลชนิดสายอกั ขระ (String) กฎการต้งั ชื่อตวั แปร
หา้ มใชต้ วั อกั ษรพิเศษ เช่น !, @, #, $, %, * เป็นตน้
ประกอบดว้ ย a ถึง z, 0 ถึง 9 และ _ เทา่ น้นั ตวั พิมพใ์ หญ่ ตวั พมิ พเ์ ลก็ มีความหมาย
แตกตา่ งกนั เช่น Abc กบั abc
อกั ขระตวั แรกตอ้ งเป็น a ถึง z, และ _ หา้ มเวน้ ช่องวา่ งระหวา่ งอกั ขระ
หา้ มใชช้ ่ือซ้าํ กบั คาํ สงวนหรือคาํ ท่ีมีอยใู่ นคลงั ขอ้ มูลของภาษาซีและฟังกช์ นั่ สาํ เร็จรูป
เช่น char, float, int, output_b เป็นตน้
การเก็บขอ้ มูล ประกอบดว้ ยรายละเอียด 2 ส่วนคือ ชนิดขอ้ มูลและการเกบ็ ขอ้ มูล เมื่อสร้างตวั
แปรข้ึนมาระบุเพียงชนิดขอ้ มูล เช่น int, char เป็ นตน้ ชุดคาํ สั่งจะจดั เก็บขอ้ มูลให้เป็ น auto
(ปรับเปลี่ยนได้โดยอตั โนมตั ิ) ถ้าตอ้ งการใช้งานบนหน่วยความจาํ โปรแกรมหรือบนรีจิสเตอร์
จะตอ้ งระบุ ตวั กาํ หนดประเภทหน่วยความจาํ
ตวั แปร มีหลายประเภทมีขนาดและการใชง้ านท่ีแตกต่างกนั ดงั น้ี:-
ตวั แปรชนิดตวั เลข แบ่งไดเ้ ป็ น 2 กลุ่มคือ ตวั แปรจาํ นวนเตม็ ใชเ้ ก็บค่าท่ีเป็ นจาํ นวนเต็ม
และตวั แปรจาํ นวนจริง ใชเ้ กบ็ คา่ ที่เป็นจาํ นวนจริงซ่ึงเป็นตวั เลขที่เป็นจุดทศนิยม
ตวั แปรชนิดอกั ขระ ถูกจดั เก็บไวใ้ นหน่วยความจาํ ในรูปแบบจาํ นวนเต็มขนาด 1 ไบต์
ดงั น้นั ตวั แปรอกั ขระจึงสามารถใชง้ านไดท้ ้งั แบบอกั ขระและจาํ นวนเตม็
ตวั แปรประเภทโครงสร้าง คือกลุ่มของตวั แปรซ่ึงอยู่รวมกนั ภายใตช้ ่ือเดียวกนั เป็ นตวั
แปรชนิดเดียวกนั หรือต่างกนั ก็ได้ จุดประสงคก์ ารประกาศตวั แปรประเภทน้ีเพ่ือรวบรวมขอ้ มูลที่
สมั พนั ธ์กนั ใหอ้ ยภู่ ายใตช้ ื่อตวั แปรโครงสร้างเดียวกนั
อกั ขระพิเศษ ใชใ้ นการแสดงผลบางอยา่ งที่ไม่ใช่ตวั อกั ษร เช่น ตอ้ งการใหแ้ สดงผลเป็ นเสียง
จึงตอ้ งใชอ้ กั ขระพเิ ศษ อกั ขระพเิ ศษเขียนนาํ ดว้ ยเคร่ืองหมาย “ \ ” ตามดว้ ยอกั ขระ
นิพจน์ หมายถึงการนาํ ตวั แปร ค่าคงที่หรือตวั เลขมากระทาํ กนั ดว้ ยตวั ดาํ เนินการ ดว้ ยเงื่อนไข
ใดเง่ือนไขหน่ึง
ชุดคาํ สั่งกาํ หนดเง่ือนไข if - else รูปแบบคาํ สั่งให้เลือกทาํ งานอยา่ งใดอยา่ งหน่ึงข้ึนอยู่กบั
เงื่อนไขท่ีกาํ หนด
ชุดคาํ ส่ัง switch การเลือกกระทาํ ชุดคาํ ส่ังใดๆ ข้ึนอยู่กบั ค่าของนิพจน์ เมื่อเปรียบเทียบแลว้
เทา่ กบั ค่าใดจะกระทาํ ตามชุดคาํ ส่งั ที่อยหู่ ลงั case น้นั
ชุดคาํ สง่ั break ใชบ้ งั คบั ใหก้ ารกระทาํ ชุดคาํ ส่งั ซ่ึงเกิดจากชุดคาํ ส่งั switch หยดุ
84
ชุดคาํ ส่งั วนซ้าํ เป็นคาํ สั่งเงื่อนไขที่มีการทาํ งานซ้าํ อยูใ่ นชุดคาํ ส่ังหลายๆ รอบจนกวา่ เง่ือนไข
เป็นเทจ็ ชุดคาํ ส่งั วนซ้าํ ประกอบดว้ ย
ชุดคาํ สั่ง while เริ่มตน้ ดว้ ยการตรวจสอบเงื่อนไขของชุดคาํ สั่ง while วา่ เป็ นจริงหรือไม่
ถา้ เป็นจริงจะกระทาํ ชุดคาํ ส่งั ซ้าํ หลายๆ รอบ พร้อมกบั การตรวจสอบเง่ือนไขจนกวา่ เงื่อนไขเป็ นเทจ็
ชุดคาํ ส่ัง do-while เร่ิมตน้ ดว้ ยการประมวลผลชุดคาํ ส่ังที่อยูใ่ น do- while หน่ึงรอบแลว้ จึง
ตรวจสอบเง่ือนไข ถา้ เง่ือนไขเป็นเทจ็ จบการทาํ งาน
ชุดคาํ ส่งั for เป็นคาํ สง่ั ท่ีสัง่ ใหก้ ระทาํ ชุดคาํ สง่ั วนซ้าํ โดยมีจาํ นวนการวนซ้าํ ที่แน่นอน
ตวั ช้ี คือ ตวั แปรท่ีใชช้ ้ีเลขที่อยู่ ของตวั แปรอื่นที่ตอ้ งการเขา้ ถึงในหน่วยความจาํ ซ่ึงแตกต่าง
จากตวั แปรชนิดอื่นท่ีจะเก็บคา่ ท่ีแทจ้ ริงของตวั แปรน้นั ตวั ดาํ เนินการที่เก่ียวขอ้ งกบั การใชง้ าน ตวั ช้ี
ประกอบดว้ ย “*” ตวั ดาํ เนินการอา้ งอิง และ “&” ตวั ดาํ เนินการเลขท่ีอยู่ ตวั ดาํ เนินการ “*” ใชส้ ร้างตวั ช้ี
เพื่อช้ีเลขที่อยู่ ขอ้ มูลท่ีตวั แปรตวั ช้ีเก็บอยแู่ ละนาํ ขอ้ มูลกลบั มา ตวั ดาํ เนินการ “&” คือเลขที่อยขู่ อง
ตวั แปรท่ีกาํ หนดใหก้ บั ตวั ช้ี
เอกสารอ้างองิ
ทีมงานสมาร์ทเลิร์นน่ิง. PIC Microcontroller Learning-By-Doing ดว้ ยภาษา C. กรุงเทพฯ :
หา้ งหุน้ ส่วนสามญั สมาร์ทเลิร์นน่ิง. 2550
ประจิน พลงั สันติกลุ . PIC C Programming กบั ccsc คอมไพเลอร์. กรุงเทพฯ :
แอพซอฟตเ์ ทค. 2551
มูลนิธิ สอวน. การเขียนโปรแกรมคอมพวิ เตอร์ภาษาซี. พมิ พค์ ร้ังที่ 2. กรุงเทพฯ :
ด่านสุทธาการพมิ พ.์ 2549
สมบูรณ์ เนียมกล่าํ . เรียนรู้และประยกุ ตใ์ ชง้ าน PIC Microcontroller. กรุงเทพฯ :
เอดิสันเพรสโปรดกั ส์. 2549
85
แบบฝึ กหัดที่ 2 หน่วยที่ 2
สอนคร้ังท่ี 3-4
ชื่อวชิ า ไมโครคอนโทรลเลอร์ รหัสวชิ า 3104-2011 จํานวนชั่วโมงรวม 8 ช่ัวโมง
ช่ือหน่วย ชุดคาํ สง่ั ของไมโครคอนโทรลเลอร์ จํานวนช่ัวโมงสอน 4 ช่ัวโมง
ชื่อเรื่อง ชุดคาํ สง่ั ของไมโครคอนโทรลเลอร์
คําชี้แจง 1. จงตอบคาํ ถามใหไ้ ดใ้ จความสมบูรณ์ ใชเ้ วลาสาํ หรับการทาํ แบบฝึกหดั 20 นาที
2. แบบฝึกหดั มีจาํ นวน 5 ขอ้ คะแนนเตม็ 10 คะแนน
1. จงอธิบายขอ้ ดีของโปรแกรมภาษาซี เม่ือเทียบกบั ภาษาเบสิก และภาษาแอสเซมบลี (1 คะแนน)
2. จงอธิบายวธิ ีการใชง้ านคาํ สง่ั เทียมของภาษาซี (2 คะแนน)
3. จงอธิบายความแตกตา่ งระหวา่ งค่าคงตวั หรือค่าคงที่กบั ตวั แปร (3 คะแนน)
86
4. จงอธิบายความแตกต่างระหวา่ งคาํ สง่ั while กบั do – while (2 คะแนน)
5. จงอธิบายความแตกต่างระหวา่ งตวั แปร Integer และ Character (1 คะแนน)
87
6. จงอธิบายความหมายของตวั ดาํ เนินการ (*) และ (&) (1 คะแนน)