十年專注單片機(jī)方案開發(fā)的方案公司英銳恩,分享和初學(xué)者一起學(xué)習(xí)。英銳恩現(xiàn)提供服務(wù)產(chǎn)品涉及主控芯片:8位單片機(jī)、16位單片機(jī)、32位單片機(jī)及各類運算放大器等。
以下程序:
;************************
;60秒記數(shù),RB0控制時間模式切換;RB1控制秒高/低位切換;
;RB2控制加1功能;RB4控制停止/啟動;TMR2產(chǎn)生秒信號;TMR0
;控制數(shù)碼管掃描
;************************
list p=16f877a
#include
;************************
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF
;************************
cblock 0x30
second_l ;秒低位
second_h ;秒高位
_t2count ;T2記數(shù)
time_mode ;時間模式
flag ;停止標(biāo)志
porta ;移位標(biāo)志
porta_w ;位選通標(biāo)志
fsr
_ptr ;指針
_count ;閃爍次數(shù)記數(shù)
_flag0 ;兩次閃爍間隔標(biāo)志
endc
cblock 0x70
w_temp
status_temp
fsr_temp
pclath_temp ;中斷臨時寄存器
endc
#define key0 PORTB,0
#define key1 PORTB,1
#define key2 PORTB,2
#define key4 PORTB,4 ;定義按鍵
#define _cycletime .249 ;循環(huán)時間
;*************************
org 0x000
nop
goto main
;************************
org 0x004
movwf w_temp
movf STATUS,w
clrf STATUS
movwf status_temp
movf PCLATH,w
movwf pclath_temp
movf FSR,w
movwf fsr_temp ;現(xiàn)場保護(hù)
;*************************
banksel INTCON ;中斷判斷
btfss INTCON,PEIE
goto _chkt0int
banksel PIE1
btfss PIE1,TMR2IE
goto _chkt0int
banksel PIR1
btfss PIR1,TMR2IF
goto _chkt0int
;****************************
;確定T2中斷
;****************************
banksel PORTA
pagesel $
clrf PIR1 ;清標(biāo)志
btfss time_mode,0 ;模式判斷,是否普通顯示模式
goto _flickerdis ;否,轉(zhuǎn)閃爍顯示模式
;****************************
decf _t2count,f
movf _t2count,w
skpz
goto _generaldis ;沒到1秒,轉(zhuǎn)普通顯示
movlw .25
movwf _t2count
call _addsec ;1秒處理
goto _generaldis ;1秒處理后轉(zhuǎn)普通顯示
;******************
_chkt0int ;t0中斷判斷
banksel INTCON
btfss INTCON,T0IE
goto endofint
btfss INTCON,T0IF
goto endofint ;不是則直接中斷退出
;****************************
bcf INTCON,T0IF;確定為T0中斷,先清標(biāo)志
btfss time_mode,0 ;判斷顯示模式
goto _flickerdis ; 轉(zhuǎn)閃爍顯示
goto _generaldis ;轉(zhuǎn)普通顯示
;****************************
_generaldis
clrf STATUS ;轉(zhuǎn)體0,普通顯示,C=0,IRP=0
comf porta_w,w
movwf PORTA ;低位選通
movlw second_l&0xff ;取秒低位首地址
movwf FSR
movf _ptr,w
addwf FSR,f ;確定時間單元地址
movf INDF,w
movwf fsr
call _tablepro;查表處理
movwf PORTC ;數(shù)碼顯示
btfsc porta_w,1 ;判斷2位是否移位完畢
goto bb
clrc
rlf porta_w,f ;沒有,準(zhǔn)備點亮下一位
cc incf _ptr,f ;指針指向下1時間單元
movlw 0x01
andwf _ptr,f ;保證指針在2個時間單元移動
goto endofint
bb movlw 0x01 ;兩位移位完畢,重新賦值開始新一輪顯示
movwf porta_w
goto cc
;*******************************
_flickerdis
movlw .25 ;閃爍顯示,重新賦值時間記數(shù)器
movwf _t2count
clrf STATUS ;轉(zhuǎn)體0,C=0,IRP=0
btfss _flag0,0 ;兩次閃爍的間隔次數(shù)控制標(biāo)志,1=調(diào)整位亮,0=調(diào)整位滅
goto mm ;0則調(diào)整位滅
comf porta_w,w
movwf PORTA
movlw second_l&0xff ;取秒低位首地址
movwf FSR
movf _ptr,w
addwf FSR,f
movf INDF,w
movwf fsr
call _tablepro
movwf PORTC
btfsc porta_w,1
goto bb1
clrc
rlf porta_w,f ;準(zhǔn)備點亮下一位
cc1 incf _ptr,f
movlw 0x01
andwf _ptr,f
decf _count,f ;閃爍次數(shù)
movf _count,w
skpnz
goto _judge_porta
goto endofint
bb1 movlw 0x01
movwf porta_w
goto cc1
;***********************************
_judge_porta
clrf _flag0 ;標(biāo)志位清0
movlw .100
movwf _count
mm btfss porta,0 ;判斷正在調(diào)整哪一位
goto sec_lpro ;秒低位調(diào)整
goto sec_hpro ;秒高位調(diào)整
sec_lpro
movlw b'11111101' ;低位調(diào)整,高位一直選通
movwf PORTA
movf second_h,w
LL movwf fsr
call _tablepro
movwf PORTC
decf _count,f
movf _count,w
skpz
goto endofint
movlw 0x01
xorwf _flag0,f ;標(biāo)志取反
movlw .60
movwf _count
goto endofint
sec_hpro
movlw b'11111110';高位調(diào)整
movwf PORTA
movf second_l,w
goto LL
;******************
endofint ;中斷退出
clrf STATUS
MOVF fsr_temp,w ;現(xiàn)場恢復(fù)
MOVWF FSR
movf pclath_temp,w
movwf PCLATH
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie
;************************
main
banksel TRISA
movlw 0x07
movwf ADCON1 ;轉(zhuǎn)體1,設(shè)置A口全數(shù)字通道,輸出,數(shù)碼管位控
clrf TRISA
movlw b'00010111'
movwf TRISB
clrf TRISC ;數(shù)碼管段碼輸出
movlw 0x02
movwf OPTION_REG ;TMRO分品比1:8,內(nèi)部時鐘,2MS中斷一次,B口內(nèi)部上拉
clrf STATUS ;轉(zhuǎn)體0
clrf INTCON ;清標(biāo)志
bsf INTCON,T0IE
bsf INTCON,PEIE ;T0&PEIE使能
banksel TRISA
movlw _cycletime
movwf PR2 ;設(shè)置T2循環(huán)周期
clrf PIE1
bsf PIE1,TMR2IE ;使能T2
banksel PORTA
clrf PORTB
RETLW 99H ;4
RETLW 92H ;5
RETLW 82H ;6
RETLW 0F8H ;7
RETLW 80H ;8
RETLW 98H ;9
;***************************************
end
(文源網(wǎng)絡(luò),侵刪)