之前写了一个没有中断子程序的版本,想要用中断子程序但是不清楚该怎么加,求教各位大佬TAT 按键显示1-9(简易版) ORG 0000H ; 设置程序的起始地址为0000H LJMP START ; 无条件跳转到标号START,开始执行主程序
ORG 0050H ; 程序存储地址从0050H开始 START: MOV A,#0FFH ; 将累加器A清零,用于初始化P0口 MOV P0,A ; 将累加器A的值(0FFH)输出到P0口,熄灭数码管上的所有段 MOV DPTR,#NUMTAB ; 将数据指针DPTR指向数码管段码表NUMTAB的起始地址 MOV R0,#00H ; 初始化R0寄存器,用于存储当前要显示的数字 MOV P1,#0FFH ; 将P1口的所有位设置为高电平,准备读取按键状态
LOPDSP: ; 主循环标签 MOV A, R0 ; 将当前要显示的数字(存储在R0中)加载到累加器A MOV DPTR,#NUMTAB ; 再次将数据指针DPTR指向数码管段码表NUMTAB的起始地址 MOVC A,@A+DPTR ; 根据累加器A的值(当前数字)和DPTR的地址,读取对应的数码管编码到累加器A MOV P0, A ; 将累加器A中的数码管编码输出到P0口,显示当前数字
CHECK_BUTTON: ; 检查按键标签 JB P1.0, KEY_PRESSED ; 检查P1.0是否被按下(假设低电平有效) SJMP LOPDSP ; 如果没有按键按下,跳回LOPDSP继续循环显示当前数字
KEY_PRESSED: ; 按键按下处理标签 LCALL DELAY ; 调用延时子程序,消除抖动 JB P1.0, CHECK_BUTTON ; 再次检查按键是否仍然被按下 INC R0 ; 数字加1 CJNE R0, #10, SKIP_RESET ; 如果计数器R0达到10,跳转到SKIP_RESET重置为0 MOV R0, #00H ; 重置计数器R0为0 SKIP_RESET: SJMP LOPDSP ; 跳回LOPDSP继续循环
HERE: ; 死循环标签,用于程序结束后停止 SJMP HERE ; 无限循环
DELAY: ; 延时子程序标签 MOV R1,#02H ; 设置延时计数器R1为2,用于控制延时长度 LP1: MOV R2,#0FFH ; 设置内部延时计数器R2为255 LP2: MOV R3,#0FFH ; 设置最内层延时计数器R3为255 LP3: DJNZ R3,LP3 ; 递减R3,直到为0,然后跳回LP3继续循环 DJNZ R2,LP2 ; 递减R2,直到为0,然后跳回LP2继续循环 DJNZ R1,LP1 ; 递减R1,直到为0,然后跳回LP1继续循环 RET ; 返回主程序
NUMTAB: ; 数码管段码表标签 DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H,82H,0F8H, 80H, 90H ; 共阳极数码管0-9的编码表 END ; 程序结束
使用中断(写了一部分但是不知道该怎么继续了 ORG 0000H ; 设置程序的起始地址为0000H LJMP START ORG 0003H LJMP EXINT0
ORG 0050H MAIN: MOV SP,#60 SETB IT1 CLR IE1 SETB EX1 SETB EA HERE: SJMP HERE LEDTAB: DB 00H
DELAY: ; 延时子程序标签 MOV R1,#02H; 设置延时计数器R1为2,用于控制延时长度 LP1: MOVR2,#0FFH ; 设置内部延时计数器R2为255 LP2: MOVR3,#0FFH ; 设置最内层延时计数器R3为255 LP3: DJNZR3,LP3 ; 递减R3,直到为0,然后跳回LP3继续循环 DJNZ R2,LP2; 递减R2,直到为0,然后跳回LP2继续循环 DJNZ R1,LP1; 递减R1,直到为0,然后跳回LP1继续循环 RET ; 返回主程序
EXINT0: PUSH PSW LCALL DELAY JB P3.3,EXIT 中断子程序主体 EXIT: POP PSW RET1
NUMTAB: ; 数码管段码表标签 DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H,82H,0F8H, 80H, 90H ; 共阳极数码管0-9的编码表 END ; 程序结束
|