動態(tài)數碼管掃描顯示的時鐘
;使用資源:
;1,TMRO定時器。確定顯示的位,及顯示延時。
;2,TMR1定時器。秒信號產生。
;3,PORTA端口。六共陽極位數碼管的位選信號,低電平有效
;4,PORTC端口。數碼管的七段,RC7不用。
;功能說明:
;1.六位數碼管動態(tài)掃描顯示時間(格式為:HHMMSS,24小時制)。
;2.時鐘信號由單片機內部定時器硬件單元編程產生。
;本實戰(zhàn)的目的是讓大家進一步熟悉定時器的編程,多位數碼管動態(tài)掃描顯示的編程。
;硬件接法:
;1.實驗板上撥碼開關S4、S5的所有位必須置ON,其他都可以關閉。
;2.最好把93C46跟24CXX存儲器從板上取下。
;本實例原提供者:pic16論壇會員 leef728 ,在此鳴謝leef728同志共享本實例.
;程序文件名“TIME.ASM"
;程序清單如下:
;************************************
LIST P=16F877A
INCLUDE"P16F877A.INC"
ERRORLEVEL -302
;***********************************
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC;
;***************文件寄存器定義**************
CBLOCK 0X20
WAW
YIW
BAW
QIW
GEW
SHW
TEMP
COUNTER
S3
DAA
STATUS_TMP
W_TMP
ENDC
;********************程序開始****************
ORG 0000H
NOP ;復位地址
GOTO MAIN
ORG 0004H
;********************中斷處理程序***********
MOVWF W_TMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TMP ;以上4條指令為中斷現場保護
BCF INTCON,2 ;清除TMRO中斷標志位
MOVF TEMP,W ;時間存放單元的地址
MOVWF FSR
MOVF INDF,W ;取得某一位的時間值
CALL BMA ;查表得時間的顯示代碼
MOVWF PORTC ;送數碼管顯示
COMF DAA,W ;位碼取反
MOVWF PORTA ;點亮相應的數碼管
RLF DAA,F ;準備點亮下一位
INCF TEMP,F ;下一時間存放單元地址
BTFSS DAA,6 ;是否顯示完六位
GOTO RT
MOVLW 01H ;是,重新開始新一輪顯示
MOVWF DAA
MOVLW 20H ;重新獲取時間單元的地址
MOVWF TEMP
RT
SWAPF STATUS_TMP,W ;中斷現場恢復
MOVWF STATUS
SWAPF W_TMP,F
SWAPF W_TMP,W
MOVLW 0XE0 ;賦定時器初值
MOVWF TMR0
RETFIE
;*******************主程序開始****************
MAIN
BANKSEL TRISA ;選擇體1
MOVLW 00H
MOVWF TRISA ;PORTA設置為輸出
MOVWF TRISC ;PORTC設置為輸出
MOVLW 06H
MOVWF ADCON1 ;設置A口為普通數字口
BANKSEL INTCON
MOVLW 00H
MOVWF YIW
MOVWF WAW
MOVWF QIW
MOVWF BAW
MOVWF SHW
MOVWF GEW ;以上7條指令清零時間
MOVWF DAA
MOVLW 20H
MOVWF TEMP ;時間存放單元地址
BSF STATUS,RP0
MOVLW 0X05
MOVWF OPTION_REG ;分頻器給TMR0做定時用,且分頻比1:4
BCF STATUS,RP0
BSF INTCON,7 ;開啟中斷總允許位GIE
BSF INTCON,5 ;開啟TMRO中斷允許位
BCF INTCON,2 ;清除TMRO中斷標志位
MOVLW 0XE0 ;TMRO賦初值
MOVWF TMR0
CLRF DAA
INCF DAA,F ;顯示位設置
;**************************************************************
KS
CALL DELAY ;調用200ms定時程序
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY ;調用5次,剛好1s
INCF GEW,F
MOVF GEW,W ;判斷秒的個位是否夠10
XORLW .10
BTFSS STATUS,Z
GOTO KS ;是,秒的個位清0,秒的十位加1
INCF SHW,F
CLRF GEW
CLRF STATUS
MOVF SHW,W
XORLW .6 ;判斷秒的十位是否為6(1分鐘60秒)
BTFSS STATUS,Z
GOTO KS
INCF BAW,F ;是,秒的十位清0,分的個位加1
CLRF SHW
CLRF STATUS
MOVF BAW,W
XORLW .10 ;判斷分的各位是否夠10
BTFSS STATUS,Z
GOTO KS
INCF QIW,F ;是,分的個位清0,分的十位加1
CLRF BAW
CLRF STATUS
MOVF QIW,W
XORLW .6 ;判斷分的十位是否夠6(1小時60分)
BTFSS STATUS,Z
GOTO KS
INCF WAW,F ;是,分的十位清0,時的個位加1
CLRF QIW
CLRF STATUS
MOVF WAW,W
XORLW .4 ;判斷時的個位是否夠4(24小時制)
BTFSS STATUS,Z
GOTO KS
INCF YIW,F ;是,時的個位清0,時的十位加1
CLRF WAW
CLRF STATUS
MOVF YIW,W
XORLW .2 ;判斷時的十位是否夠2
BTFSS STATUS,Z
GOTO KS
CLRF GEW ;是,使時間回到00-00-00
CLRF SHW
CLRF BAW
CLRF QIW
CLRF WAW
CLRF YIW
GOTO KS ;循環(huán)顯示
;**************************200ms延時程序********************
DELAY
NOP
BANKSEL PIE1
BCF PIE1,0 ;禁止TMR1中斷
BANKSEL T1CON
MOVLW 24H ;TMR1分頻1:4
MOVWF T1CON
BCF PIR1,0
MOVLW 0X3C
MOVWF TMR1H
MOVLW 0XB0
MOVWF TMR1L ;TMR1賦初值0X3CB0
BSF T1CON,0
LOP
BTFSS PIR1,0 ;查詢是否定時時間到
GOTO LOP
RETURN
;**********************************************************
BMA
ADDWF PCL,F ;考察偏移量
RETLW 0XC0 ;"0" 編碼
RETLW 0XF9 ;"1" 編碼
RETLW 0XA4 ;"2" 編碼
RETLW 0XB0 ;"3" 編碼
RETLW 0X99 ;"4" 編碼
RETLW 0X92 ;"5" 編碼
RETLW 0X82 ;"6" 編碼
RETLW 0XF8 ;"7" 編碼
RETLW 0X80 ;"8" 編碼
RETLW 0X98 ;"9" 編碼
RETLW 0XFF
;**********************************************************
END ;源程序結束
;***********************************************************
; 進入該實戰(zhàn)演練的工序流程如下:
; 1.創(chuàng)建源文件和編輯源文件;在此介紹一種不同于前面講的創(chuàng)建源文件的方法,用Windows附件中的”記事本”
; 這個為大家所熟知和好用的文件編輯器,并且可以方便的加入中文注釋.不過有兩點需要注意,一是注釋前面的
; 分號”;”必須用西文半角輸入;二是必須用”.asm”擴展名存儲到事先建立的一個專用子目錄下.
; 2.打開MPLAB集成開發(fā)環(huán)境:首先在WINDOWS環(huán)境下,選用開始>程序>Microchip MPLAB>MPLAB命令,啟動MPLAB
; 并進入MPLAB的桌面.
; 3.創(chuàng)建項目:選用菜單File>New或Project>New Project,在事先建立的一個專用子目錄下創(chuàng)建一個新項目,將
; 用記事本創(chuàng)建的源文件加入到該項目中.
; 4.建立項目中的目標文件:選擇菜單Project >Build All(項目>建立所有文件),MPLAB將自動調用MPASM將項目
; 文件管理下的源文件(.asm)匯編成十六進制的目標文件(.hex).