📄 ch10_t3.asm
字号:
;PROGRAM NAME IOTEST3.ASM
;本程序请最好烧录成ROM后再做测试
;
BUFFER EQU 8200H
T0COUNT EQU 922 ;1ms IN XTAL=11.0592MHz
;
ORG 0000H
LJMP START ;主程序进入点
;
ORG 000BH
LJMP TF0ISR ;TIMER0溢位中断进入点
;
START MOV SP,#60H
LCALL DELAY
;
LCALL INIT_8255 ;8255输入/输出初始设置
LCALL INIT_TIMER ;定时器设置
LCALL ENABLE_INT ;系统中断允许设置
LCALL COUNT_CLEAR ;近接开关用定时器归零
;MAINLOOP主循环其实还可以做很多其他事情
$1 MOV DPTR,#PPICTL1 ;主循环让在PC0的LED一下子亮一下子灭
MOV A,#00H ;本指令送到8255时可使PC0=0
MOVX @DPTR,A
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV DPTR,#PPICTL1
MOV A,#01H ;本指令送到8255时可使PC0=1
MOVX @DPTR,A
LCALL DELAY
LCALL DELAY
LCALL DELAY
SJMP $1 ;等待中断
;
;ISR中断服务程序由此开始,程序首先重新设置THO与TL0计数值
TF0ISR
MOV TH0,#(65536-T0COUNT)/256;COUNT RELOAD
MOV TL0,#(65536-T0COUNT).MOD.256;COUNT RELOAD
PUSH PSW ;重要寄存器事先存入堆栈中
PUSH A
PUSH DPL
PUSH DPH
LCALL IO_TEST ;调用近接开关检查程序
POP DPH ;取回原先存入的寄存器值
POP DPL
POP A
POP PSW
PETI ;ISP结束回原中断点
;
IO_TEST
MOV DPTR,#PPIPC2
MOVX A,@DPTR
JB ACC.4,NO_SENSOR
MOV A,#0FH ;SET PC7=1
MOV DPTR,#PPICTL1
MOVX @DPTR,A
LCALL COUNT_INC
SJMP NEXT
NO_SENSOR
MOV A,#0EH ;RESET PC7=0
MOV DPTR,#PPICTL1
MOVX @DPTR,A
LCALL COUNT_CLEAR
NEXT RET
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -