📄 digitalclock.asm
字号:
DATA_IN DATA 0020H
DATA_OUT DATA 0021H
SHUDATA DATA 0022H
KEY BIT P3.3 ;7279的KEY按键输出
DAT BIT P1.1 ;7279的DATA串行数据引脚
CLK BIT P1.0 ;7279的CLK同步时钟引脚
CS BIT P2.6 ;7279的CS片选输入端
;*************************************
;************主程序*****
;*************************************
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1
ORG 001BH
LJMP INT
ORG 0300H
START: MOV SP,#2FH
SETB CS
SETB KEY
CLR CLK
CLR DAT ;初始化I/O口
CALL DELAY25 ;延时25mS
MOV R3,#20
SETB EA
SETB ET1
SETB EX1
SETB PX1
MOV TMOD,#10H
MOV TH1,#03CH
MOV TL1,#0B0H
SETB TR1 ;中断初始化
MOV DATA_OUT,#0A4H
CALL SEND ;发复位(清除)指令
SETB CS
MOV R4,#00H ;存放秒数字
MOV R5,#00H ;存放分数字
MOV R6,#00H ;存放时数字
MOV SHUDATA,#87H
;----------------------------------------
; 第三个和第六个数码管位一横并闪烁
;----------------------------------------
CFSM: MOV DATA_OUT,#95H
CALL SEND
MOV DATA_OUT,#01H
CALL SEND
MOV DATA_OUT,#88H
CALL SEND
MOV DATA_OUT,#11011011B
CALL SEND
;--------------------------------
MOV DATA_OUT,#92H
CALL SEND
MOV DATA_OUT,#01H
CALL SEND
;--------------------------------
MOV A,R6 ;显示时
MOV B,#10
DIV AB
MOV DATA_OUT,#86H
CALL SEND
MOV DATA_OUT,B
CALL SEND
MOV DATA_OUT,#87H
CALL SEND
MOV DATA_OUT,A
CALL SEND
;--------------------------------
MOV A,R5 ;显示分
MOV B,#10
DIV AB
MOV DATA_OUT,#83H
CALL SEND
MOV DATA_OUT,B
CALL SEND
MOV DATA_OUT,#84H
CALL SEND
MOV DATA_OUT,A
CALL SEND
;--------------------------------
MOV A,R4 ;显示秒
MOV B,#10
DIV AB
MOV DATA_OUT,#80H
CALL SEND
MOV DATA_OUT,B
CALL SEND
MOV DATA_OUT,#81H
CALL SEND
MOV DATA_OUT,A
CALL SEND
SJMP CFSM
;*****************************
; 中断服务程序
;*****************************
INT: DJNZ R3,OUT
MOV R3,#20
INC R4 ;秒+1
CJNE R4,#60,OUT ;如果还没到60秒,返回
MOV R4,#00H
INC R5 ;到60秒。秒就清零,分+1
CJNE R5,#60,OUT ;如果还没到60分,返回
MOV R5,#00H
INC R6 ;到60分。分就清零,时+1
CJNE R6,#24,OUT ;如果还没到24时,返回
MOV R6,#00H ;到24时。时就清零
OUT:MOV TH1,#03CH
MOV TL1,#0B0H
RETI
;*******************************************************
;从HD7279接受一个字节,高位在前
;*******************************************************
RECEIVE: MOV R7,#8
SETB DAT ;P1口为输入状态,要至1
CLR CS
D2: CALL DELAY100
SETB CLK
CALL DELAY100
MOV A,DATA_IN
RL A
MOV DATA_IN,A
MOV C,DAT
MOV DATA_IN.0,C
CLR CLK
DJNZ R7,D2
CLR DAT ;接收完毕
CALL DELAY100
RET
;*******************************
;发送1个字节到HD7279,高位在前
;*******************************
SEND: PUSH A
MOV R7,#8;设定位计数器
CLR CS
CALL DELAY100
D1:MOV C,DATA_OUT.7
MOV DAT,C
SETB CLK
MOV A,DATA_OUT
RL A
MOV DATA_OUT,A
CALL DELAY100
CLR CLK
DJNZ R7,D1
CLR DAT ;发送完毕
POP A
RET
;***************************
; 延时子程序
;***************************
DELAY25:MOV R1,#250
D0:MOV R2,#100
DJNZ R2,$
DJNZ R1,D0
RET
;---------------------
DELAY100:MOV R0,#50
DJNZ R0,$
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -