📄 blinky.asm
字号:
$INCLUDE(C8051F020.INC) ;SFR寄存器声明
COUNT DATA 07FH ;定时器3中断中用到的计数变量
I DATA 07EH ;定时器3中断中用到的计数变量
J DATA 07DH ;定时器3中断中用到的计数变量
LED DATA 07CH ;P2口控制输出的变量
ORG 0000H
JMP MAIN ;跳转到主程序
ORG 0073H ;定时器T3的中断服务程序
LJMP T3INTR ;跳转到中断服务程序地址处执行
ORG 0100H
MAIN: ;主程序
MOV WDTCN,#0DEH ;禁用看门狗定时器
MOV WDTCN,#0ADH
LCALL PORT_INIT ;端口初始化
LCALL TIMER3_INIT ;定时器3初始化
SETB EA ;开中断
MOV COUNT, #05H ;COUNT的初值为0
MOV I,#09H ;I的初值为9
MOV J,#00H ;J的初值为0
MOV LED,#0FFH ;LED的初值为0FFH
LOOP: ;在此处循环等待定时器3中断
SJMP LOOP
T3INTR: ;定时器3中断服务程序
PUSH ACC ;累加器ACC入栈
ANL TMR3CN,#07FH
DJNZ COUNT,RETURN ;COUNT减一不为零直接中断返回
MOV COUNT,#05H ;COUNT装入初值
MOV A,LED ;LED输出给P3
MOV P3,A
MOV DPTR,#P2LED ;表格位置
MOV A,J
MOVC A,@A+DPTR ;查表
MOV P2,A ;查表得到的值输出给P2
MOV A,LED ;LED左移1位
RL A
ANL A,#0FEH
MOV LED,A
INC J ;判断J是否加到了8
MOV A,J
CJNE A,#08H,NOZEROJ
MOV J,#00H ;J如果到了8就重新归为0
NOZEROJ:
DJNZ I,RETURN ;I自减1,判断I是否减到0
MOV I,#09H ;I重新赋值为9
MOV LED,#0FFH ;LED重新赋值为0FFH
RETURN:
POP ACC ;累加器ACC出栈
RETI ;中断返回
PORT_INIT: ;端口初始化程序
MOV XBR2,#40H ;端口配置寄存器,使能交叉开关和
;输入输出端口弱上拉
RET
TIMER3_INIT: ;定时器3初始化程序
MOV TMR3CN,#0 ;停止定时器3,清零TF3,使用系统时钟
;的12分频(SYSCLK/12)作为时间基准
MOV TMR3RLL,#0E5H ;定时器初始化重新装入的值
MOV TMR3RLH,#0BEH
;MOV TMR3L,#0FFH ;设置为立即重新装入定时器初值
;MOV TMR3H,#0FFH
ORL EIE2,#01H ;使能定时器3中断
ORL TMR3CN,#04H ;启动定时器3
RET
;P2口控制输出的值的表格
P2LED:DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -