ใบงานที่.2 7 segment เลข 0-9

ผู้จัดทำ

1.นาย รุจ พรชัยประสิทธิ์  1 สทค 1 6031280017
2.นาย ธีรพงษ์ เฉลยพงษ์ 1 สทค 2 6031280034


อุปกรณ์ที่ใช้

1.7 segment 1 ตัว
2.ตัวต้านทาน 220R  1 ตัว
3.สายไฟ 9 เส้น
4.บอร์ด Arduino
5.โฟโต้บอร์ด
6.สาย UPLOAD



รูปวงจร







CODE

void setup() { // initialize serial communication: Serial.begin(9600); // initialize the LED pins: for (int thisPin = 2; thisPin < 12; thisPin++) { pinMode(thisPin, OUTPUT); } } void loop() { if (Serial.available() > 0) { int inByte = Serial.read(); switch (inByte) { case '0': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, HIGH); break; case '1': digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); break; case '2': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); break; case '3': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); break; case '4': digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); break; case '5': digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); break; case '6': digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); break; case '7': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); break; case '8': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); break; case '9': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); break; default: // turn all the LEDs off: for (int thisPin = 2; thisPin < 12; thisPin++) { digitalWrite(thisPin, LOW); } } } }




VDO







youtube : https://youtu.be/vLbY1Qu0xgA

ทฤษฎี 7 segment

การควบคุมหลอดแสดงผล LED 7-Segment ด้วย Micro controller PIC โดยใช้โปรแกรม PIC CCS Compiler
     หลอดแสดงผล LED 7-Segment เป็นอุปกรณ์อิเล็กทรอนิกส์ที่ใช้ในการแสดงผลเช่นเดียวกับหลอดแสดงผล LED ทั่วไป แต่ต่างตรงที่หลอดแสดงผล LED 7 ส่วน เป็นการนำเอาหลอดแสดงผล LED จำนวน 7 ตัวมาต่อกันเป็นรูปตัวเลข เพื่อนำมาแสดงผลเป็นตัวเลข 0 ถึง 9 โดยในบทความนี้จะพูดถึงการเขียนโปรแกรมควบคุมการทำงานของหลอดแสดงผล LED 7 ส่วน และ การประยุกต์ใช้งานไม่โครคอนโทรลเลอร์ PIC ควบคุมการทำงานของหลอดแสดงผล LED 7 ส่วน



1.  โครงสร้างและการทำงานของหลอดแสดงผล LED 7 ส่วน
    หลอดแสดงผล LED 7 ส่วน เป็นการนำเอาหลอด แสดงผล  LED จำนวน 7 ตัวมาต่อกันเป็นรูปตัวเลขโดยมีชื่อเรียกแต่ละส่วน คือ a,b,c,d,e,f,g และ dp แสดงดังรูปที่ 1.1

 









รูปที่ 1.1 โครงสร้างและขาของหลอดแสดงผล LED 7-Segment

     หลอดแสดงผล LED 7-Segment สามารถแบ่งตามลักษณะการต่อหลอดแสดงผล LED ทั้ง 7 หลอดได้ 2 ชนิด ดังนี้

     1. ชนิดต่อแบบแอโนดร่วม หรือ คอมมอนแอโนด (Common Anode)
     2. ชนิดต่อแบบแคโทดร่วม หรือ คอมมอนแคโทด (Common Cathode)

โดยโครงสร้างการต่อหลอดแสดงผล LED 7-Segment ทั้ง 2 ชนิด ดังรูปที่ 1.2



รูปที่ 1.2 โครงสร้างการต่อหลอดแสดงผล LED 7-Segment

     รูปที่ 1.2(ก) เป็นการต่อหลอดแสดงผล LED 7-Segment แบบแอโนดร่วม โดยต้องป้อนไฟบวกที่ขาร่วมที่หรือขาคอมมอน (Common) และถ้าต้องการให้หลอดแสดงผล LED 7-Segment แสดงผลหรือให้สว่าง ต้องป้อนไฟลบหรือส่งลอจิก "0" มาที่ขาแคโทด 
     ส่วนรูปที่ 1.2(ข) เป็นการต่อหลอดแสดงผล LED 7-Segment แบบแคโทดร่วม โดยต้องป้อนไฟลบหรือกราวด์ที่ขาร่วมหรือขาคอมมอน และถ้าต้องการให้หลอดแสดงผล LED 7-Segment แสดงผลหรือสว่างต้องป้อนไฟบวกหรือส่งลอจิก "1" มาที่ขาแอโนด


2. การเชื่อต่อ PIC กับหลอดแสดงผล LED 7-Segment
     สำหรับการต่อ PIC ร่วมกับหลอดแสดงผล LED 7-Segment ควรต่อไอซีบัฟเฟอร์ร่วมด้วย เพื่อขยายกระแสให้หลอดแสดงผล LED 7-Segment สว่างเท่ากันทุกหลอด และป้องกันการลัดวงจรของหลอดแสดงผล LED 7-Segment ซึ่งมีผลทำให้ Micro controller PIC เสียหายได้


รูปที่ 2.1 การเชื่อมต่อ PIC กับหลอดแสดงผล LED 7-Segment

     รูปที่ 2.1 เป็นการต่อหลอดแสดงผล LED 7-Segment เข้ากับพอร์ต B ของ PIC เบอร์ 16F877 ซึ่งระหว่างหลอดแสดงผล LED 7-Segment กับพอร์ต B นั้นก็จะมีไอซีบัฟเฟอร์ต่อร่วมอยู่ด้วย ซึ่งไอซีบัฟเฟอร์เบอร์ 74LS245 นอกจากจะทำหน้าที่ขยายกระแสเพื่อให้หลอดแสดงผล LED 7-Segment สว่างเท่ากันทั้ง 7 ตัวแล้ว ยังทำหน้าที่ป้องกันความเสียหายให้กับ PIC ในกรณีที่เกิดการลัดวงจรในส่วนหลอดแสดงผล LED 7-Segment ด้วย
     การต่อ PIC ร่วมกับหลอดแสดงผล LED 7-Segment เพื่อให้แสดงผลออกมาเป็นตัวเลขต่างๆ จะต้องมีการส่งข้อมูลออกพอร์ตของ PIC ที่ต่อร่วมอยู่กับหลอดแสดงผล LED 7-Segment และข้อมูลที่จะส่งออกพอร์ตนั้นก็ขึ้นอยู่กับชนิดของหลอดแสดงผล LED 7-Segment ซึ่งข้อมูลที่จะส่งออกพอร์ตของหลอดแสดงผล LED 7-Segment แบบต่อแอโนดร่วมและต่อแคโทดร่วม แสดงดังตาราง ที่ 2.1 และ 2.2

 

ตารางที่ 2.1 แสดงข้อมูลที่ส่งออกพอร์ตของหลอดแสดงผล LED 7-Segment 
แบบต่อแอโนดร่วม (Common Anode)


ตารางที่ 2.2 แสดงข้อมูลที่ส่งออกพอร์ตของหลอดแสดงผล LED 7-Segment 
แบบต่อแคโทดร่วม (Common Cathode)




3. การส่งข้อมูลออกหลอดแสดงผล LED 7-Segment

     การส่งข้อมูลออกพอร์ต เพื่อส่งออกหลอดแสดงผล LED 7-Segment จะเหมือนกับการส่งข้อมูลออกหลอดแสดงผล LED ทั่วไป แต่การแสดงผลออกหลอดแสดงผล LED 7-Segment จะเป็นลักษณะของตัวเลข ดังนั้นข้อมูลที่ส่งออกพอร์ตจึงเป็นเลขฐานสิบหกของตัว

     รูปแบบ     output_พอร์ต(ข้อมูลเลขฐานสิบหกของตัวเลขที่ต้องการแสดง);
     ตัวอย่าง    output_B(0x3F);

     หมายถึง  ส่งค่าข้อมูล 0x3F หรือส่ง 00111111B ออกที่พอร์ต B เพื่อให้หลอดแสดงผล LED 7-Segment แสดงผลเป็นตัวเลข 0


ตัวอย่างที่ 3.1 โปรแกรมแสดงผลออกที่หลอดแสดงผล LED 7-Segment ซึ่งต่ออยู่กับพอร์ต B ของ PIC และเป็นหลอดแสดงผล LED 7-Segment แบบต่อแคโทดร่วม โดยให้แสดงผลเป็นตัวเลข 0-9 ตามลำดับ


วิธีการคิด

     การเขียนโปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จะประกาศตัวแปรแบบอาร์เรย์ เพื่อใช้ในการเก็บข้อมูลตัวเลขที่ต้องการแสดงผล เนื่องจากง่ายต่อการเขียนโปรแกรมและสะดวกในการแก้ไขข้อมูลที่ส่งออกพอร์ตแสดงผล

เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use    delay (clock=4Mhz)
void main()

 int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
 signed int i;                      
  while(1)
   {   
       for(i=0;i<10;i++)
          {  output_B(num[i]);  
             delay_ms(500);
          }                              
    }


อธิบายโปรแกรม

  บรรทัดที่ 5 ประกาศตัวแปร num[10] เพื่อเก็บข้อมูลตัวเลข 0-9 ที่ต้องการส่งออกพอร์ตจำนวน 10 ตัว
  บรรทัดที่ 7 ประกาศตัวแปรแบบ signed int i; คือประกาศตัวแปร i เป็นตัวเลขชนิดจำนวนเต็มมีค่าตั้งแต่ -127 ถึง 128
  บรรทัดที่ 8 ให้โปรแกรมทำงานวนรอบตลอดกาล
  บรรทัดที่ 10 กำหนดให้ฟังก์ชัน for ทำงานวนรอบจำนวน 10 รอบคือ 0-9 ตามค่า i
  บรรทัดที่ 11 แสดงผลตัวเลขในตัวแปรอาร์เรย์ออกพอร์ต B โดยค่าในอาร์เรย์จะเปลี่ยนตามค่าของ i

ผลการรันโปรแกรม

     โปรแกรมจะเริ่มจากการกำหนดค่าการวนรอบโดยใช้ฟังก์ชัน for และทำการกำหนดตัวแปร i เพื่อเป็นตัวกำหนดเงื่อนไขการวนรอบให้วนรอบจำนวน 10 รอบและยังใช้ตัวแปร i ในการแสดงผลของลำดับข้อมูลในอาร์เรย์ ทำให้หลอดแสดงผล LED 7-Segment แสดงเป็นเลข 0-9 ตามลำดับ





เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use    delay (clock=4Mhz)
void main()

 int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
 signed int i;                      
  while(1)
   {   
       for(i=0;i<10;i--)
          {  output_B(num[i]);  
             delay_ms(500);
          }                              
    }
}


อธิบายโปรแกรม

  โปรแกรมนี้แก้ไขจากโปรแกรมในตัวอย่างที่ 3.1 โดยทำการแก้ไขเฉพาะฟังก์ชั่น for คือ
  บรรทัดที่ 10 กำหนดให้ตัวแปร i เริ่มที่ 9 ซึ่งเป็นตัวแปรในอาร์เรย์ตัวสุดท้าย หลังจากนั้นก็ลดลงเรื่อยๆจนถึง 0
  
ผลการรันโปรแกรม

     โปรแกรมจะเริ่มจากการกำหนดค่าการวนรอบโดยใช้ฟังก์ชัน for และทำการกำหนดค่่าตัวแปร i โดยเริ่มจาก i=9 หลังจากนั้นลดลงเรื่อยๆ จนถึง 0 เพื่อเป็นตัวกำหนดเงื่อนไขการวนรอบให้วนรอบจำนวน 10 รอบและยังใช้ตัวแปร i ในการแสดงผลของลำดับข้อมูลในอาร์เรย์ ทำให้หลอดแสดงผล LED 7-Segment แสดงเป็นเลข 9-0 ตามลำดับ


หมายเหตุ

     การเขียนโปรแกรมเพื่อให้แสดงผลออกหลอดแสดงผล LED 7-Segment แสดงตัวเลข 9-0 นอกจากจะแก้ไขส่วนของฟังก์ชัน for ดังตัวอย่างที่ 3.2 สามารถทำได้อีกหนึ่งวิธีคือ แก้ไขลำดับการแสดงผลที่ประกาศไว้ในตัวแปรอาร์เรย์ จากเดิม int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; แก้ไขเป็น int num[10]={0x6F,0x7F,0x07,0x7D,0x6D,0x66,0x4F,0x5B,0x06,0x3F};ในส่วนของโปรแกรมยังคงใช้โปรแกรมตัวอย่างที่ 5.1 เช่นเดิม ก็จะเป็นการแสดงตัวเลข 9-0 เช่นกัน



4. การส่งข้อมูลออกที่หลอดแสดงผล LED 7-Segment จำนวน 2 ตัว

     ในการเชื่อมต่อไมโครคอนโทรลเลอร์ PIC กับหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวเพื่อแสดงผลตัวเลขจำนวน 2 หลักคือ หลักหน่วยและหลักสิบ สามารถทำได้โดยการนำหลอดแสดงผล LED 7-Segment ต่อออกจากพอร์ต PIC ได้โดยตรง เนื่องจาก PIC เบอร์ 16F877 มีพอร์ตอินพุตและเอาต์พุต สำหรับต่อใช้งานหลายพอร์ตจึงสามารถใช้ 1 พอร์ตต่อหลอดแสดงผล LED 7-Segment จำนวน 1 ตัวได้

   
รูปที่ 4.1 การเชื่อมต่อ PIC กับหลอดแสดงผล LED 7-Segment จำนวน 2 ตัว

     จากรูปที่ 4.1 เป็นการต่อหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวเข้ากับ PIC ซึ่งหลอดแสดงผล LED 7-Segment ตัวที่ 1 ต่อออกจากพอร์ต B และหลอดแสดงผล LED 7-Segment ส่วนตัวที่ 2 ต่อออกจากพอร์ต D ของ PIC โดยมีไอซีเบอร์ 74LS245 ทำหน้าที่เป็นบัฟเฟอร์ การต่อลักษณะหนึ่งพอร์ตต่อหลอดแสดงผล LED 7-Segment ส่วนตัวนี้ ถ้าเป็น PIC เบอร์ 16F877 จะสามารถต่อหลอดแสดงผล LED 7-Segment ได้สูงสุด 4 ตัว


ตัวอย่างที่ 4.1 โปรแกรมแสดงผลออกที่หลอดแสดงผล LED 7-Segment จำนวน 2 ตัว ซึ่งต่อเข้ากับพอร์ต B และ พอร์ต D โดยให้แสดงผลตั้งแต่ 00-99 และหลอดแสดงผล LED 7-Segment ต่อแบบแคโทดร่วม (Common Cathode)



วิธีการคิด

     การเขียนโปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จำนวน 2 ตัว ก็จะมีหลักการคล้ายกับการแสดงผล LED 7-Segment จำนวน 1 ตัว เพียงทำการเพิ่มลูปสำหรับแสดงผลหลักสิบเข้าไปอีก 1 ลูป เท่านั้น

เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use    delay (clock=4Mhz)
void main()
{
int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
signed int i1,i2;
while(1)
   {   
       for(i2=0;i2<10;i2++)
          {  output_B(num[i2]);
          for(i1=0;i1<10;i1++)
            { output_D(num[i1]);
              delay_ms(500);
            }
          }                              
    }
}   



อธิบายโปรแกรม

  บรรทัดที่ 6 ประกาศตัวแปรแบบอาร์เรย์
  บรรทัดที่ 8 ถึง 17 ส่งข้อมูล 0-9 ออกพอร์ต B และ D
  บรรทัดที่ 10 ถึง 11 ส่งข้อมูล 0-9 ออกพอร์ต B แสดงผลในหลักสิบ
  บรรทัดที่ 12 ถึง 13 ส่งข้อมูล 0-9 ออกพอร์ต D แสดงผลในหลักหน่วย
    
ผลการรันโปรแกรม

     โปรแกรมจะเริ่มจากการกำหนดค่าการวนรอบโดยใช้ฟังก์ชัน for และทำการกำหนดค่่าตัวแปร i1 และ i2 โดยตัวแปรทั้งสองเริ่มต้นที่ 0 หลังจากนั้นเพิ่มค่าขึ้นเรื่อยๆ จนถึง 9 เพื่อเป็นตัวกำหนดเงื่อนไขการวนรอบจำนวน 10 รอบและตัวแปร i1 และ i2 ยังใช้ในการแสดงผลของลำดับข้อมูลในอาร์เรย์ ทำให้หลอดแสดงผล LED 7-Segment แสดงผลเป็นเลข 00-99 ตามลำดับ



วิธีการคิด


     การเขียนโปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จำนวน 2 ตัว โดยให้นับ 99-00 นั้น สามารถประยุกต์ใช้โปรแกรมจากตัวอย่างที่ 4.1 ได้ เพียงทำการแก้ไขในส่วนของการทำงานวนรอบในฟังก์ชัน for เท่านั้น 

เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use    delay (clock=4Mhz)
void main()
{
int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
signed int i1,i2;
while(1)
   {   
       for(i2=9;i2>=0;i2--)
          {  output_B(num[i2]);
          for(i1=9;i1>=0;i1--)
            { output_D(num[i1]);
              delay_ms(500);
            }
          }                              
    }
}


อธิบายโปรแกรม


  บรรทัดที่ 6 ประกาศตัวแปรแบบอาร์เรย์
  บรรทัดที่ 8 ถึง 17 ส่งข้อมูล 9-0 ออกพอร์ต B และ D
  บรรทัดที่ 10 ถึง 11 ส่งข้อมูล 9-0 ออกพอร์ต B แสดงผลในหลักสิบ
  บรรทัดที่ 12 ถึง 13 ส่งข้อมูล 9-0 ออกพอร์ต D แสดงผลในหลักหน่วย
    
ผลการรันโปรแกรม

     โปรแกรมจะเริ่มจากการกำหนดค่าการวนรอบโดยใช้ฟังก์ชัน for และทำการกำหนดค่่าตัวแปร i1 และ i2 โดยตัวแปรทั้งสองเริ่มต้นที่ 0 หลังจากนั้นเพิ่มค่าขึ้นเรื่อยๆ จนถึง 9 เพื่อเป็นตัวกำหนดเงื่อนไขการวนรอบจำนวน 10 รอบและตัวแปร i1 และ i2 ยังใช้ในการแสดงผลของลำดับข้อมูลในอาร์เรย์ ทำให้หลอดแสดงผล LED 7-Segment แสดงผลเป็นเลข 99-00 ตามลำดับ


5. การส่งข้อมูลออกหลอดแสดงผล LED 7-Segment โดยใช้ไอซีถอดรหัส

     การเชื่อมต่อไมโครคอนโทรลเลอร์ PIC กับหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวโดยใช้ไอซีถอดรหัสเบอร์ 74LS48 สำหรับหลอดแสดงผล LED 7-Segment ชนิดแคโทดร่วม และไอซีถอดรหัส เบอร์ 74LS47 สำหรับหลอดแสดงผล LED 7-Segment ชนิดแอโนดร่วม จะทำให้ประหยัดพอร์ตของ PIC เพราะหลอดแสดงผล LED 7-Segment ส่วนที่ต่อเข้ากับไอซีถอดรหัสจะใช้พอร์ตเพียง 4 บิตเท่านั้น นั่นคือ ปกติพอร์ตของ PIC จะมีขนาด 8 บิต ก็จะสามารถต่อหลอดแสดงผล LED 7-Segment ได้ 2 ตัวนั่นเอง ดังแสดงในรูปที่ 5.1 


รูปที่ 5.1 การเชื่อมต่อ PIC กับหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวโดยใช้ไอซีถอดรหัส

     จากรูปที่ 5.1 เป็นการต่อหลอดแสดงผล LED 7-Segment จำนวน 2 ตัว แสดงผลเป็นตัวเลข 2 หลัก คือ หลักหน่วยและหลักสิบ โดยหลักสิบจะต่ออยู่กับพอร์ต B4-B7 และหลักหน่วยต่ออยู่กับพอร์ตB0-B3 โดยหลอดแสดงผล LED 7-Segment ทั้งสองตัวต่อผ่านไอซีถอดรหัสเบอร์ 74LS48 เพราะหลอดแสดงผล LED 7-Segment ที่ใช้เป็นชนิดแคโทดร่วม ทำหน้าที่แปลงเลขฐานสองให้แสดงเป็นเลขฐานสิบที่หลอดแสดงผล LED 7-Segmentรูปที่ 5.1 การเชื่อมต่อ PIC กับหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวโดยใช้ไอซีถอดรหัส
     จากรูปที่ 5.1 เป็นการต่อหลอดแสดงผล LED 7-Segment จำนวน 2 ตัว แสดงผลเป็นตัวเลข 2 หลัก คือ หลักหน่วยและหลักสิบ โดยหลักสิบจะต่ออยู่กับพอร์ต B4-B7 และหลักหน่วยต่ออยู่กับพอร์ตB0-B3 โดยหลอดแสดงผล LED 7-Segment ทั้งสองตัวต่อผ่านไอซีถอดรหัสเบอร์ 74LS48 เพราะหลอดแสดงผล LED 7-Segment ที่ใช้เป็นชนิดแคโทดร่วม ทำหน้าที่แปลงเลขฐานสองให้แสดงเป็นเลขฐานสิบที่หลอดแสดงผล LED 7-Segment
     การใช้ไอซีถอดรหัสเบอร์ 74LS48 ซึ่งเป็นไอซีที่ทำหน้าที่แปลงเลขฐานสองให้เป็นรหัสแสดงตัวเลขของหลอดแสดงผล LED 7-Segment ดังตารางที่ 5.1


ตารางที่ 5.1 แสดงการแปลงเลขฐานสองให้เป็นรหัสแสดงตัวเลขของหลอดแสดงผล LED 7-Segment


ตัวอย่างที่ 5.1 โปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวซึ่งต่อเข้ากับพอร์ต ผ่านไอซีถอดรหัส โดยให้แสดงผลตั้งแต่ 00-99 และหลอดแสดงผล LED 7-Segment ต่อแบบแคโทดร่วม

เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use     delay (clock=4Mhz)
void main()
{
  signed int i,t;
  while(1)
   { for(t=0;t<100;t++)
            { i=(t/10)*6+t;
            output_B(0x00+i);
            delay_ms(500);
            }
   }                             
}

อธิบายโปรแกรม

บรรทัดที่ 7 ถึง 13 วนรอบการทำงานโดยใช้ฟังก์ชั่น while
บรรทัดที่ 8 กำหนดจำนวนรอบ 0-99 โดยใช้ฟังก์ชั่น for
บรรทัดที่ 9 ทำการแปลงเลขฐานสิบจากตัวแปร ให้เป็นเลขฐานสิบหก ตัวอย่างเช่น ถ้าต้องการแสดงเลข 10 โดยหลักสิบแสดงเลข 1 และหลักหน่วยแสดงเลข 0 ต้องส่งข้อมูล 10 หรือ 16 ออกพอร์ตดังนั้นจึงต้องทำการแปลงเลขฐานสิบเป็นเลขฐานสิบหกก่อน
บรรทัดที่ 10 ทำการส่งข้อมูลซึ่งต้องเป็นข้อมูลเลขฐานสิบหกในรูปแบบ 0x00 ดังนั้นจึงต้องทำการบวกกับค่าตัวเลขที่คำนวณได้จากบรรทัดที่ 9
บรรทัดที่ 11 หน่วงเวลาในการแสดงผล

ผลการรันโปรแกรม

     ไมโครคอนโทรลเลอร์ PIC จะทำการวนรอบแสดงการนับ 00-99 โดยส่งข้อมูลออกพอร์ต Bแสดงผลที่หลอดแสดงผล LED 7-Segment ทั้ง 2 ตัว

ตัวอย่างที่ 5.2 โปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวซึ่งต่อเข้ากับพอร์ต ผ่านไอซีถอดรหัส โดยให้แสดงผลตั้งแต่ 99-00 และหลอดแสดงผล LED 7-Segment ต่อแบบแคโทดร่วม


เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use     delay (clock=4Mhz)
void main()
{
  signed int i,t;
  while(1)
   { for(t=99;t>=0;t--)0
            { i=(t/10)*6+t;
            output_B(0x00+i);
            delay_ms(500);
            }
   }                             

}

อธิบายโปรแกรม

บรรทัดที่ 7 ถึง 13 วนรอบการทำงานโดยใช้ฟังก์ชั่น while
บรรทัดที่ 8 กำหนดจำนวนรอบ 99-0 โดยใช้ฟังก์ชั่น for
บรรทัดที่ 9 ทำการแปลงเลขฐานสิบจากตัวแปร ให้เป็นเลขฐานสิบหก ตัวอย่างเช่น ถ้าต้องการแสดงเลข 10 โดยหลักสิบแสดงเลข 1 และหลักหน่วยแสดงเลข 0 ต้องส่งข้อมูล 10 หรือ 16 ออกพอร์ต ดังนั้นจึงต้องทำการแปลงเลขฐานสิบเป็นเลขฐานสิบหกก่อน
บรรทัดที่ 10 ทำการส่งข้อมูลซึ่งต้องเป็นข้อมูลเลขฐานสิบหกในรูปแบบ 0x00 ดังนั้นจึงต้องทำการบวกกับค่าตัวเลขที่คำนวณได้จากบรรทัดที่ 9
บรรทัดที่ 11 หน่วงเวลาในการแสดงผล

ผลการรันโปรแกรม

     ไมโครคอนโทรลเลอร์ PIC จะทำการวนรอบแสดงการนับ 99-00 โดยส่งข้อมูลออกพอร์ต แสดงผลที่หลอดแสดงผล LED 7-Segment ทั้ง 2 ตัว

6. การส่งข้อมูลออกหลอดแสดงผล LED 7-Segment แบบมัลติเพล็กซ์

     การเชื่อมต่อไมโครคอนโทรลเลอร์ PIC กับหลอดแสดงผล LED 7-Segment ส่วนแบบมัลติเพล็กซ์ จะเป็นการช่วยประหยัดพอร์ตใช้งานของ PIC ได้เป็นจำนวนมาก เพราะว่าไม่ว่าจะต่อหลอดแสดงผล LED 7-Segment 1 ตัว 2 ตัว หรือมากกว่า ก็จะใช้พอร์ตเพียง 1 พอร์ตเท่านั้น





รูปที่ 6.1 การเชื่อมต่อ PIC กับหลอดแสดงผล 7-Segment จำนวน 2 ตัว
แบบมัลติเพล็กซ์




ตัวอย่างที่ 6.1 โปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จำนวน 2 ตัวซึ่งต่อเข้ากับพอร์ต B0-B3 และ พอร์ต B4-B7 ต่อกับไอซีเบอร์ 74LS138 เพื่อเลือกหลักในการแสดงผล โดยให้แสดงผลเป็นตัวเลข 2 ที่หลอดแสดงผล LED 7-Segment ส่วนตัวที่ 1 หลักสิบ และ แสดงผลเป็นเลข 5 ที่หลอดแสดงผล LED 7-Segment ตัวที่ 2 หลักหน่วย


เขียนโค๊ดที่ใช้งานจริง

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use     delay (clock=4Mhz)
void main()
{
  set_tris_B(0x00);
  while(1)
   { 
      output_B(0x02); delay_ms(10);
      output_B(0x15); delay_ms(10);
   }                             
}

อธิบายโปรแกรม

บรรทัดที่ 5 กำหนดให้พอร์ต B เป็นพอร์ตเอาต์พุต
บรรทัดที่ 6 วนรอบส่งข้อมูลออกพอร์ต B ด้วยฟังก์ชัน while
บรรทัดที่ 7 ส่งข้อมูล 0x02 ออกพอร์ต B โดยแสดงเลข 2 ในหลักหน่วย แล้วหน่วงเวลา
บรรทัดที่ 8 ส่งข้อมูล 0x15 ออกพอร์ต B โดยแสดงเลข 5 ในหลักสิบ แล้วหน่วงเวลา

ผลการรันโปรแกรม

     ไมโครคอนโทรลเลอร์ PIC จะส่งข้อมูลเป็นเลข 2 และ 5 ออกที่หลอดแสดงผล LED 7-Segment ทั้ง 2 ตัว โดยเลข 2 แสดงที่หลักหน่วย และเลข 5 แสดงที่หลักสิบ

ตัวอย่างที่ 6.2 โปรแกรมแสดงผลออกหลอดแสดงผล LED 7-Segment จำนวน 2 ตัว เข้ากับพอร์ต B0-B3 และ พอร์ต B4-B7 ต่อกับไอซีเบอร์ 74LS138 เพื่อเลือกหลักในการแสดงผล โดยให้แสดงผลตั้งแต่ 00-99 และหลอดแสดงผล LED 7-Segment ต่อแบบแคโทดร่วม

เขียนโค๊ดที่ใช้งานจริง


#include   <16F877.h>

#fuses     HS,NOWDT,NOPUT,NOPROTECT

#use       delay (clock=4Mhz)

void main()

{

int i,t0,t1;
set_tris_B(0x00);
while(1)
   {
     for(i=0;i<100;i++)
     { t1=i/10;
       output_B(0x00+t1);
       delay_ms(100);
       t0=i%10;
       output_B(0x10+t0);
       delay_ms(100);
     }
   }
}

อธิบายโปรแกรม

บรรทัดที่ 10 ถึง 17 วนรอบนับ 00-99 โดยใช้ฟังก์ชัน for
บรรทัดที่ 11 แยกค่าตัวเลขหลักสิบมาเก็บไว้ในตัวแปร t1 โดยการหารด้วย 10 เช่น

     ถ้า i=10 และ i/10 =10/10=1 ดังนั้นค่าที่จะส่งออกในหลักสิบก็คือ 1
     ถ้า i=15 และ i/10 = 15/10 = 1.5 ดังนั้นค่าที่จะส่งออกในหลักสิบก็คือ 1
     คิดเฉพาะเลขจำนวนเต็มเท่านั้น เพราะ ตัวแปร เป็นชนิด Integer)

บรรทัดที่ 12 ส่งข้อมูล t1 และสัญญาณควบคุม 0x00 ให้แสดงที่หลักสิบ ออกพอร์ต B
บรรทัดที่ 13 หน่วงเวลาในกาแสดงผลในหลักสิบ
บรรทัดที่ 14 แยกค่าตัวเลขหลักหน่วยมาเก็บไว้ในตัวแปร t0 โดยการหารด้วย 10 แบบคิดเศษ เช่น
     ถ้า i = 1 และ i % 10 = 1 % 10 = 0 เศษ 1 ดังนั้นค่าที่จะส่งออกในหลักหน่วยก็คือ 1
     ถ้า i = 12 และ i % 10 = 12 % 10 = 1 เศษ 2 ดังนั้นค่าที่ส่งออกในหลักหน่วยก็คือ 2

บรรทัดที่ 16 ส่งข้อมูล t0 และสัญญาณควบคุม 0x10 ให้แสดงที่หลักหน่วยออกพอร์ต B
บรรทัดที่ 17 หน่วงเวลาในการแสดงผลในหลักหน่วย

ผลการรันโปรแกรม
     PIC จะทำการนับ 00-99 แสดงผลออกที่หลอดแสดงผล LED 7-Segment ซึ่งในการเขียนโปรแกรมจะแยกข้อมูลในหลักสิบและหลักหน่วยออกจากกัน จากนั้นจึงวนรอบส่งข้อมูลพร้อมสัญญาณควบคุมออกพอร์ต B

ตัวอย่างที่ 6.3 โปรแกรมแสดงนาฬิกาแสดงหลักชั่วโมง นาที และวินาที โดยแสดงตั้งแต่ 00:00:00 ถึง 23:59:59



เขียนโค๊ดที่ใช้งานจริง


#include    <16F877.h>
#fuses      HS,NOWDT,NOPUT,NOPROTECT
#use        delay (clock=4000000)
void main()
{
   signed int digit0,digit1,digit2,digit3,digit4,digit5,hour,min,sec;
  SET_TRIS_B(0x00);
  while(1)
     { 
       for(hour=0;hour<24;hour++)
         {  for(min=0;min<60;min++)
             {  for(sec=0;sec<60;sec++)
                {
                   digit4 = hour%10;
                   digit5 = hour/10;
                   digit2 = min%10;
                   digit3 = min/10;
                   digit0 = sec%10;
                   digit1 = sec/10;
                   output_B(0x00+digit5);delay_ms(50);
                   output_B(0x10+digit4);delay_ms(50);
                   output_B(0x20+digit3);delay_ms(50);
                   output_B(0x30+digit2);delay_ms(50);
                   output_B(0x40+digit1);delay_ms(50);
                   output_B(0x50+digit0);delay_ms(50);
                }
              }
          }
     }
 }

อธิบายโปรแกรม

บรรทัดที่ 10 ถึง 25 วนรอบนับ 00 ถึง 23 โดยใช้ฟังก์ชัน for
บรรทัดที่ 11 ถึง 24 วนรอบนับ 00 ถึง 59 โดยใช้ฟังก์ชัน for
บรรทัดที่ 12 ถึง 23 วนรอบนับ 00 ถึง 59 โดยใช้ฟังก์ชัน for
บรรทัดที่ 14 ถึง 15 แยกแสดงหลักชั่วโมงในการแสดงผลของแต่ละหลัก
บรรทัดที่ 16 ถึง 17 แยกแสดงหลักนาทีในการแสดงผลของแต่ละหลัก
บรรทัดที่ 18 ถึง 19 แยกแสดงหลักวินาทีในการแสดงผลของแต่ละหลัก
บรรทัดที่ 20 ถึง 25 ส่งข้อมูลแสดงผลในแต่ละหลัก 

ผลการรันโปรแกรม
     แสดงผลการนับ 00:00:00 ถึง 23:59:59 แสดงผลบนหลอดแสดงผล LED 7-Segment ทั้ง 6 หลัก โดยที่ Digit5 และ Digit4 แสดงผลของ วินาที ส่วน Digit3 และ Digit2 เป็นการแสดงผลของนาที และ Digit1 และ Digit0 เป็นการแสดงผลของชั่วโมง

อ้างอิง : http://engineeringkowlege.blogspot.com/2013/03/led-7-segment-micro-controller-pic-pic.html



ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

๊็็ใบงานที่ 6 การควบคุม Servo Motor (SG90) ด้วย Arduino UNO R3

ใบงานที่ 3. การแสดงค่าความเข้มของแสงด้วย 7-Segment และ LED