tmr0 equ 01h ;定义定时器和计数器0寄存器地址
pcl equ 02h ;定义程序计数器低字节寄存器地址
status equ 03h ;定义状态寄存器地址
option_reg equ 81h ;定义选项寄存器地址
intcon equ 0bh ;定义中断寄存器地址
portd equ 08h ;定义端口D的数据寄存器的地址
trisd equ 88h ;定义端口D的方向控制寄存器地址
dly equ 20h ;定义一个外循环延时变量
dly1 equ 21h ;定义一个内循环变量延时变量
flag1 equ 22h ;定义一个左右移标志
flag2 equ 23h ;定义一个亮灭标志
w_temp equ 24h ;定义一个临时备份寄存器
portd_b equ 25h ;定义一个显示缓冲区寄存器
m equ 26h ;定义一个计数器变量
w equ 0 ;定义传送目标寄存器为W的指示位
f equ 1 ;定义传输目标寄存器为RAM的指示位
tmr0_b equ 0 ;定数器初始值
rp0 equ 5 ;在状态寄存器中的页选位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 ;点亮,即将缓冲区先送入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 ;恢复状态寄存器的体0
movlw 0a0h ;将中端控制码先送W
movwf intcon ;开放全局中断和定时器0中断
bcf intcon,t0if ;清除TMR0溢出中断标志位
movlw tmr0_b ;TMR0赋初值
movwf tmr0 ;启动TMR0定时计数器
movlw 0feh ;将驱动码送入W
movwf portd_b ;将驱动码送入显示缓冲区
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返回,循环检测
;----------------------------------右移-------------------------------------------
c1
rrf portd_b,f ;带进位循环右移指令
goto m1 ;返回计数器
;----------------------------------返回计数器--------------------------------------------
c2
goto l1 ;返回检测左右移标志位
;----------------------------左移子程序----------------------------------------
loop1
movlw 9 ;将计数器初值先送W
movwf m ;转送到M
;------------------------------------------------------------------------------
s2
decfsz m,f ;计数器减一,为0,跳一步,否,顺序执行
goto k1 ;跳到左移
goto k2 ;计数器为0返回,循环检测
;------------------------------------------------------------------------------
k1
rlf portd_b,f ;带进位循环左移
goto s2 ;返回计数器
;------------------------------------------------------------------------------
k2
goto l1 ;跳回检测左右移标志
;-----------------------------延时子程序----------------------------------------
delay
movlw 0ffh ;将外层循环参数0FF先送W
movwf dly ;再转送到DLY
;-------------------------------------------------------------------------------
lp0
movlw 0ffh ;将内层循环参数0FFH先送W
movwf dly1 ;再转送到DLY1
;-------------------------------------------------------------------------------
lp1
decfsz dly1,f ;内层循环参数DLY1自减一,若为0,跳一步
goto lp1 ;返回循环自减LP1
decf dly,f ;外层循环参数DLY自减一,若为0,跳一步
goto lp0 ;跳回循环自减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
机子就是不运行,怎么回事????????? |