Thaimicrotron.com : Home
 
LED 7 SEGMENT
 
     
 

การแสดงผลแบบมัลติเพล็ก (Multiplex display)

 
 

     หากการแสดงผล LED 7 Segment พร้อมๆกัน หลายๆหลัก จะทำให้ต้องใช้เอาต์พุตจำนวนมาก และทำให้มีความต้องการใช้ กระแสไฟมากด้วย จึงนิยมให้แต่ละ segment พลัดกัน แสดงข้อมูล ทีละหลัก สลับกันไป ด้วยความเร็วสูง ทำให้มองเห็น เหมือนว่า แสดงพร้อมๆกันทุกหลัก วิธีนี้เรียกว่า การแสดงผลแบบมัลติเพล็ก (Multiplex display) โดยจะควบคุมแต่ละหลักโดยใช้ขา Common ของ 7 segment display แต่ละหลัก ข้อดีคือ จะใช้เอาต์พุต น้อย ส่วนกระแสไฟจะใช้เพียงหลักเดียวเท่านั้น

 
   
  หลักการทำงานแบบ Multiplex  
 

- ส่งข้อมูลแสดงผลของหลักแรกออกไปที่ P1.0
- ให้ Segment 1 ON (P3.3="0")
- หน่วงเวลา 5 ms เพื่อ ให้ Segment 1 แสดงผล
- ให้ Segment 1 OFF (P3.3="1")

- ส่งข้อมูลแสดงผลของหลักที่2ออกไปที่ P1.0
- ให้ Segment 2 ON (P3.2="0")
- หน่วงเวลา 5 ms เพื่อ ให้ Segment 2 แสดงผล
- ให้ Segment 2 OFF (P3.2="1")

- ตรวจสอบและทำงานอย่างอื่นด้วย (ถ้ามี)...
- กลับไปแสดงผลหลักแรก

 
     
  การทำงานของโปรแกรมย่อย  
     
 
 
     
 
  • ใส่ข้อมูลที่ต้องการแสดงออกที่ 7 Segment ไว้ที่แอดเดรส SEGDIS ซึ่งจะต้องเป็นข้อมูลแบบ BCD (Binary Code Decimal) คือมีค่าอยู่ในช่วง 0-9 จากรูปตัวอย่างข้อมูลจะให้เป็น 59H
 
 
  • โปรแกรมย่อยจะแบ่งข้อมูลออกเป็นสองส่วน สำหรับแสดงใน Segment ที่ 1 และ Segment ที่ 2 โดยใน Segment 1 จะกำจัด 4 bit หลัง โดยนำมา ANL กับ 0F0H และกลับค่ากันระหว่าง 4 bit หน้ากับ 4 bit หลังด้วยคำสั่ง
 
 
  SWAP     A ;กลับค่ากันระหว่าง 4 bit หน้ากับ 4 bit หลัง
     
  ส่วน Segment 2 จะกำจัด 4 bit หน้า ด้วยการนำมา ANL กับ 0FH
 
     
     
 
  • นำข้อมูลที่ได้ทั้งสองส่วนมาแปลงเป็นข้อมูลของตัวเลข 7 ส่วนด้วย ตารางที่ 1
 
 
  • นำข้อมูลที่แปลงได้จากตารางแสดงออกตามข้อมูลของ Segment นั้นแบบ มัลติเพล็ก
 
 
  • เนื่องจากข้อมูล ที่เป็นอินพุต ของโปรแกรมย่อยนี้ จะต้องเป็นแบบ BCD ดังนั้นจะต้องใช้คำสั่ง
 
 
  DA     A ;Decimal-adjust Accumulator for addition
  หลังจากใช้คำสั่ง การเพิ่มค่า (addition) ทางคณิตศาสตร์ (เท่านั้น) เช่น ADD , ADDC ,INC เพื่อเปลี่ยนเลขฐาน 16 เป็น BCD ก่อนส่งตัวแปร SEGDIS ให้โปรแกรม ย่อย
 
     
     
     
  ตัวอย่างการเรียกใช้งานคำสัง DA    A  
     
 
  MOV A,SEGDIS ;Get data form Segment Display Buffer
  INC A ;A=A+1 -> A
  DA A ;Decimal-adjust Accumulator for addition
  MOV SEGDIS,A ;Save to buffer
     
 
     
  - เช่น หากเรานำเอาค่า 9 + 1 = 10 และถ้าแปลงเป็นเลขฐาน16 จะมีค่าเป็น 0AH แต่เมื่อหลังใช้คำสั่ง DA A ค่าในรีจิสเตอร์ A = 10H  
     
     
  ตัวอย่างการมัลติเพล็กตัวเลข 7 ส่วนแบบ 2 หลัก  
  - รูปวงจร และ การต่อสาย จะเหมือนกันกับตัวอย่างที่ 6  
  EXAM7  
     
 
;EXAM7
;Display 7 Segment 2Digit Count 0-59
;
	ORG	0000H

SCANCON	EQU	05H		;7 Segment Scan Delay time
SEGM1	EQU	P3.3		;Control Q1 Segment 1
SEGM2	EQU	P3.2		;Control Q2 Segment 2


SEGDAT1	EQU	30H		;Reserve data for segment 1
SEGDAT2	EQU	31H		;Reserve data for segment 2
SEGDIS	EQU	32H		;Segment Display Buffer
CnTM	EQU	33H		;Counter duration time


START:	MOV	SEGDIS,#00H	;Clear Segment Display counter
RELOAD:	MOV	CnTM,#01FH	;Load Counter delay time

DSPLP:	LCALL	SEGDSP		;Display data to 7 Segment
	DJNZ	CnTM,DSPLP

	MOV	A,SEGDIS	;Get data form Segment Display Buffer
	INC	A		;+1
	DA	A		;Decimal-adjust Accumulator for addition
	
	MOV	SEGDIS,A	;Save to buffer
	XRL	A,#60H		;Compare with 60
	JZ	START		;is equal ReStart

	AJMP	RELOAD		;no reload Counter Time


;*** Display 7 Segment*** 
;IN = SEGDIS
;REG = R2,SEGDAT1,SEGDAT2 
SEGDSP:
	MOV	A,SEGDIS	;Load Dislay Buffer to A
	ANL	A,#0F0H		;Clear 4 bit low
	SWAP	A		;swap Low nibbles and High nibbles
	MOV	SEGDAT1,A	;Save to Segment Data1

	MOV	A,SEGDIS	;Load Dislay Buffer to A
	ANL	A,#0FH		;Clear 4 bit High
	MOV	SEGDAT2,A	;Save to Segment Data2
SCAN7SEG:
;Display SEG1
	MOV	A,SEGDAT1	;Load Segment 1
	LCALL	CNV7SEG		;Convert data to 7 segment
	MOV	P1,A		;Display Data
	CLR	SEGM1		;On Transistor Drive SEG1

	MOV	R2,#SCANCON	;Delay for diaplay
	LCALL	DMSEC
	SETB	SEGM1		;Off Transistor Drive SEG1

;Display SEG2
	MOV	A,SEGDAT2	;Load Segment 2             
	LCALL	CNV7SEG		;Convert data to 7 segment  
	MOV	P1,A		;Display Data               
	CLR	SEGM2		;On Transistor Drive SEG2   
				                            
	MOV	R2,#SCANCON	;Delay for diaplay          
	LCALL	DMSEC		                            
	SETB	SEGM2		;Off Transistor Drive SEG2  	


	RET

 
; ********** DTSEC SUB **********
; DELAY	1/10 SECOND
; IN  =	R2
; REG =	R2,R3,R4

DTSEC:	MOV	R3,#179
DTSEC1:	MOV	R4,#0
DTSEC2:	DJNZ	R4,DTSEC2
	NOP
	NOP
	DJNZ	R3,DTSEC1
	DJNZ	R2,DTSEC
	RET

; ********** DMSEC SUB **********
; DELAY 1/1000 SECOND
; IN  = R2
; REG = R2,R3

DMSEC:   MOV    R3,#230         ;1 MSEC LOOP
DMSEC1:  NOP
	 NOP
	 DJNZ   R3,DMSEC1
	 DJNZ   R2,DMSEC
	 RET

;*** Convert 7 Segment ***
CNV7SEG:
	MOV	DPTR,#SEGTBL	;LOAD TABLE POINTER
	MOVC	A,@A+DPTR
	RET

SEGTBL:	DB	0C0H,0F9H,0A4H,0B0H,99H
	DB	92H,82H,0F8H,80H,90H
	END

 
 
 
DOWNLOAD
 
     
  แบบฝึกหัด จากตัวอย่าง EXAM6 ให้ออกแบบการนับใหม่คือนับจาก 0-F นับ 16 โดยให้ออกแบบตัวเลขบน segment A-F เอง  
  แนวทาง  
  - ที่บรรทัด MAIN: จะต้องเปลี่ยนค่าเริ่มต้นเป็นเท่าไร  
  - การแสดงผล A-F เมื่อแสดงผลบน 7 segment จะมีค่าเป็นเท่าไรดูตัวอย่างจากตารางที่1