[ บทความ : 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 ครับ


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
วันที่ทำการปรับปรุง : ๗ ส.ค. ๒๕๔๕