中断结束返回到哪里了

中断结束返回到哪里了,第1张

中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。cpu中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,结束后再返回到原被中止的程序处(断点)继续执行程序执行被"中断的事件。

修改如下,要把中断服务子程序与主程序分开

K1 BIT P1.0 秒按键设定

K2 BIT P1.1 分按键设定

K3 BIT P1.2 小时控设定

SECOND EQU 30H 定义秒为30H

MIN EQU 31H 定义分为31H

HOUR EQU 32H 定义时为32H

ORG 00H

SJMP START

ORG 0BH

LJMP TIMER

ORG 0040H

START: 开始

MOV DPTR,#TABLE 显示初始值

MOV HOUR,#0 时清零

MOV MIN,#0 分清零

MOV SECOND,#0 秒清零

MOV R6,#0 初始脉冲清零

MOV TMOD,#01H 定时器工作方式1

MOV TH0,#(65536-50000)/256 定时50毫秒

MOV TL0,#(65536-50000)/256

MOV IE,#82H

SETB TR0

KEY: 秒、分、时的按键设置

JNB K1,ADD_SECOND 按一下,秒加1

JNB K2,ADD_MIN 按一下,分加1

JNB K3,ADD_HOUR 按一下,时加1

LJMP KEY若无按键按下,返回按键设置KEY

ADD_SECOND: 秒按键,子程序

LCALL DELAY 延时子程序,去抖动

JB K1,KEY 若K1=1,则跳转到KEY

INC SECOND 秒值加1

MOV A,SECOND 秒的值传入A

CJNE A,#60,J0 判断是否加到60秒

MOV SECOND,#0 秒清零

LJMP MIN 跳转到分

ADD_MIN: 分按键,子程序

LCALL DELAY 延时子程序,去抖动

JB K2,KEY 若K2=1,则跳转到KEY

INC MIN 分钟值加1

MOV A,MIN

CJNE A,#60,J1 判断是否加到60分

MOV MIN,#0 分清零

LJMP HOUR 跳转到小时

ADD_HOUR: 时按键,子程序

LCALL DELAY 延时子程序,去抖动

JB K3,KEY 若K3=1,则跳转到KEY

INC HOUR 小时值加1

MOV A,HOUR

CJNE A,#24,J2 判断是否加到24小时

MOV HOUR,#0 时清零

MOV MIN,#0 分清零

MOV SECOND,#0 秒清零

LJMP KEY

J0: 等待按键抬起

JB K1,KEY

SJMP J0

J1:JB K2,KEY

SJMP J1

J2:JB K3,KEY

MOV A,SECOND 把秒的当前计时传入A

MOV B,#10 把数字10传送到B

DIV AB A除以B,高位为十位,低位为个位

CLR P3.6 秒十位

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P3.6 显示秒十位

MOV A,B

CLR P3.7 秒个位

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P3.7 显示秒个位

MOV A,MIN

MOV B,#10

DIV AB

CLR P3.3 分十位

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P3.3 显示分十位

MOV A,B

CLR P3.4 分个位

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P3.4 显示分个位

MOV A,HOUR

MOV B,#10

DIV AB

CLR P3.0 时十位

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P3.0 显示时十位

MOV A,B 时个位

CLR P3.1

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P3.1 显示时个位

RET

TABLE: DB 3FH,06H,5BH,4FH,66H

DB 6DH,7DH,07H,7FH,6FH

DELAY: MOV R7,#250

DJNZ R7,$

RET

ORG 1000H;(如果程序存储器为4KB,就改成 ORG 0E00H)

TIMER: 定时器中断服务程序

MOV TH0,#(65536-50000)/256 初脉冲50ms

MOV TL0,#(65536-50000)/256

INC R6 脉冲加1

MOV A,R6

CJNE A,#20,EXIT 脉冲计满20次

INC SECOND 秒加1

MOV R6,#0 脉冲清零

MOV A,SECOND

CJNE A,#60,EXIT 秒满60,返回显示

INC MIN 分加1

MOV SECOND,#0 秒清零

MOV A,MIN

CJNE A,#60,EXIT 分满60,返回显示

INC HOUR 时加1

MOV MIN,#0 分清零

MOV A,HOUR

CJNE A,#24,EXIT 时满24,返回显示

MOV HOUR,#0 时清零

MOV MIN,#0 分清零

MOV SECOND,#0 秒清零

MOV R6,#0 脉冲清零

EXIT:RETI

END

.

RET是普通子程序的返回指令,RET是普通子程序的最后1条指令,它使程序从子程序转到调用该子程序指令LCALL/ACALL的下1条指令执行。

RETI是中断服务子程序的返回指令,RETI是中断服务子程序的最后1条指令,它使程序从中断服务子程序转到中断点继续运行。

RETI指令除了执行返回功能外,还清除内部相应的中断状态寄存器(该状态寄存器由CPU响应中断时置位,宣告CPU当前正在执行中断服务程序),因此中断服务子程序必须用RETI结束,

CPU执行RETI指令后,必须至少再执行一条其它指令才能响应新的中断。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11727562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存