專(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)
本例說(shuō)明動(dòng)態(tài)顯示二位數(shù)碼管的方法,其實(shí)動(dòng)態(tài)顯示數(shù)碼管是利用人眼的暫留效應(yīng),即 ;輪流讓需顯示的多個(gè)數(shù)碼管分別各顯示一段時(shí)間,有的朋友可能會(huì)問(wèn):這樣不是可以看到 ;數(shù)碼管在閃爍?不,只要你的掃描速度夠快,人眼是看不到閃爍的,也不是非常快基本上小于 ;10MS就可以了, ;程序中使用一個(gè)寄存器(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開(kāi)始顯示數(shù)字,直到99,然而又從0到99循環(huán)顯示 ;燒寫(xiě)時(shí)應(yīng)注意:配置位已經(jīng)在程序中寫(xiě)明,加載HEX文件時(shí)會(huì)自動(dòng)加載,燒寫(xiě)時(shí)不用再手動(dòng)設(shè)置配置位。 ;實(shí)驗(yàn)時(shí)請(qǐng)注意套件跳線(xiàn)選擇 ;*********************************************************** LIST P=16F84A,R=DEC ;定義器件為16F84,默認(rèn)數(shù)制為十進(jìn)制 ;----------------------------------------------------------- __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC ;沒(méi)有代碼保護(hù) ;看門(mén)狗關(guān)閉 ;上電廷時(shí)器開(kāi)啟 ;振蕩器模式為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開(kāi)始再計(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í)常數(shù),廷時(shí)時(shí)間為3*255*6+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 ;廷時(shí)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í)行新地址指令, 跳到相對(duì)的地址執(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