PIC系列單片機(jī)程序設(shè)計(jì)基礎(chǔ)一 1、程序的基本格式 先介紹二條偽指令: EQU ——標(biāo)號賦值偽指令 ORG ——地址定義偽指令 PIC16C5X在RESET后指令計(jì)算器PC被置為全“1”,所以PIC16C5X幾種型號芯片的復(fù)位地址為: PIC16C54/55:1FFH PIC16C56:3FFH PIC16C57/58:7FFH 一般來說,PIC的源程序并沒有要求統(tǒng)一的格式,大家可以根據(jù)自己的風(fēng)格來編寫。但這里我們推 薦一種清晰明了的格式供參考。 TITLE This is …… ;程序標(biāo)題 ;-------------------------------------- ;名稱定義和變量定義 ;-------------------------------------- F0 EQU 0 RTCC EQU 1 PC EQU 2 STATUS EQU 3 FSR EQU 4 RA EQU 5 RB EQU 6 RC EQU 7 ┋ PIC16C54 EQU 1FFH ;芯片復(fù)位地址 PIC16C56 EQU 3FFH PIC16C57 EQU 7FFH ;----------------------------------------- ORG PIC16C54 GOTO MAIN ;在復(fù)位地址處轉(zhuǎn)入主程序 ORG 0 ;在0000H開始存放程序 ;----------------------------------------- ;子程序區(qū) ;----------------------------------------- DELAY MOVLW 255 ┋ RETLW 0 ;------------------------------------------ ;主程序區(qū) ;------------------------------------------ MAIN MOVLW B‘00000000’ TRIS RB ;RB已由偽指令定義為6,即B口 ┋ LOOP BSF RB,7 CALL DELAY BCF RB,7 CALL DELAY ┋ GOTO LOOP ;------------------------------------------- END ;程序結(jié)束 注:MAIN標(biāo)號一定要處在0頁面內(nèi)。 2、程序設(shè)計(jì)基礎(chǔ) 1) 設(shè)置 I/O 口的輸入/輸出方向 PIC16C5X的I/O 口皆為雙向可編程,即每一根I/O 端線都可分別單獨(dú)地由程序設(shè)置為輸入或輸出。這個過程由寫I/O 控制寄存器TRIS f來實(shí)現(xiàn),寫入值為“1”,則為輸入;寫入值為“0”,則為輸出。 MOVLW 0FH ;0000 1111(0FH) 輸入 輸出 TRIS 6 ;將W中的0FH寫入B口控制器, ;B口高4位為輸出,低4位為輸入。 MOVLW 0C0H ; 11 000000(0C0H) RB4,RB5輸出0 RB6,RB7輸出1 2) 檢查寄存器是否為零 如果要判斷一個寄存器內(nèi)容是否為零,很簡單,現(xiàn)以寄存器F10為例: MOVF 10,1 ;F10→F10,結(jié)果影響零標(biāo)記狀態(tài)位Z BTFSS STATUS,Z ;F10為零則跳 GOTO NZ ;Z=0即F10不為零轉(zhuǎn)入標(biāo)號NZ處程序 ┋ ;Z=1即F10=0處理程序 3) 比較二個寄存器的大小 要比較二個寄存器的大小,可以將它們做減法運(yùn)算,然后根據(jù)狀態(tài)位C來判斷。注意,相減的結(jié)果放入W,則不會影響二寄存器原有的值。 例如F8和F9二個寄存器要比較大小: MOVF 8,0 ;F8→W SUBWF 9,0 ;F9—W(F8)→W BTFSC STATUS,Z ;判斷F8=F9否 GOTO F8=F9 BTFSC STATUS,C ;C=0則跳 GOTO F9>F8 ;C=1相減結(jié)果為正,F9>F8 GOTO F9< F9 ;C=0相減結(jié)果為負(fù),F9 ┋ 4) 循環(huán)n次的程序 如果要使某段程序循環(huán)執(zhí)行n次,可以用一個寄存器作計(jì)數(shù)器。下例以F10做計(jì)數(shù)器,使程序循環(huán)8次。 COUNT EQU 10 ;定義F10名稱為COUNT(計(jì)數(shù)器) ┋ MOVLW 8 MOVWF COUNT LOOP ;循環(huán)體 LOOP ┋ DECFSZ COUNT,1 ;COUNT減1,結(jié)果為零則跳 GOTO LOOP ;結(jié)果不為零,繼續(xù)循環(huán) ┋ ;結(jié)果為零,跳出循環(huán) 5)“IF……THEN……”格式的程序 下面以“IF X=Y THEN GOTO NEXT”格式為例。 MOVF X,0 ;X→W SUBWF Y,0 ;Y—W(X)→W BTFSC STATUS,Z ;X=Y 否 GOTO NEXT ;X=Y,跳到NEXT去執(zhí)行。 ┋ ;X≠Y 6)“FOR……NEXT”格式的程序 “FOR……NEXT”程序使循環(huán)在某個范圍內(nèi)進(jìn)行。下例是“FOR X=0 TO 5”格式的程序。F10放X的初值,F11放X的終值。 START EQU 10 DAEND EQU 11 ┋ MOVLW 0 MOVWF START ; 0→START(F10) MOVLW 5 MOVWF DAEND ;5→DAEND(F11) LOOP ┋ INCF START,1 ;START值加1 MOVF START,0 SUBWF DAEND,0 ;START=DAEND ?(X=5否) BTFSS STATUS,Z GOTO LOOP ;X<5,繼續(xù)循環(huán) ┋ ;X=5,結(jié)束循環(huán) 7)“DO WHILE……END”格式的程序 “DO WHILE……END”程序是在符合條件下執(zhí)行循環(huán)。下例是“DO WHILE X=1”格式的程序。F10放X的值。 X EQU 10 ┋ MOVLW 1 MOVWF X ;1→X(F10),作為初值 LOOP ┋ MOVLW 1 SUBWF X,0 BTFSS STATUS,Z ;X=1否? GOTO LOOP ;X=1繼續(xù)循環(huán) ┋ ;X≠1跳出循環(huán) 8) 查表程序 查表是程序中經(jīng)常用到的一種操作。下例是將十進(jìn)制0~9轉(zhuǎn)換成7段LED數(shù)字顯示值。 設(shè)LED為共陽,則0~9數(shù)字對應(yīng)的線段值如下表:
|