代码如下:
; 定义端口和常量
SEGE EQU P1 ; 数码管段码寄存器地址
DIGIT EQU P0 ; 数码管位码寄存器地址
KEY EQU P2.0 ;按键
DELAY_1S equ 50 ; 1秒延时,需要根据实际情况调整
ORG 0x0000
LJMP Main ; 程序入口
ORG 0x000B
LJMP Timer0_ISR ; 定时器0中断处理程序
ORG 0100H
TABLE: ; 共阴极数码管显示代码表
DB 0x3f , 0x06 , 0x5b, 0x4f , 0x66, 0x6d
DB 0x7d ,0x07 , 0x7f , 0x6f
;R7 ;;0启动,1:停止
; 延时函数,用于控制时序
Delay_1us:
MOV R0, #120 ; 设置循环计数器为12(根据计算得到的循环次数)
Delay_Loop:
NOP ; 每个NOP指令占用1个机器周期
DJNZ R0, Delay_Loop ; 循环12次
RET
; 主程序
Main:
;配置定时器中断=====
MOV TMOD,#01H ;方式1-16位
MOV TH0,#0FCH
MOV TL0,#18H ;1ms
SETB TR0
SETB ET0
SETB EA
MOV R0, #0 ; 变量清零
MOV R7, #0 ; 变量清零
MOV DIGIT,#0 ;关数码管
;;主循环
Loop:
; 当前值存至R0寄存器
CALL DisplayTemperature ; 显示
JNB KEY,Key_Down
JMP Loop
Key_Down:
MOV A,#0x00
MOV B,R7
CJNE A,B,_STOPED
Key_Down_Next:
CLR EA
CLR TR0
CLR ET0
JNB KEY,Key_Down_Next
MOV R7,#0x01
JMP Loop
_STOPED:
SETB TR0
SETB ET0
SETB EA
MOV R7,A
JMP Loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;相关函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 定时器0中断处理程序
Timer0_ISR:
MOV A,R0
INC A
MOV B,#99
CJNE A,B,NEXT
MOV A,#0
MOV R0,A
RETI ; 返回中断
NEXT:
MOV R0,A
RETI ; 返回中断
;
; 7段数码管显示函数
DisplayTemperature:
;;目标值
; 十位数码管显示
MOV A, #99
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR ; A存储十位数
MOV DIGIT,A
MOV SEGE, #0FEH ; 显示十位数码
MOV SEGE, #0FFH ; 关位选
; 个位数码管显示
MOV DPTR,#TABLE
MOV A, B ; B存储个位数
MOVC A,@A+DPTR ; A存储十位数
MOV DIGIT,A
MOV SEGE, #0FDH ; 显示个位数码
MOV SEGE, #0FFH ; 关位选
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 十位数码管显示
MOV A, R0;当前值
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR ; A存储十位数
MOV DIGIT,A
MOV SEGE, #0FBH ; 显示十位数码
MOV SEGE, #0FFH ; 关位选
; 个位数码管显示
MOV DPTR,#TABLE
MOV A, B ; B存储个位数
MOVC A,@A+DPTR ; A存储十位数
MOV DIGIT,A
MOV SEGE, #0F7H ; 显示个位数码
MOV SEGE, #0FFH ; 关位选
RET
END
```
使用到的资源有:IO控制、定时器0,现象为KEY可以控制计时停止,但是不能重新启动计时,也就是_STOPED处的代码在运行起来时没起作用,在此记录。