;脚功能定义
SMG_q EQU P1.0 ;定义数码管阳级控制脚,千位
SMG_b EQU P1.1 ;定义数码管阳级控制脚,百位
SMG_s EQU P1.2 ;定义数码管阳级控制脚,十位
SMG_g EQU P1.3 ;定义数码管阳级控制脚,个位
KEY1 EQU P3.7 ;定义按键1
KEY2 EQU P3.6 ;定义按键2
;定义数据RAM空间
LMS EQU 37H ;定义一个变量存放计数值毫秒
LMIAO EQU 38H ;定义一个变量存放计数值秒
;数据存放
ORG 0100
TABLE: DB 0C0h,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H
;表:共阳数码管 0-9
ORG 0000H
LJMP MAIN
ORG 000BH ;中断入口
LJMP TIMER
ORG 0200H
MAIN: MOV TMOD,#01H ;设置定时器1为1模式,即16位计算模式
MOV TH0,#0D8H ;给计数寄存器赋值,10毫秒时间
MOV TL0,#0F0H
MOV IE,#82H ;开总中断和T0中断
CLR TR0 ;
CLR A
MOV LMS,A ;计数缓冲清0
MOV LMIAO,A
M01: JB KEY1,M02 ;按下1键启动计数
CLR A
MOV LMS,A
MOV LMIAO,A ;
SETB TR0 ;
SJMP M1
M02: JB KEY2,M1 ;按下2键停止计数
CLR TR0 ;
M1: MOV A,LMS
CJNE A,#100,M2 ;以10毫秒计数,100次即为1秒
MOV LMS,#0
MOV A,LMIAO ;
INC A
MOV LMIAO,A ;
CJNE A,#100,M2 ;如果加到100秒,则清0
MOV LMIAO,#0
M2: LCALL DISPLAY ;显示
LJMP M01
TIMER: INC LMS ;定时中断产生,以10毫秒计数加1
MOV TH0,#0D8H ;重新装入定时器值10毫秒
MOV TL0,#0F0H
RETI
DISPLAY:MOV DPTR,#TABLE ;数码管显示子程序
MOV A,LMIAO ;
MOV B,#10
DIV AB
CLR SMG_q ;千位数码管
MOVC A,@A+DPTR ;
MOV P0,A
LCALL DELAY ;
MOV P0,#0FFH ;
SETB SMG_q ;
CLR SMG_b ;百位数码管
MOV A,B ;
MOVC A,@A+DPTR ;
ANL A,#0X7F ;加入小数点
MOV P0,A
LCALL DELAY ;
MOV P0,#0FFH ;
SETB SMG_b ;
MOV A,LMS ;
MOV B,#10
DIV AB
CLR SMG_s ;十位数码管
MOVC A,@A+DPTR ;
MOV P0,A
LCALL DELAY ;
MOV P0,#0FFH ;
SETB SMG_s ;
CLR SMG_g ;个位数码管
MOV A,B ;
MOVC A,@A+DPTR ;
MOV P0,A
LCALL DELAY ;
MOV P0,#0FFH ;
SETB SMG_g ;
RET
DELAY: MOV R7,#10 ;延时子程序
DJNZ R7,$
RET
END
|