📄 clock.asm
字号:
;***********************************************************
;时钟程序
;K5键:模式选择, K6键:时间设定
;
;programing:corf
;***********************************************************
DIS_BUF EQU 40H ;数码管显存
LED_DATA EQU P0 ;数码管数据口
SEC EQU 30H ;秒
MIN EQU 31H ;分
HOU EQU 32H ;时
BLINK BIT 07H
;***********************************************************
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_EX0
ORG 000BH
AJMP INT_T0
ORG 0013H
AJMP INT_EX1
ORG 001BH
AJMP INT_T1
ORG 50H
;************************************************************
;主程序
;************************************************************
MAIN:
MOV SP,#60H ;初始化堆栈
MOV TMOD,#11H ;写控制字,T0工作方式一
MOV TH0,#0DCH ;设定计数初始值
MOV TL0,#00H
SETB TR0 ;启动T0
MOV TH1,#0DCH ;设定计数初始值
MOV TL1,#00H
SETB TR1 ;启动T1
SETB ET0 ;允许T0中断
SETB ET1
SETB EA ;开总中断
SETB EX0 ;开int0
SETB IT0 ;边沿触发
SETB EX1
SETB IT1
MOV P0,#0FFH
MOV P2,#0FFH ;初始化端口
MOV R5,#100 ;100*10MS=1S
MOV R3,#25
MOV R4,#0 ;默认工作在模式0
MOV R0,#DIS_BUF
MOV SEC,#0 ;清零
MOV MIN,#0
MOV HOU,#0
SETB BLINK
DIS_CLR: ;初始化显存
MOV @R0,#00H
INC R0
CJNE R0,#DIS_BUF+8,DIS_CLR
MOV DIS_BUF+2,#0AH ;0AH代表显示横杠
MOV DIS_BUF+5,#0AH
LOOP:
ACALL CONVT ;数据转换
ACALL DISPLAY
AJMP LOOP
;**********************************************************
;数据转换
;**********************************************************
CONVT:
MOV A,SEC
MOV B,#10
DIV AB
MOV DIS_BUF,B
MOV DIS_BUF+1,A
MOV A,MIN
MOV B,#10
DIV AB
MOV DIS_BUF+3,B
MOV DIS_BUF+4,A
MOV A,HOU
MOV B,#10
DIV AB
MOV DIS_BUF+6,B
MOV DIS_BUF+7,A
RET
;************************************************************
; 数码管 显示
;************************************************************
DISPLAY:
MOV R0,#DIS_BUF ;获得显存单元首地址
MOV R1,#0FEH ;从第一个数码管开始
MOV R2,#08 ;共显示8位数码管
DISP1:
MOV A,@R0 ;获得当前位地址
MOV DPTR,#TAB_NU ;获得表头
MOVC A,@A+DPTR ;查表获得显示数据
MOV LED_DATA,A ;送段码
MOV C,BLINK
MOV A,#0
JC DISP2
MOV A,R4
MOV DPTR,#TAB_B
MOVC A,@A+DPTR
DISP2:
ORL A,R1
MOV P2,A
MOV A,R1 ;准备下一位的位码
RL A
MOV R1,A
INC R0 ;取下一个显存单元地址
ACALL DELAY1MS ;延时 1 MS
DJNZ R2,DISP1 ;重复显示下一个
MOV P2,#0FFH ;关闭显示
RET ;显示完成,返回
;*********************************************************
;延时子程序
;*********************************************************
DELAY1MS:
MOV R6,#5
DEL1:
MOV R7,#93
DJNZ R7,$
DJNZ R6,DEL1
RET
;**********************************************************
;计数器T0中断服务程序
;**********************************************************
INT_T0:
CLR EA ;关总中断
PUSH ACC ; 保护现场
PUSH PSW ;
DJNZ R5,RELOAD
MOV R5,#100
INC SEC
MOV A,SEC
CJNE A,#60,MIN_PROC
MOV SEC,#0
INC MIN
MIN_PROC:
MOV A,MIN
CJNE A,#60,HOU_PROC
MOV MIN,#0
INC HOU
HOU_PROC:
MOV A,HOU
CJNE A,#24,RELOAD
MOV HOU,#0
RELOAD:
MOV TH0,#0DCH ;重装计数初始值
MOV TL0,#00H
POP PSW
POP ACC
SETB EA
RETI
;*********************************************************
;按键中断服务程序
;**********************************************************
INT_EX0:
CLR EA
CLR TR0
PUSH ACC ;入栈保护
PUSH PSW
INC R4 ;改变工作模式
CJNE R4,#4,NEXT1
MOV R4,#0
SETB TR0
NEXT1:
POP PSW
POP ACC
SETB EA
RETI
;**********************************************************
;计数器T1中断服务程序
;***********************************************************
INT_T1:
CLR TR1
DJNZ R3,INT_T1_END
MOV R3,#25
CPL BLINK
INT_T1_END:
MOV TH1,#0DCH
MOV TL1,#000H
SETB TR1
RETI
;*********************************************************
;int1中断服务程序
;*********************************************************
INT_EX1:
CLR EA
PUSH ACC
PUSH PSW
MOV DPTR,#TAB_RUN
MOV A,R4
RL A
JMP @A+DPTR
TAB_RUN:
AJMP INT_EX1_END
AJMP KL1
AJMP KL2
AJMP KL3
KL1:
INC SEC
MOV A,SEC
CJNE A,#60,INT_EX1_END
MOV SEC,#0
AJMP INT_EX1_END
KL2:
INC MIN
MOV A,MIN
CJNE A,#60,INT_EX1_END
MOV MIN,#0
AJMP INT_EX1_END
KL3:
INC HOU
MOV A,HOU
CJNE A,#24,INT_EX1_END
MOV HOU,#0
INT_EX1_END:
POP PSW
POP ACC
SETB EA
RETI
;*********************************************************
TAB_NU:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,0BFH
TAB_B:
DB 000H,003H,018H,0C0H
;*********************************************************
END
;**********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -