[ บทความ : EXP4 I/O LAB 1 : #3 7 Segment and LED ] |
ตัวอย่าง LAB สุดท้ายเป็น การรวมการแสดงผลทั้ง 7Segment และ LED มาใช้ร่วมกันในคราวเดียว มาดูโปรแกรมตัวอย่างกันก่อนเลยครับ
/* * Filename : mLed03.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};
char led[] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
char _7val(val)
char val;
{
if (val < 0x00) val = 0x00;
if (val > 0x0F) val = 0x0F;
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 > ) col = 3;
if (val < 0) val = 0;
if (val > 16) val = 16;
P0 = col;
P1 = _7val(val);
my_delay(2);
}
led_disp(val)
int val;
{
P0 = 4;
P1 = led[val];
}
main()
{
char idx;
int cnt;
idx = 0;
cnt = 0;
while(1) {
_7disp(0,idx);
_7disp(1,idx);
_7disp(2,idx);
_7disp(3,idx);
led_disp(idx);
cnt++;
if (cnt > 100) {
cnt = 0;
idx++;
if (idx > 0x0F) idx = 0x00;
}
}
}
จะเห็นว่า เหมือนกับ 2 LAB ก่อนหน้านี้ นั่นคือ พอร์ต 0-3 เป็น COLUMN ของ 7Segment และ 4 สำหรับ LED Port แล้วก็ทำการส่งข้้อมูล ตั้งแต่ 0-16 ไปแสดงที่ 7Segment และที่ LED เราก็ใช้วิธีส่ง pattern ดังนี้ (ดูได้จากตัวแปร led[])
# ค่า การแสดงผล
1 0x00 00000000
2 0x01 0000000*
3 0x02 000000*0
4 0x04 00000*00
5 0x08 0000*000
6 0x10 000*0000
7 0x20 00*00000
8 0x40 0*000000
9 0x80 *0000000
10 0x40 0*000000
11 0x20 00*00000
12 0x10 000*0000
13 0x08 0000*000
14 0x04 00000*00
15 0x02 000000*0
16 0x01 0000000*
ส่วนตัวอย่างโปรแกรมสำหรับบอร์ด Cp-SB31 V2 ก็เป็นดังนี้ครับ
/* * Filename : mLed03a.c
* Compiler : Micro C/51 V2.4
* Hardware : EXP4 IO LAB1
* CP-SB31V2
*/
#include <8051reg.h>
#include "sb31v2.h"
char patt[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
char led[] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
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(2);
}
led_disp(val)
int val;
{
pio_wr(PIO_B,4);
pio_wr(PIO_A,led[val]);
}
main()
{
char idx;
int cnt;
pio_init();
idx = 0;
cnt = 0;
while(1) {
_7disp(0,idx);
_7disp(1,idx);
_7disp(2,idx);
_7disp(3,idx);
led_disp(idx);
cnt++;
if (cnt > 100) {
cnt = 0;
idx++;
if (idx > 0x0F) idx = 0x00;
}
}
}
ตอนนี้ก็จบตัวอย่าง LAB ภาคที่เป็น 7Segment และ LED แล้วนะครับ เรื่องต่อไปก็จะเป็น LCD ล่ะ เจอกันคราวหน้ากับ LAB บทที่ 2 ครับ