專(zhuān)注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
提供新的芯片及解決方案,提升客戶(hù)產(chǎn)品競(jìng)爭(zhēng)力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)
;************************************
LIST P=16F877 ;列表偽指令
INCLUDE "P16F877.INC" ;把包含文件含入源程序
;************************************
RTCC EQU 01H
W_TEMP EQU 20H
STATUS_TEMP EQU 21H
FLAGS EQU 22H
TABADD EQU 23H
DISPBUF_L EQU 24H
DISPBUF_H EQU 25H
DISP1BUF_L EQU 26H
DISP1BUF_H EQU 27H
SOU EQU 28H
SOUH EQU 29H
TEMP1 EQU 30H
TEMP2 EQU 31H
CNT EQU 32H
;************************************
ORG 0000H
GOTO START
ORG 0008H
;-------------------------------------------------
CONVERT
MOVWF PCL ;將W寄存器內(nèi)的7段顯示碼地址放入PC
TABLE ;PC執(zhí)行新地址指令, 跳到相對(duì)的地址執(zhí)行?
RETLW 0C0H ;0 ;RETLW指令,將七段顯示碼存入W后返回
RETLW 0F9H ;1
RETLW 0A4H ;2
RETLW 0B0H ;3
RETLW 099H ;4
RETLW 092H ;5
RETLW 082H ;6
RETLW 0F8H ;7
RETLW 080H ;8
RETLW 090H ;9
;----- -----------------------------------------------
START
BANKSEL PORTC ;選擇同PORTC寄存器相同的體
CLRF PORTC ;清PORTC
MOVLW B'10000001' ;選擇:時(shí)鐘時(shí)鐘源為FOSC/8,允許ADC工作
MOVWF ADCON0 ;通道AN0,暫時(shí)不啟動(dòng)轉(zhuǎn)換過(guò)程
BANKSEL OPTION_REG ;選擇寄存器OPTION_REG的體為當(dāng)前體
CLRF TRISC ;PORTC所有管腳設(shè)為輸出(接LED)
MOVLW B'00001110' ;轉(zhuǎn)換結(jié)果左對(duì)齊,只選1個(gè)A/D通道RA0/AN0
MOVWF ADCON1 ;選擇VDD和VSS作參考源
MOVLW 01H ;設(shè)置RA0為輸入,其它為輸出
MOVWF TRISA
BANKSEL PORTC ;選中同寄存器PORTC的體為當(dāng)前體
;---------------------------------
MAIN BSF ADCON0,GO ;開(kāi)啟A/D轉(zhuǎn)換過(guò)程
CALL DELAY
WAIT
BTFSS PIR1,ADIF ;等待A/D轉(zhuǎn)換過(guò)程結(jié)束,檢測(cè)ADC中斷標(biāo)志位
GOTO WAIT ;如果沒(méi)有轉(zhuǎn)換結(jié)束,則返回循環(huán)檢測(cè)
MOVF ADRESH,W ;如果轉(zhuǎn)換完畢,則把A/D結(jié)果讀到W
MOVWF SOU
CALL SBTBCD2
SWAPF SOU,W ;顯示值高低位交換,先處理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;存入寄存器
MOVFW SOU ;顯示值低位處理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_L ;存入寄存器
SWAPF SOUH,W ;顯示值高低位交換,先處理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISP1BUF_H ;存入寄存器
MOVFW SOUH ;顯示值低位處理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISP1BUF_L ;存入寄存器
CALL DISPLAY
GOTO MAIN ;循環(huán)進(jìn)行A/D轉(zhuǎn)換
;***************************************************
DISPLAY
MOVLW 0FFH
MOVWF PORTC ;先熄滅所有數(shù)碼管以免閃爍
MOVLW 03EH
MOVWF PORTA
MOVLW TABLE
MOVWF TABADD ;將轉(zhuǎn)換表的首地址存入TABADD
MOVFW DISPBUF_L ;計(jì)數(shù)值(W)與轉(zhuǎn)換表的起始地址相加
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTC
BCF PORTA,4
CALL DELAY
BSF PORTA,4
MOVFW DISPBUF_H ;計(jì)數(shù)值(W)與轉(zhuǎn)換表的起始地址相加
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTC
BCF PORTA,5
CALL DELAY
BSF PORTA,5
MOVFW DISP1BUF_L ;計(jì)數(shù)值(W)與轉(zhuǎn)換表的起始地址相加
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTC
BCF PORTA,2
CALL DELAY
BSF PORTA,2
RETURN
;********************SBTBCD2********************
;本程序?qū)崿F(xiàn)單字節(jié)二進(jìn)制數(shù)轉(zhuǎn)化為2字節(jié)壓縮BCD碼。
;入口參數(shù):原二進(jìn)制數(shù)在SOU中。
;出口參數(shù):結(jié)果在SOUH:SOU中。
;占用資源:W,STATUS,023H,024H,025H,028H,029H,兩重堆棧。
IFNDEF SBTBCD21
#DEFINE SBTBCD21
SBTBCD2 MOVF SOU,W
MOVWF TEMP2
CLRF SOU
CLRF SOUH
BCF STATUS,C
MOVLW 8
MOVWF CNT
LOOPC RLF TEMP2,F
RLF SOU,F
RLF SOUH,F
DECFSZ CNT,F
GOTO ADJDEC
RETURN ;整個(gè)子程序結(jié)束
ADJDEC MOVLW SOU
MOVWF FSR
CALL ADJBCD ;調(diào)整SOU
MOVLW SOUH
MOVWF FSR
CALL ADJBCD ;調(diào)整SOUH
GOTO LOOPC
;********************調(diào)整BCD********************
ADJBCD MOVLW 03H
ADDWF INDF,W ;低四位加3
MOVWF TEMP1 ;暫存
BTFSC TEMP1,3 ;結(jié)果大于7,
MOVWF INDF ;則存起來(lái)
MOVLW 30H
ADDWF INDF,W ;高四位加3
MOVWF TEMP1
BTFSC TEMP1,7 ;結(jié)果大于7,
MOVWF INDF ;則存起來(lái)
RETLW 0
ENDIF
;**********************************************
DELAY MOVLW 0FFH
MOVWF 034H
LP0 NOP
NOP
NOP
NOP
NOP
DECFSZ 034H
GOTO LP0
RETURN
;---------------------------------
END ;源程序結(jié)束