[ บทความ : ทดลองใช้ภาษาซีกับบอร์ด ET-BOARD V6 ] [ภาค MCS-51] ตอนที่ 3 ติดต่อกับ LED#2 |
ตัวอย่างโปรแกรมในบทความนี้จะเป้นการปรับปรุงการทำงานของโปรแกรมจาก LAB#1 คือ ตอนที่แล้วนั้น โปรแกรมของเราได้ทำการสั่งให้ LED สว่างทีละดวงจากทางขวาไปซ้าย แล้วก็วนต่อไปเรื่อยๆ ... ในตอนนี้เราจะมาปรับปรุงโปรแกรมกันใหม่ คือ นอกจากจะเป็นการสั่งให้ LED วิ่งจากทางขวาไปซ้ายแล้วเมื่อ LED ไปถึงทางซ้ายสุด ก็จะทำการวิ่งกลับมาทางขวา สลับไปมาอย่างนี้ เรื่อยๆ ... จะเห็นว่าโปรแกรมในตอนนี้จะซับซ้อนกว่าบทความแรกอยู่บ้าง คือ มีการสร้างตัวแปรภายนอกชื่อว่า template ซึ่งเป็นตัแปร แบบ unsigned char สำหรับทำหน้าที่เก็บรูปแบบของค่าที่เราจะส่งไปที่พอร์ตเพื่อขับหลอด LED เช่น 0x01 (หรือ 00000001 ในเลขฐานสอง) ก็เป็นการกำหนดให้ LED หลอดทางขวาสุดติด 0x02 (หรือ 00000010) ก็เป็นการสั่งให้ LED ดวงที่ 2 จากทางขวาติดและดวงอื่นๆ ดับ เป็นต้น วิธีการที่เราสร้างรูปแบบ (template หรือ pattern) ขึ้นมาล่วงหน้านี้มีข้อดีตรงที่ เราลดการคำนวณของโปรแกรมลงไป ทำให้โปรแกรมมีความเร็วในการทำงานที่ดีขึ้น แต่เราก็ต้องเสียหน่วยความจำไปบางส่วนเพื่อใช้ในการเก็บข้อมูล (จากโปรแกรมจะเห็นว่าเราเสียหน่วยความจำไป 16 ไบต์) ... เมื่อเข้าใจหลักการทำงานแล้วก็ทำการพิมพ์โปรแกรม พร้อมทั้งทำการคอมไพล์ หลังจากนั้นก็โหลดลงตัวบอร์ดได้เลยครับ
/* * Filename : ex02.c * Compiler : Micro-C51 V2.4 * Hardware : ET-2000 V6 [Moving LED flag] * cc51 ex02 -pio m=l */ #include <8051io.h> #include <8051reg.h> #define P_DIGIT 0xE000 #define P_SEGM 0xE001 #define P_CONTROL 0xE003 unsigned char template[] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, 0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00 }; config8255usr() { poke(P_CONTROL,0x88); delay(); } delay() { unsigned char i,o; for (o=0; o<10; o++) for (i=0; i< 255; i++); } main() { unsigned char pattern; config8255usr(); pattern = 0x06; poke(P_DIGIT,pattern); delay(); pattern = 0x01; while (1) { poke(P_SEGM,template[pattern]); delay(); if (pattern == 15) { pattern = 0; } else { pattern++; } } }ตัวอย่างโปรแกรมเกี่ยวกับ LED คงจบลงเท่านี้ครับ ... ต่อไปเรามาดูถึงการควบคุม 7-Segment กันดีกว่าครับ