PIC單片機(jī)應(yīng)用專(zhuān)題二:顯示接口及編程
單片機(jī)的顯示輸出常用來(lái)顯示系統(tǒng)參數(shù)、運(yùn)行結(jié)果及人機(jī)對(duì)話窗口。常用的顯示器主要有LED(數(shù)碼管)和LCD(液晶)。因LED應(yīng)用簡(jiǎn)單、價(jià)格低廉得到廣泛應(yīng)用,下面主要對(duì)其應(yīng)用進(jìn)行介紹。
數(shù)碼管有共陰和共陽(yáng)之分,常見(jiàn)的結(jié)構(gòu)形式有單個(gè)和四位一體,一般由8字段構(gòu)成,顯示方式有靜態(tài)顯示和動(dòng)態(tài)顯示兩種方式。
靜態(tài)顯示:
在靜態(tài)顯示方式下,共陰極或共陽(yáng)極點(diǎn)連接在一起接地或接高電平。每位的段選項(xiàng)線與一個(gè)8位并行口相連。只要在該位的段選線上保持段選碼電平,該位就能保持相應(yīng)的顯示字符。8位并行口可以是單片機(jī)的I/O口或者采用串行輸入/并行輸出的移位寄存器(常用為74HC164、74HC595)
下面是試驗(yàn)板LED動(dòng)態(tài)顯示的電路圖:
如果要顯示某字符,首先要把這個(gè)字符轉(zhuǎn)換為相應(yīng)的字形碼,然后通過(guò)單片機(jī)的串行口,將編碼數(shù)據(jù)發(fā)送到74HC595,74HC595再將接受到的數(shù)據(jù)以并行的方式加到數(shù)碼管上,并通過(guò)RCK將輸出數(shù)據(jù)鎖存。
下面是其應(yīng)用實(shí)例:
;**********************************************************
;* display.ASM
;**********************************************************
;* 利用SPI口實(shí)現(xiàn)4位數(shù)碼管顯示,在demo40板上通過(guò)調(diào)試
;* 調(diào)試時(shí)硬件設(shè)置:SW2的1,2斷開(kāi)
;**********************************************************
;* 顯示數(shù)據(jù)存放在disp1~disp4(20~23),disp1為右邊第一位
;**********************************************************
list p=16f877
; Include file, change directory if needed
include "p16f877.inc"
; Start at the reset vector
DISP1 EQU 20H
DISP2 EQU DISP1+1
DISP3 EQU DISP2+1
DISP4 EQU DISP3+1
count EQU DISP4+1
T1 EQU count+1
ORG 0x000
nop
goto start
;****************************************************************************
;以下為顯示模塊
CONVERT
ADDWF PCL,1 ;不帶小數(shù)點(diǎn)的共陰極碼表
RETLW 0X3F ;0
RETLW 0X06 ;1
RETLW 0X5B ;2
RETLW 0X4F ;3
RETLW 0X66 ;4
RETLW 0X6D ;5
RETLW 0X7D ;6
RETLW 0X07 ;7
RETLW 0X7F ;8
RETLW 0X6F ;9
RETLW 0X00 ;DARK
RETLW 0X71 ;F
RETLW 0X37 ;N
;******************************************************************************
init
banksel TRISC
movlw B'00010000' ;RC4作為SDI
movwf TRISC
movlw 0xc0
movwf SSPSTAT
banksel SSPCON
clrf PORTC
movlw B'00110010' ;
movwf SSPCON
return
disp movlw 05h
movwf count
movlw 20h
movwf FSR
bcf PORTC,6
dsnext decfsz count,1
goto dbtran
goto dsend
dbtran movf INDF,0
CALL CONVERT ;賦1位數(shù)據(jù)顯示碼
call out_in
incf FSR,1
goto dsnext
dsend bsf PORTC,6
return
out_in movwf SSPBUF
loop1
banksel SSPSTAT
btfss SSPSTAT,BF
goto loop1
bcf STATUS,RP0
movf SSPBUF,w
return
start call init
movlw 01h
movwf DISP1
movlw 02h
movwf DISP2
movlw 03h
movwf DISP3
movlw 04h
movwf DISP4
agdisp call disp
goto agdisp
end
靜態(tài)顯示電路在位數(shù)較多時(shí),字符更新速度慢,硬件成本高,在實(shí)際設(shè)計(jì)中,動(dòng)態(tài)顯示應(yīng)用較多。下面介紹的是數(shù)碼管的動(dòng)態(tài)顯示
動(dòng)態(tài)顯示:
動(dòng)態(tài)顯示是通過(guò)分時(shí)輪流選通數(shù)碼管的公共端,使得各個(gè)數(shù)碼管輪流導(dǎo)通,即各數(shù)碼管是由脈沖電流導(dǎo)電的(導(dǎo)通時(shí)間一般為1ms)。當(dāng)所有數(shù)碼管依次顯示一遍后,軟件控制循環(huán),使每位顯示器分時(shí)點(diǎn)亮。這種方法不但能提高數(shù)碼管的發(fā)光效率,并且由于各個(gè)數(shù)碼管的字段線是并聯(lián)使用的,因而大大簡(jiǎn)化了硬件線路。
下面是試驗(yàn)板的數(shù)碼管動(dòng)態(tài)顯示電路圖:
從圖中可以看出RB口用作字形輸出,RA口用作位掃描輸出。由于PIC的I/O口最大輸出電流為25ma,因此在字形輸出回路要串電阻(一般為保證亮度,電流在10~15ma),而在掃描輸出口電流為字形線電流的8倍,遠(yuǎn)超容許范圍,因此加三極管驅(qū)動(dòng)。另外可用8路三態(tài)反向緩沖器74HC240用作字形驅(qū)動(dòng),用6路反向門(mén)電路7406驅(qū)動(dòng)位選。
動(dòng)態(tài)顯示最重要的是解決好亮度和字符閃爍問(wèn)題。由于數(shù)碼管具有余輝特性及人眼具有視覺(jué)暫留效應(yīng),所以適當(dāng)選取循環(huán)掃描頻率時(shí),看上去所有數(shù)碼管是同時(shí)點(diǎn)亮的,察覺(jué)不出有閃爍現(xiàn)象。不過(guò)這種方式數(shù)碼管不宜太多(不超過(guò)8個(gè)),否則每個(gè)數(shù)碼管分配到的實(shí)際導(dǎo)通時(shí)間會(huì)太少,使得亮度不足。另外要求掃描頻率不能小于100Hz,否則就會(huì)出現(xiàn)閃爍現(xiàn)象。
下面是試驗(yàn)板數(shù)碼管動(dòng)態(tài)顯示的實(shí)例:
;**********************************************************
;* display.ASM
;**********************************************************
;* 利用PORTB口實(shí)現(xiàn)4位數(shù)碼管動(dòng)態(tài)顯示,在demo18板上通過(guò)調(diào)試
;**********************************************************
;* 顯示數(shù)據(jù)存放在disp1~disp4(20~23),disp1為右邊第一位
;**********************************************************
list p=16f628
; Include file, change directory if needed
include "p16f628.inc"
; Start at the reset vector
DISP1 EQU 20H
DISP2 EQU DISP1+1
DISP3 EQU DISP2+1
DISP4 EQU DISP3+1 ;以上為四位顯示數(shù)據(jù)存放位
count EQU DISP4+1 ;動(dòng)態(tài)顯示位
T1 EQU count+1 ;延時(shí)數(shù)據(jù)存放位
ctrl EQU T1+1 ;動(dòng)態(tài)顯示控制位
ORG 0x000
nop
goto start
;****************************************************************************
;以下為顯示模塊
CONVERT
ADDWF PCL,1 ;不帶小數(shù)點(diǎn)的共陰極碼表
RETLW 0X3F ;0
RETLW 0X06 ;1
RETLW 0X5B ;2
RETLW 0X4F ;3
RETLW 0X66 ;4
RETLW 0X6D ;5
RETLW 0X7D ;6
RETLW 0X07 ;7
RETLW 0X7F ;8
RETLW 0X6F ;9
RETLW 0X00 ;DARK
RETLW 0X71 ;F
RETLW 0X37 ;N
;******************************************************************************
init
banksel TRISB
movlw B'00000000' ;A、B口為輸出,初始數(shù)據(jù)為0
movwf TRISB
movwf TRISA
banksel PORTA
movwf PORTB
movwf PORTA
movlw 20h
movwf FSR ;顯示數(shù)據(jù)存放首地址
movlw 01h
movwf ctrl ;動(dòng)態(tài)顯示控制初值
return
disp movlw 05h
movwf count ;動(dòng)態(tài)顯示為4位
disp1 decfsz count,1 ;動(dòng)態(tài)顯示一次完否?
goto dbtran ;否,繼續(xù)顯示
goto dsend ;是,結(jié)束顯示
dbtran movf ctrl,0
movwf PORTA ;控制位賦A口
movf INDF,0
call CONVERT ;取顯示數(shù)據(jù)
movwf PORTB ;顯示數(shù)據(jù)賦B口
bcf STATUS,0 ;清進(jìn)位標(biāo)志
rlf ctrl,1 ;動(dòng)態(tài)控制位左移
incf FSR,1 ;顯示數(shù)據(jù)地址加1
call delay ;延時(shí)
CLRF PORTB
goto disp1 ;到下一位顯示
dsend movlw 20h ;動(dòng)態(tài)顯示一周期完,恢復(fù)初始數(shù)據(jù)
movwf FSR
movlw 01h
movwf ctrl
return
delay movlw 0xff
movwf T1
delay1 decfsz T1,1
goto delay1
return
start call init
movlw 01h
movwf DISP1
movlw 02h
movwf DISP2
movlw 03h
movwf DISP3
movlw 04h
movwf DISP4
agdisp call disp
goto agdisp
end
動(dòng)態(tài)掃描顯示雖然硬件簡(jiǎn)單,但因必須反復(fù)循環(huán)顯示,降低了單片機(jī)的工作效率,在一些實(shí)時(shí)性要求高的場(chǎng)合應(yīng)用受到限制。