[ บทความ : 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
ดังนี้
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,
๒๖ พ.ย. ๔๔