[ บทความ : EXP4 I/O LAB 1 : #2 7-Segment]

 

                ใน LAB ที่ 2 นี้ เราใช้กับ 7-Segment บนบอร์ด ET-EXP4 I/O การต่อ connector นั้น เราต่อ Port 1 เข้ากับส่วนที่เป็น ROW และ Port 0 เข้ากับช่อง COLUMN แล้วเลือก Switch

 มาเป็น SCAN ซึ่ง หลักการ SCAN ก็คือ การใช้ Bus สำหรับส่ง DATA เพียงพอร์ต เดียว แต่ใช้กับอุปกรณ์หลายตัว (ในที่นี้ เป็น 7-Segment 4 หลัก) โดย เราจะใช้ พอร์ต อีกตัวหนึ่งเป็น

ตัวเลือกว่า จะส่งข้อมูลไปที่อุปกรณ์ตัวใด

 

 

                การเลือก COLUMN นั้น ทำได้โดยการส่งค่าประจำ COLUMN ดังนี้

     COLUMN #  Value

     1         0

     2         1

     3         2

     4         3

                เช่น ถ้าเราต้องการส่งข้อมูลไปที่ COLUMN 2 เราก็ให้ P0 = 1 แล้ว ก็ส่งข้อมูลออก ไปที่ P1 [ดูได้จากฟังก์ชัน _7disp( ) ] ตัวอย่างโปรแกรม เป็นดังนี้ครับ

 

/*

 * Filename : mLed02.c

 * Compiler : Micro C/51 V2.4

 * Hardware : EXP4 IO LAB1 & EXP4 MCU

 */

#include <8051reg.h>               

 

char patt[16] = {

    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,

    0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71

};

/* ตรงนี้ ผมทำการสร้างตาราง สำหรับ 7-Segment เอาไว้ใน Global Variable */

 

char _7val(val)

char val;

{

/* สองบรรทัดนี้ สามารถตัดออกได้ครับ เพราะ ผมเขียนเอาไว้

    เพื่อ ดักข้อผิดพลาด เท่านั้น เมื่อเอาออกแล้ว ความเร็วก็จะสูงขึ้นครับ */

    if (val < 0x00) val = 0x00;

    if (val > 0x0F) val = 0x0F;

/* ค่าที่คืนกลับในแบบนี้ เราเรียกว่าการเปิดตาราง หรือ Table-Lookup */   

    return(patt[val]);

}

 

my_delay(mxloop)

int mxloop;

{

    int i,o;

    for (o=0; o<mxloop; o++)

        for (i=0; i<10; i++);

}

 

_7disp(col, val)

int col;

int val;

{

/* สี่บรรทัดนี้เอาไว้ดักข้อผิดพลาดครับ เอาออกได้ */

    if (col < 0) col = 0;

    if (col > 3) col = 3;

    if (val < 0) val = 0;

    if (val > 16) val = 16;

/* เลือก COLUMN และส่งข้อมูล ออกไปที่ DATA BUS */

    P0 = col;

    P1 = _7val(val);

/* ถ้าหน่วงเวลานานเกินไป จะเห็นว่า 7 Segment แสดงทีละตัว  แต่ถ้าเร็วเกินไป จะกระพริบ*/

    my_delay(5);

}

 

main()

{

   while(1) {

       _7disp(0,1);

       _7disp(1,2);

       _7disp(2,3);

       _7disp(3,4);

   }

}

 

                ตัวอย่างโปรแกรมต่อไป เราจะ นำ Header จากตัวอย่างก่อนมาใช้นะครับ  จึงได้โปรแกรม สำหรับ CP-SB31 V2 ดังนี้

/*

 * Filename : mLed02a.c

 * Compiler : Micro C/51 V2.4

 * Hardware : EXP4 IO LAB1

 *            CP-SB31 V2

 */

#include <8051reg.h>

#include "sb31v2.h"

 

char patt[16] = {

    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,

    0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71

};

 

char _7val(val)

char val;

{

    if (val < 0x00) val = 0x00;

    if (val > 0x0F) val = 0x0F;

    return(patt[val]);

}

 

_7disp(col, val)

int col;

int val;

{

    if (col < 0) col = 0;

    if (col > 3) col = 3;

    if (val < 0) val = 0;

    if (val > 16) val = 16;

    pio_wr(PIO_B,col);

    pio_wr(PIO_A,_7val(val));

    my_delay(5);

}

 

main()

{

   pio_init();

   while(1) {

       _7disp(0,1);

       _7disp(1,2);

       _7disp(2,3);

       _7disp(3,4);

   }

}

 

                ในตัวอย่างสำหรับ CP-SB31 V2 เราก็ใช้ Port-A เป็น DATA BUS และ Port-B เป็น พอร์ตเลือก COLUMN ส่วนโครงร่างของโปรแกรมก็เหมือนเดิมมากเลยใช่ไหมครับ คือ เปลี่ยน

จาก P0 มาเป็น pio_wr(PIO_B, ... ) และ P1 มาเป็น pio_wr(PIO_A, ...) เท่านั้นเอง ...

                คราวหน้าจะเป็นตัวอย่างสุดท้ายแล้วครับ (สำหรับ บทที่ 1) ผมว่า การเขียนโปรแกรม ไม่ได้ยากที่ การเลือกภาษา เป็นอันดับแรกนะครับ ... ที่ยากอันดับแรกน่ะ

เป็นเรื่อง จะเขียนอะไร และเขียนอย่างไรมากกว่า ... ขอให้สนุกกับ C นะครับ ...  ตอนนี้เท่านี้ล่ะ

 

 

 


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
วันที่ทำการปรับปรุง : 14:06 21/10/2544, ๒๖ พ.ย. ๔๔