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