專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動態(tài)
;本例說明動態(tài)顯示二位數(shù)碼管的方法,其實(shí)動態(tài)顯示數(shù)碼管是利用人眼的暫留效應(yīng),即
;輪流讓需顯示的多個數(shù)碼管分別各顯示一段時間,有的朋友可能會問:這樣不是可以看到
;數(shù)碼管在閃爍?不,只要你的掃描速度夠快,人眼是看不到閃爍的,也不是非??旎旧闲∮?/p>
;10MS就可以了,
;程序中使用一個寄存器(DIGIT)作計(jì)數(shù)器,然后將計(jì)數(shù)結(jié)果輸出顯示。
;因?yàn)閿?shù)碼管只能顯示0-9的十進(jìn)制輸出,所以計(jì)數(shù)器DIGIT需轉(zhuǎn)換成十進(jìn)制再輸出,程序中將
;涉及到將十六進(jìn)制轉(zhuǎn)成十進(jìn)制BCD碼的方法。二進(jìn)制調(diào)整為BCD碼的方法是將二進(jìn)制碼左移8次
;每次移位后都檢查低四位LSD+3是否大于7,如果是則再加3,否則不加。接著再將高四位MSD作相同處理
;本程序的功能是:程序復(fù)位后,數(shù)碼管從0開始顯示數(shù)字,直到99,然而又從0到99循環(huán)顯示
;燒寫時應(yīng)注意:配置位已經(jīng)在程序中寫明,加載HEX文件時會自動加載,燒寫時不用再手動設(shè)置配置位。
;實(shí)驗(yàn)時請注意套件跳線選擇
;*
LIST P=16F84A,R=DEC ;定義器件為16F84,默認(rèn)數(shù)制為十進(jìn)制
;—————————————————————————————-
__CONFIG B’11111111110001’;_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC
;沒有代碼保護(hù)
;看門狗關(guān)閉
;上電廷時器開啟
;振蕩器模式為XT
;——————————-
PC EQU 02H ;變量單元定義
STATUS EQU 03H
PORTA EQU 05H
PORTB EQU 06H
TRISA EQU 5H
TRISB EQU 6H
;———————————-STATUS
RP0 EQU 5
;——————————-
COUNTER EQU 10H
COUNT1 EQU 11H
COUNT2 EQU 12H
TABADD EQU 13H
DISPBUF EQU 14H ;顯示值暫存
DISPBUF_H EQU 15H ;顯示器高位
DISPBUF_L EQU 16H ;顯示器低位
BUFFER EQU 17H
BUFFER1 EQU 18H
SUM EQU 19H
DIGIT EQU 1AH ;0-99計(jì)數(shù)器
;——————————
ORG 0000H
MAIN
CLRF PORTA
CLRF PORTB ;初始化IO口
BSF STATUS,RP0 ;設(shè)置寄存器體1
MOVLW 00000000B ;將所有IO口設(shè)置為輸出
MOVWF TRISA
MOVWF TRISB
BCF STATUS,RP0 ;恢復(fù)寄存器體0
MOVLW 0FFH ;先讓數(shù)碼管全部不顯示
MOVWF PORTB
CLRF DIGIT ;顯示計(jì)數(shù)器清0
CLRF DISPBUF ;清顯示值
LOOP1
MOVLW 22
MOVWF COUNTER ;計(jì)數(shù)器0.2秒鐘加1 22*9.2MS=0.2s
LOOP1_1
CALL DISP ;調(diào)用顯示子程序
DECFSZ COUNTER,1 ;顯示0.2秒鐘
GOTO LOOP1_1
INCF DIGIT,1 ;計(jì)數(shù)器加1
MOVLW 8
MOVWF COUNTER ;循環(huán)左移計(jì)數(shù)器置8
CLRF BUFFER ;清除緩沖器
MOVF DIGIT,W
MOVWF BUFFER1
LOOP2
RLF BUFFER1,1 ;二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼(以便顯示)
RLF BUFFER,1
DECFSZ COUNTER,1 ;左移8次
GOTO ADJUST ;
MOVFW BUFFER
MOVWF DISPBUF ;是否有進(jìn)位(即已達(dá)100),如已計(jì)數(shù)到100則
SKPC ;從0開始再計(jì)數(shù)顯示(顯示00~99)
GOTO LOOP1
GOTO MAIN
ADJUST
MOVLW 3 ;二進(jìn)制轉(zhuǎn)BCD的調(diào)整
ADDWF BUFFER,W ;每次移位后都檢查低四位LSD+3是否大于7
MOVWF SUM
BTFSC SUM,3
MOVWF BUFFER
MOVLW 30H
ADDWF BUFFER,W ;如果是則再加3,否則不加。
MOVWF SUM
BTFSC SUM,7
MOVWF BUFFER ;接著再將高四位MSD作相同處理
GOTO LOOP2
;- ————————————————————-
DELAY ;顯示廷時常數(shù),廷時時間為32556+6us+4us=4.6ms
MOVLW 6
MOVWF COUNT1
L2
MOVLW 255
MOVWF COUNT2
L3
DECFSZ COUNT2,1
GOTO L3
DECFSZ COUNT1,1
GOTO L2
RETLW 0
;—————————— —————————————————
DISP
SWAPF DISPBUF,W ;顯示值高低位交換,先處理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;存入寄存器
MOVFW DISPBUF ;顯示值低位處理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_L ;存入寄存器
MOVLW 0FFH
MOVWF PORTB ;先熄滅數(shù)碼管以免閃爍
BSF PORTA,1
BCF PORTA,2 ;先顯示低位
MOVLW TABLE
MOVWF TABADD ;將轉(zhuǎn)換表的首地址存入TABADD
MOVFW DISPBUF_L ;計(jì)數(shù)值(W)與轉(zhuǎn)換表的起始地址相加
ADDWF TABADD,W
CALL CONVERT ;存入W后調(diào)用轉(zhuǎn)換表子程序
MOVWF PORTB ;送RB口顯示
CALL DELAY ;廷時4。7MS
MOVLW 0FFH ;同樣方法顯示高位
MOVWF PORTB
BSF PORTA,2
BCF PORTA,1
MOVLW TABLE
MOVWF TABADD
MOVFW DISPBUF_H
ADDWF TABADD,W
CALL CONVERT
MOVWF PORTB
CALL DELAY
RETLW 0
;———————————————————————————-
CONVERT
MOVWF PC ;將W寄存器內(nèi)的7段顯示碼地址放入PC
TABLE ;PC執(zhí)行新地址指令, 跳到相對的地址執(zhí)行?
RETLW 081H ;0 ;RETLW指令,將七段顯示碼存入W后返回
RETLW 0E7H ;1
RETLW 092H ;2
RETLW 0A2H ;3
RETLW 0E4H ;4
RETLW 0A8H ;5
RETLW 088H ;6
RETLW 0E3H ;7
RETLW 080H ;8
RETLW 0A0H ;9
;——- ———————————————————————-
END