📄 家庭时钟6.9.asm
字号:
;本实验是做一个计时器,能从00:00计到59:59共1个小时。
;数码管1、2位为时,3、4位为分。
DS1 EQU 22H ;数码管显示缓存
DS2 EQU 23H
DS3 EQU 24H
DS4 EQU 25H
BUFF_LP EQU 28H
BUFF_LED_LP EQU 29H ;T0键盘显示扫描缓存
HOR EQU 30H ;时值缓存
MIN EQU 31H ;分钟值缓存
SEC EQU 32H ;秒值缓存
SET_TIME BIT 33H
SET_CLOCK BIT 34H
LED_PORT EQU P0 ;数码管段码接口
KEY EQU P1
DIG_PORT EQU P2 ;数码管位控制接口
BUZZ EQU P2.2
LED EQU P2.3
ORG 000H
JMP MAIN
ORG 00BH
JMP T0_INT
ORG 0100H
MAIN: MOV SP ,#40H
MOV PSW,#00H
MOV R0,#7FH ;初始化RAM区,
CLR_RAM:MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_RAM
MOV P1,0FFH
MOV P2,0FFH
MOV P0,0FFH
MOV P3,0FFH
MOV TH0,#0F0H ;装入定时时间T0=4MS
MOV TL0,#060H
MOV IE,#82H
MOV TMOD,#01H
SETB TR0 ;开始定时
SETB BUZZ ;关蜂鸣器
SETB LED ;关LED
CLR SET_TIME
CLR SET_CLOCK
MOV KEY,#0FFH ;设P1口为输入口
LOOP: MOV A,KEY
CJNE A,#0FFH,START
LJMP LOOP
START: LCALL DEL_10MS
JNB SET_TIME,KEY5;;;;;
KEY1: JB ACC.0,KEY2
MOV A,MIN ;
CJNE A,#59,ADD_MIN ;
MOV MIN,#0 ;
LJMP KEY1OUT
ADD_MIN:INC MIN ;
KEY1OUT:LJMP KEYFRE
KEY2: JB ACC.1,KEY3
MOV A,MIN ;
CJNE A,#00,SUB_MIN ;
MOV MIN,#59 ;
LJMP KEY2OUT
SUB_MIN:DEC MIN ;
KEY2OUT:LJMP KEYFRE
KEY3: JB ACC.2,KEY4
MOV A,SEC ;
CJNE A,#59,ADD_SEC ;
MOV SEC,#0 ;
LJMP KEY3OUT
ADD_SEC:INC SEC ;
KEY3OUT:LJMP KEYFRE
KEY4: JB ACC.3,KEY5
MOV A,SEC ;
CJNE A,#00,SUB_SEC ;
MOV SEC,#59 ;
LJMP KEY2OUT
SUB_SEC:DEC SEC ;
KEY4OUT:LJMP KEYFRE
KEY5: JB ACC.4,KEY6
LCALL BELL
JBC SET_TIME,KEYFRE
SETB SET_TIME
LJMP KEYFRE
KEY6: JB ACC.5,KEY7
LCALL BELL
JBC SET_CLOCK,KEYFRE
SETB SET_CLOCK
LJMP KEYFRE
KEY7: JB ACC.6,KEY8
LJMP KEYFRE
KEY8: JB ACC.7,KEYFRE
LJMP KEYFRE
KEYFRE: JB SET_TIME,KEYR1
JNB SET_CLOCK,KEYR2
KEYR1:LCALL BELL
KEYR2:MOV A,KEY ;等待键释放
CPL A
XRL A,#00H
JNZ KEYR2
LJMP LOOP
BELL : CLR BUZZ
LCALL DEL
SETB BUZZ
RET
DEL: MOV R5,#20
DEL01: MOV R6,#250
DJNZ R6,$
DJNZ R5,DEL01
RET
DEL_10MS: MOV R6,#25
D10MS: MOV R7,#250
DJNZ R7,$
DJNZ R6,D10MS
RET
BIN_BCD: MOV B,#10
DIV AB
RET
;===============数码管扫描定时中断================
T0_INT: PUSH ACC
PUSH PSW
MOV TH0,#0F0H ;T0=4MS
MOV TL0,#060H
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#250,CONT_SCAN ;250*4MS=1S
MOV BUFF_LED_LP,#00H
INC SEC
CPL LED
MOV A,SEC
CJNE A,#60,CONT_SCAN
MOV SEC,#00H
INC MIN
MOV A,MIN
CJNE A,#60,CONT_SCAN
MOV MIN,#00H
INC HOR
MOV A,HOR
CJNE A,#24,CONT_SCAN
MOV HOR,#00H
CONT_SCAN:INC BUFF_LP
MOV A,SEC
LCALL BIN_BCD
MOV DS4,B
MOV DS3,A
MOV A,MIN
LCALL BIN_BCD
MOV DS2,B
MOV DS1,A
SCAN: MOV A,BUFF_LP
MOV B,#04
DIV AB
MOV A,B
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
SCAN_L1: CLR P2.7
SETB P2.6
SETB P2.5
SETB P2.4
MOV A,DS1
JMP END_SCAN
SCAN_L2: SETB P2.7
CLR P2.6
SETB P2.5
SETB P2.4
MOV A,DS2
JMP END_SCAN
SCAN_L3: SETB P2.7
SETB P2.6
CLR P2.5
SETB P2.4
MOV A,DS3
JMP END_SCAN
SCAN_L4: SETB P2.7
SETB P2.6
SETB P2.5
CLR P2.4
MOV A,DS4
END_SCAN: MOV DPTR,#TAB_LED
DISPLAY: MOVC A,@A+DPTR
MOV LED_PORT,A
EXIT_T0: POP PSW
POP ACC
RETI
;=========共阳数码管段码表=============
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H ;"0","1","2","3","4"
DB 92H,82H,0F8H,80H,90H ;"5","6","7","8","9"
DB 88H,83H,0A7H,0A1H,86H,8EH;"A","B","C","D","E","F"
DB 0FFH ;" "
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -