ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 11 [LED แสดงผลจากค่าในตัวแปร]  (อ่าน 4447 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
การเรียนรู้ครั้งนี้ใช้เพื่อต่อยอดที่จะขับ LED ที่ต่อพอร์ตในการเรียนรู้ครั้งต่อ ๆ ไป จุดประสงค์หลักคือการเขียนโค้ดเพื่อให้ LED สามารถแสดงผลติด/ดับในแต่ละหลักได้โดยรับค่าจากข้อมูลที่เก็บอยู่ในตัวแปร เมื่อทำการเชื่อมต่อพอร์ต (ไม่ว่าจะเป็นขนานหรืออนุกรม) LED ที่อยู่กับฮาร์ดแวร์จะต้องมีสถานะเช่นเดียวกับ LED ที่อยู่บนหน้าต่างของโปรแกรม
เป้าหมายของการทำงานของโปรแกรมจะเป็นเช่นนี้



ขั้นตอนการดำเนินการ
1. ค้นหารูปภาพที่ใช้แทนสวิตช์และ LED โดยให้มีทั้ง 2 สภาวะคือ ON/OFF หรือเข้าไปที่เวปไซต์
http://www.clker.com/clipart-6515.html
เมื่อได้ภาพที่ต้องการแล้วให้คลิกขวาที่ภาพแล้วเลือก Save as บันทึกภาพเก็บลงเครื่อง
ตัวอย่างภาพที่ใช้งาน








วิธีการเก็บภาพลงเครื่อง ให้คลิกขวากลางภาพที่ต้องการแล้วเลือก Save image as... ดังรูป

*เฉพาะรูป LED ติดกับ LED ดับเพียง 2 รูปเท่านั้น

2. วางคอนโทรล PictureBox ลงบน Form ทำการเลือกภาพที่ดาวน์โหลดจากข้อ 1 (เฉพาะ LED)


3. คลิกตามรูปแล้วทำการเลือกรูปที่ดาวน์โหลดมาทั้ง 2 รูป


4. เลือกรูปแรก


5. ตั้งค่าคุณสมบัติ SizeMode เป็น AutoSize


6. เปลี่ยนชื่อรูปจากเดิมที่เป็น picturebox1 เป็นชื่อแทนโดยให้มีความหมายที่ใช้งาน (ในที่นี้ใช้คำว่า LOFF)


7. คัดลอก PictureBox จากข้อ 6 วาง แล้วเปลี่ยนรูปพร้อมเปลี่ยนชื่อดังรูป
* LON,LOFF เป็นต้นแบบภาพ LED ในสภาวะติดและดับ


8. ปรับขนาด Form ให้ปิดบังต้นแบบภาพ


9. จะได้หน้าตาโปรแกรมดังรูป


10. วางคอนโทรล Timer ลงใน Form และกำหนดค่าใน Properties ดังนี้
   -Enabled-->True   เพื่อให้ไทเมอร์ทำงานทันทีเมื่อรันโปรแกรม
   -Interval--->100 กำหนดช่วงเวลาการกระตุ้นเป็น 100 มิลลิวินาที (1/10 วินาที)


11. ดับเบิลคลิกที่ตัว Timer แล้วเขียนโค้ด
   -ส่วนแรกเป็นการประกาศตัวแปร แต่เนื่องจากโปรแกรมที่ใช้งานเป็น C# 2015 จึงยังไม่สามารถใส่เป็นเลขฐานสองได้
   -ส่วนของโปรแกรม ใช้การตรวจสอบบิตข้อมูลในแต่ละบิตว่าเป็น 1 หรือ 0 ก่อนสั่งให้เปลี่ยนภาพ(นำภาพจากต้นแบบ)แทนภาพเดิม

โค้ดโปรแกรมส่วนประกาศตัวแปร
โค๊ด: [Select]
        Byte[] vals = {0x00,    //0000 0000
                       0x01,    //0000 0001
                       0x03,    //0000 0011
                       0x07,    //0000 0111
                       0x0F,    //0000 1111
                       0x1F,    //0001 1111
                       0x3F };  //0011 1111
        Int16 n = 0;
โค้ดโปรแกรมส่วนตรวจสอบข้อมูลและเปลี่ยนภาพ
โค๊ด: [Select]

            L0.Image = ((vals[n] & 1) == 1) ? LON.Image : LOFF.Image;
            L1.Image = ((vals[n] & 2) == 2) ? LON.Image : LOFF.Image;
            L2.Image = ((vals[n] & 4) == 4) ? LON.Image : LOFF.Image;
            L3.Image = ((vals[n] & 8) == 8) ? LON.Image : LOFF.Image;
            L4.Image = ((vals[n] & 16) == 16) ? LON.Image : LOFF.Image;
            //-----------------next index pointer----------------------
            if (n < vals.Length - 1)
                n++;
            else
                n = 0;

หมายเหตุ ใช้ if แบบย่อเพื่อให้โค้ดสั้นลง เช่น
โค๊ด: [Select]
L0.Image = ((vals[n] & 1) == 1) ? LON.Image : LOFF.Image;
โค้ดเต็มคือ
โค๊ด: [Select]
if((vals[n] & 1) == 1)
{
L0.Image=LON.Image;
}
else
{
L0.Image=LOFF.Image;
}

12. รันโปรแกรมเพื่อทดสอบผล



« แก้ไขครั้งสุดท้าย: กันยายน 21, 2018, 12:16:34 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
Re: เรียนรู้ครั้งที่ 11 [LED แสดงผลจากค่าในตัวแปร]
« ตอบกลับ #1 เมื่อ: กันยายน 21, 2018, 12:17:35 PM »
...

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
Re: เรียนรู้ครั้งที่ 11 [LED แสดงผลจากค่าในตัวแปร]
« ตอบกลับ #2 เมื่อ: กันยายน 21, 2018, 12:17:48 PM »
...