|
tmr0 equ 01h ;定義定時(shí)器和計(jì)數(shù)器0寄存器地址
pcl equ 02h ;定義程序計(jì)數(shù)器低字節(jié)寄存器地址
status equ 03h ;定義狀態(tài)寄存器地址
option_reg equ 81h ;定義選項(xiàng)寄存器地址
intcon equ 0bh ;定義中斷寄存器地址
portd equ 08h ;定義端口D的數(shù)據(jù)寄存器的地址
trisd equ 88h ;定義端口D的方向控制寄存器地址
dly equ 20h ;定義一個(gè)外循環(huán)延時(shí)變量
dly1 equ 21h ;定義一個(gè)內(nèi)循環(huán)變量延時(shí)變量
flag1 equ 22h ;定義一個(gè)左右移標(biāo)志
flag2 equ 23h ;定義一個(gè)亮滅標(biāo)志
w_temp equ 24h ;定義一個(gè)臨時(shí)備份寄存器
portd_b equ 25h ;定義一個(gè)顯示緩沖區(qū)寄存器
m equ 26h ;定義一個(gè)計(jì)數(shù)器變量
w equ 0 ;定義傳送目標(biāo)寄存器為W的指示位
f equ 1 ;定義傳輸目標(biāo)寄存器為RAM的指示位
tmr0_b equ 0 ;定數(shù)器初始值
rp0 equ 5 ;在狀態(tài)寄存器中的頁(yè)選位0
t0if equ 2 ;定義TMR0的中斷標(biāo)志位
;-------------------------------復(fù)位向量-------------------------------------
org 000h ;設(shè)置復(fù)位矢量
nop ;放置一條ICD必須的空操作
goto main ;跳轉(zhuǎn)到主程序
;-----------------------中斷向量和中斷服務(wù)程序-------------------------------
org 004h ;
tmr0serv ;中斷服務(wù)子程序
movwf w_temp ;復(fù)制W到他的臨時(shí)備份寄存器W—temp中
bcf intcon,t0if ;清除TMR0溢出中斷標(biāo)志位
incf flag2,f ;亮滅標(biāo)志位(寄存器)反轉(zhuǎn)
btfss flag2,0 ;標(biāo)志位=1?是!跳一步到熄滅“
goto jump ;否!跳到”點(diǎn)亮“
goto jump1 ;熄滅
;----------------------------熄滅-------------------------------------------
jump ;
movlw portd_b ;點(diǎn)亮,即將緩沖區(qū)先送入W
movwf portd ;再由W轉(zhuǎn)入端口D寄存器,送顯
;-----------------------------點(diǎn)亮----------------------------------------------
jump1 ;
movlw 0ffh ;將立即數(shù)0FFH先送到W
movlw portd ;熄滅
movlw tmr0_b ;TMR0賦初值
movwf tmr0 ;啟動(dòng)定時(shí)器
movf w_temp,w ;恢復(fù)現(xiàn)場(chǎng)
retfie ;中斷返回
;-------------------------------主程序---------------------------------------
main
bcf status,rp0 ;設(shè)置文件寄存器的體1
movlw 00h ;將端口D的方向控制碼00H先送到W
movwf trisd ;轉(zhuǎn)送到方向寄存器,端口D設(shè)為輸出
movlw 07h ;設(shè)定選項(xiàng)寄存器內(nèi)容,分頻器給TMR0
movwf option_reg ;分頻比為1:256
bcf status,rp0 ;恢復(fù)狀態(tài)寄存器的體0
movlw 0a0h ;將中端控制碼先送W
movwf intcon ;開(kāi)放全局中斷和定時(shí)器0中斷
bcf intcon,t0if ;清除TMR0溢出中斷標(biāo)志位
movlw tmr0_b ;TMR0賦初值
movwf tmr0 ;啟動(dòng)TMR0定時(shí)計(jì)數(shù)器
movlw 0feh ;將驅(qū)動(dòng)碼送入W
movwf portd_b ;將驅(qū)動(dòng)碼送入顯示緩沖區(qū)
call delay ;延時(shí)子程序
clrf flag1 ;清零標(biāo)志位
;-----------------------------------------------------------------------------
l1
movlw 01h ;將立即數(shù)01H先送W
xorwf flag1,f ;和FLAG2相或,標(biāo)志位取反
btfss flag1,0 ;測(cè)試標(biāo)志位=1,是跳到左移。否!跳到右移
goto loop ;否!右移
goto loop1 ;是!跳到左移
;---------------------------右移子程序-----------------------------------------
loop
movlw 09 ;將計(jì)數(shù)初值送W
movwf m ;再轉(zhuǎn)送到M
;------------------------------------------------------------------------------
m1
decfsz m,f ;計(jì)數(shù)器減一,為0,跳一步。不為0,右移
goto c1 ;跳到C1(右移)
goto c2 ;計(jì)數(shù)器為0返回,循環(huán)檢測(cè)
;----------------------------------右移-------------------------------------------
c1
rrf portd_b,f ;帶進(jìn)位循環(huán)右移指令
goto m1 ;返回計(jì)數(shù)器
;----------------------------------返回計(jì)數(shù)器--------------------------------------------
c2
goto l1 ;返回檢測(cè)左右移標(biāo)志位
;----------------------------左移子程序----------------------------------------
loop1
movlw 9 ;將計(jì)數(shù)器初值先送W
movwf m ;轉(zhuǎn)送到M
;------------------------------------------------------------------------------
s2
decfsz m,f ;計(jì)數(shù)器減一,為0,跳一步,否,順序執(zhí)行
goto k1 ;跳到左移
goto k2 ;計(jì)數(shù)器為0返回,循環(huán)檢測(cè)
;------------------------------------------------------------------------------
k1
rlf portd_b,f ;帶進(jìn)位循環(huán)左移
goto s2 ;返回計(jì)數(shù)器
;------------------------------------------------------------------------------
k2
goto l1 ;跳回檢測(cè)左右移標(biāo)志
;-----------------------------延時(shí)子程序----------------------------------------
delay
movlw 0ffh ;將外層循環(huán)參數(shù)0FF先送W
movwf dly ;再轉(zhuǎn)送到DLY
;-------------------------------------------------------------------------------
lp0
movlw 0ffh ;將內(nèi)層循環(huán)參數(shù)0FFH先送W
movwf dly1 ;再轉(zhuǎn)送到DLY1
;-------------------------------------------------------------------------------
lp1
decfsz dly1,f ;內(nèi)層循環(huán)參數(shù)DLY1自減一,若為0,跳一步
goto lp1 ;返回循環(huán)自減LP1
decf dly,f ;外層循環(huán)參數(shù)DLY自減一,若為0,跳一步
goto lp0 ;跳回循環(huán)自減LP0
return ;返回主程序
end ;源程序結(jié)束
我從寫(xiě)了一下
配置位設(shè)置
FOSC=HS OSCILLATOR
WDTE=DISABLE
PWRTE=DISABLE
BORETN=DISABLE
LVP=HV ON MCLR MUST BE USED
CPD=OFF
WRT=OFF
CP=OFF
機(jī)子就是不運(yùn)行,怎么回事????????? |
|