1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| ORG 0000H LJMP MAIN ORG 000BH ;T0中断入口 LJMP T0_INT
MAIN: ;初始化 MOV DPTR, #TAB ;将TAB所代表的地址送入DPTR MOV TMOD, #01H ;设置T0为方式1计时 MOV IE, #82H ;打开EA和ET0(外部中断0) MOV R2, #1
LP1: MOV R3, #2 MOV R4, #10 MOV R5, #10
LP2:CLR TR0 ;计数运行控制位
M_LOOP: CALL DISP ;调用显示 JNB P3.1, KK ;检测到按键则转移 SJMP M_LOOP ;循环
KK: CALL DISP ;延时 JB P3.1, M_LOOP ;消抖(为1则转移)
K1: CALL DISP JNB P3.1, K1 ;等待释放 DJNZ R2, K2 ;按键次数(不为0则转移K2) MOV R2, #3 SETB TR0 ;启动 SJMP M_LOOP K2: CJNE R2, #1, LP2 ;暂停(R2与1不等则转LP2) SJMP LP1 ;清零
DISP: ;显示 MOV P2, #07H ;000 001 11(毫秒位) MOV A, R4 MOVC A, @A + DPTR ;查表指令 MOV P0, A CALL DELAY MOV P2, #0BH ;000 010 11(秒位) MOV A, R5 MOVC A, @A + DPTR SETB ACC.7 ;小数点 MOV P0, A CALL DELAY
CJNE R5,#1,LAST_ST ;不相等则转移 CJNE R4,#1,LAST_ST CLR TR0 MOV R2, #2 RET
TAB: DB 0, 6FH, 7FH, 07H, 7DH, 6DH, 66H, 4FH, 5BH, 06H, 3FH ;定义变量,每读完一个,偏移量+1
DELAY: DJNZ R7, $ DJNZ R7, $ RET
T0_INT: ;50ms中断一次 MOV TH0, #(65536 - 50000) / 256 ;晶振为12MHz的50ms定时器初值 MOV TL0, #(65536 - 50000) MOD 256 DJNZ R3, EE MOV R3, #2 DJNZ R4, EE ;修改各个时间变量 MOV R4, #10 DJNZ R5, EE MOV R5, #10 EE: RETI ;尽快退出中断程序
LAST_ST: RET END
|