(บล็อกที่ 6) การควบคุมหลอดแสดงผล LED 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 ตามลำดับ

วีดีโอผลการรันโปรแกรม

*********************************************************************************

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



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

#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 ตามลำดับ

วีดีโอผลการรันโปรแกรม

ความคิดเห็น

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

โครงงานเครื่องวัดส่วนสูงแบบดิจิตอล ( งานที่ 4)

การเขียนผังงาน (Flowchart)