วันอาทิตย์ที่ 2 พฤศจิกายน พ.ศ. 2557

สร้างไฟล์หลายไฟล์ในโปรเจค




สร้างไฟล์หลายไฟล์ในโปรเจค
10/3/2557 SONGCHAI PRAPATRUNGSEE
สร้างไฟล์หลายไฟล์ในโปรเจค
1 สร้างไฟล์หลักขึ้นมาก่อนแล้วคอมไพล์ให้ผ่านก่อน
   และไฟล์หลักจะต้องมีการสร้างฟังชันไว้
   เพราะไฟล์ย่อยคือฟังชันของไฟล์หลักนั่นเอง
2 คลิกFILE/NEW/FILE/SAVE AS
3 ที่ช่องFILE NAMEพิมพ์ชื่อตามด้วย.C (C SOURCE FILE)
4 คลิกSAVE
5 คลิกขวาSOURCE GROUP1
6 คลิกADD EXISTING FILES
7 ดับเบิลคลิกชื่อไฟล์ที่เราตั้งชื่อไว้
   หรือพิมพ์ชื่อไฟล์ที่ช่องFILE NAMEแล้วคลิกADD
   เท่านี้ไฟล์ย่อยก็เข้าไปในSOURCE GROUP1แล้ว
8 คลิกCLOSE
9 COPY FUNCTION จากไฟล์หลักไปไว้ในไฟล์ย่อย
   ส่วนไฟล์หลักตัดให้เหลือเฉพาะส่วนหัวของฟังชัน
   แล้วใส่เครื่องหมาย ; (STATEMENT) จบคำสั่ง  
   void DELAY_MS(unsigned int TIME);
   ส่วนนี้เรียกว่าFUNCTION PROTOTYPEหรือฟังชันต้นแบบ
   ไฟล์หลักจะเรียกใช้ไฟล์ย่อย
   โดยการเรียกใช้ผ่านFUNCTION PROTOTYPE  เช่น

#include <REGX51.H>

void DELAY_MS(unsigned int TIME){//DELAY HAVE INPUT
      unsigned int i,j;//0-65535
     
      for(i=TIME;i!=0;i--)
            for(j=124;j!=0;j--);//MODIFY TIME THIS ROW
}
/*CRYSTAL 12MHZ,124=1MS PER ROUND*/

void main(void){
      while(1){ //while(1)=LOOP FOREVER
            P1=255;  //P1=PORT1
            DELAY_MS(500);//500=DELAY 500MS
            P1=0;
            DELAY_MS(500);
      }
}
คำอธิบาย โปรแกรม
#include <REGX51.H>
# คือ เครื่องหมายSHARP เป็นพรีโปรเซสเซอร์ไดเรกทีฟ
    ( PREPROCESSOR  DIRECTIVE )
    หมายความว่าเป็นคำสั่งประมวลผลก่อน
include =เอาไฟล์ภายนอกเข้ามาร่วมในการคอมไพล์(แปล)
    หมายความว่าเวลากดBUILDหรือREBUILD
    ก็จะเข้าไปทำการคอมไพล์(แปล)ในไฟล์ include ก่อน
    จากนั้นจึงกลับมาคอมไพล์ต่อจากบรรทัดที่คอมไพล์ไปแล้ว
    ให้เป็นไฟล์.HEX หรือเลขฐาน16
<REGX51.H> = ชื่อที่ทางคอมไพล์เลอร์กำหนด
    แทนตำแหน่งแอดเดรสของไมโครคอนโทรลเลอร์
    เพื่อให้ง่ายต่อการจดจำและใช้งาน
.H คือ C INCLUDE FILE

void DELAY_MS(unsigned int TIME);
    =FUNCTION PROTOTYPEหรือฟังชันต้นแบบ
        
void =ไม่มีOUTPUT(RETRUN TYPE)
DELAY_MS = ชื่อฟังชันที่ตั้งขึ้นเอง
unsigned int คือชนิดตัวแปรอยู่ในช่วง 0-65535=65536ค่า
TIME = ชื่อตัวแปรที่ตั้งขึ้นเอง
(unsigned int TIME) = ตัวแปรTIMEมีค่า=0-65535
{…..} = ขอบเขตการทำงานของฟังชัน

unsigned int i,j; = ประกาศตัวแปร i,j อยู่ในช่วง 0-65535

          for(i=TIME;i!=0;i--)
              for(j=124;j!=0;j--);//MODIFY TIME THIS ROW
for = คำสั่งการวนลูป
i=TIME; = เอาค่าTIMEมาเก็บไว้ใน i
i!=0; = ถ้า i ไม่เท่ากับ0 ก็แสดงว่าเป็นจริง
    ให้เข้าไปทำงานในLOOP วงเล็บปีกกา{  }
    ในกรณีนี้ forที่1 มีคำสั่งเดียวคือ forที่2
    ไม่จำเป็นต้องมี LOOP หรือจะใส่LOOPก็ได้
i-- คือ หลังจากเข้าไปทำงานในลูป forที่2 เสร็จแล้ว
    ก็ย้อนกลับมา forที่1 แล้วทำตามคำสั่ง i--
    = ให้ลบค่า i 1แต้ม แล้วทำการเปรียบเทียบ
    ถ้า i!=0; ก็แสดงว่าเป็นจริงเข้าทำในลูป forที่2 ซ้ำ
    ทำอย่างนี้ไปเรื่อยๆจนกว่า i จะเหลือ 0
    เมื่อ i = 0 แล้วเปรียบเทียบกับ i!=0;
    ก็แสดงว่าเป็นเท็จ ไม่เข้าทำในลูป forที่2
    จากนั้นกระโดดไปฟังชันmain
    ทำงานต่อจากบรรทัดที่ทำไว้
    ส่วนforที่2การทำงานเหมือนกับforที่1
    ต่างกันที่หลังforที่2 เป็นคำสั่งว่าง……….;
    =จบด้วย  ; (STATEMENTว่างๆ)
forที่2 ถ้าCRYSTAL 12MHZ แล้วเซท forที่2=124
    จะย่ำอยู่กับที่124ครั้ง รวมเวลาได้ประมาณ1MS
    เสร็จแล้วก็กระโดดไปทำforที่1จนกว่าforที่1จะเป็นเท็จ
    ถ้าเป็นเท็จเมื่อไรก็จะกระโดดออกจากลูปforทันที
    ไปทำต่อในฟังชันเมนที่ค้างไว้

             void main(void)
void =ไม่มี OUTPUT(RETURN TYPE)
main = FUNCTION NAME, main=ชื่อฟังค์ชันหลัก
(void) =ไม่มี INPUT(ARGUMENTS)
{….} คือวงเล็บปีกกา เป็นLOOPหรือขอบเขตของการทำงาน

while(1) คือคำสั่งวนลูปไม่รู้จบ

            P1=255;
หมายความว่าเอาค่า255มาเก็บไว้ในP1=PORT1จะติดทั้งหมด
255=8บิท=11111111หรือติดทั้ง8ขานั่นเอง

            DELAY_MS(500);
หมายความว่าเมื่อฟังชันเมนทำงานมาถึงบรรทัดนี้
ก็จะเรียกใช้งานฟังชันDELAY_MS
โดยการกระโดดเข้าไปทำงานในฟังชันDELAY_MS
ส่วนค่า500จะส่งผ่านไปให้ฟังชันDELAY_MS
เข้าสู่ตัวแปรTIME หมายความว่าจะทำงานอยู่ในลูปforที่1
500ครั้ง=หน่วงเวลาไว้500MSนั่นเอง

                      P1=0;
หมายความว่าเอาค่า0มาเก็บไว้ในP1=PORT1จะดับทั้งหมด
255=8บิท=00000000หรือดับทั้ง8ขานั่นเอง

                      DELAY_MS(500);
    มีความหมายเหมือนกับด้านบน
    หลังจากทำเสร็จแล้วก็จะกลับไปทำงานที่P1=255;
    P1=255; คือบรรทัดการเริ่มต้นการทำงานของลูปwhile(1)
    และจะทำซ้ำอย่างนี้ไปเรื่อยๆไม่รู้จบ
            
ความหมายของWARNING
referrence made to unresolved external
อ้างอิงไม่ได้ตั้งใจทำเพื่อภายนอก

unresolved external symbol
สัญลักษณ์ภายนอกไม่ได้ตั้งใจ

ไม่มีความคิดเห็น: