📄 ckock2.asm
字号:
;第七部分: DS12C887 闹钟实验
;文件名称: CLOCK2.ASM 时间读,写实验
NAME CLOCK2
$NOLIST
$INCLUDE(LJD_2008.INC)
$INCLUDE(LCD.INC)
$LIST
;-------------------------------------------------------
SECOND_BUFFER EQU 51H ;秒缓冲区
MINUTE_BUFFER EQU 52H ;分缓冲区
HOUR_BUFFER EQU 53H ;时秒缓冲区
WEEK_BUFFER EQU 50H ;星期缓冲区
DATE_BUFFER EQU 54H ;日缓冲区
MONTH_BUFFER EQU 55H ;月缓冲区
YEAR_BUFFER EQU 56H ;年缓冲区
CENTURY_BUFFER EQU 57H ;世纪缓冲区
;=======================================================
ORG 0000H
AJMP START
ORG 0013H
AJMP ALARM_INT
ORG 0030H
START: MOV SP,#60H
MOV R0,#57H
MOV IE,#84H
CALL INITIAL_GLCD ;调用LCD初始化
CALL WRITETIME
MOV DPTR,#SECOND_ALARM ;设定闹钟在10秒
MOV A,#10H
MOVX @DPTR,A
MOV DPTR,#MINUTE_ALARM ;设定闹钟为随意码
MOV A,#0C0H
MOVX @DPTR,A
LOOP: CALL READTIME
CALL RTC_LCD
CALL DELAY500
AJMP LOOP
;========================================================
WRITETIME: PUSH DPH ;
PUSH DPL
PUSH ACC
MOV DPTR,#REG_A ;开启振荡器和允许计时
MOV A,#00100000B
MOVX @DPTR,A
MOV DPTR,#REG_B ;设定SET=1,禁止更新数据
MOV A,#10000000B
MOVX @DPTR,A
MOV DPTR,#SECOND ;设定秒
MOV A,SECOND_BUFFER
MOVX @DPTR,A
MOV DPTR,#MINUTE ;设定分
MOV A,MINUTE_BUFFER
MOVX @DPTR,A
MOV DPTR,#HOUR ;设定时
MOV A,HOUR_BUFFER
MOVX @DPTR,A
MOV DPTR,#WEEK ;设定星期
MOV A,WEEK_BUFFER
MOVX @DPTR,A
MOV DPTR,#DATE ;设定日
MOV A,DATE_BUFFER
MOVX @DPTR,A
MOV DPTR,#MONTH ;设定月
MOV A,MONTH_BUFFER
MOVX @DPTR,A
MOV DPTR,#YEAR ;设定年
MOV A,YEAR_BUFFER
MOVX @DPTR,A
MOV DPTR,#CENTURY ;设定世纪
MOV A,CENTURY_BUFFER
MOVX @DPTR,A
MOV DPTR,#REG_B ;设定SET=0,BCD模式,24小时制
MOV A,#00100010B
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
READTIME: PUSH DPL
PUSH DPH
PUSH ACC
MOV DPTR,#REG_A ;读取寄存器 A
RTCBUSY: MOVX A,@DPTR
JB ACC.7,RTCBUSY ;测试UIP位,如果UIP=0;则执行以下程序
MOV DPTR,#SECOND ;读取秒数据
MOVX A,@DPTR
MOV SECOND_BUFFER,A
MOV DPTR,#MINUTE ;读取分数据
MOVX A,@DPTR
MOV MINUTE_BUFFER,A
MOV DPTR,#HOUR ;读取时数据
MOVX A,@DPTR
MOV HOUR_BUFFER,A
MOV DPTR,#WEEK ;读取星期数据
MOVX A,@DPTR
MOV WEEK_BUFFER,A
MOV DPTR,#DATE ;读取日数据
MOVX A,@DPTR
MOV DATE_BUFFER,A
MOV DPTR,#MONTH ;读取月数据
MOVX A,@DPTR
MOV MONTH_BUFFER,A
MOV DPTR,#YEAR ;读取年数据
MOVX A,@DPTR
MOV YEAR_BUFFER,A
MOV DPTR,#CENTURY ;读取世纪数据
MOVX A,@DPTR
MOV CENTURY_BUFFER,A
POP ACC
POP DPH
POP DPL
RET
;
;
;
RTC_LCD:
MOV ADDR1,#00H ;第一行显示
MOV N1,#08H
MOV DPTR,#DHZTAB0
CALL DHZ
MOV ADDR1,#10H ;第二行显示
MOV N1,#08H
MOV DPTR,#DHZTAB1
CALL DHZ
MOV DPTR,#DHZTAB2 ;第三行显示
MOV ADDR1,#08H
MOV N1,#08
CALL DHZ
MOV DPTR,#DHZTAB3 ;第四行显示
MOV ADDR1,#18H
MOV N1,#08
CALL DHZ
LP2: MOV R4,#07H
MOV DPTR,#TAB
PUSH DPL
PUSH DPH
LP1: POP DPH
POP DPL
MOV A,#00H
MOVC A,@A+DPTR
INC DPTR
PUSH DPL
PUSH DPH
MOV ADDR1,A
MOV N1,#02H
MOV A,@R0
MOV 3DH,A
CALL LDHZ
DEC R0
DJNZ R4,LP1
POP DPH
POP DPL
MOV R0,#57H
RET
TAB: DB 10H,11H,13H,15H,09H,0BH,0DH,1EH
DHZTAB0: DB " 现 在 时 间"
DHZTAB1: DB " 年 月 日 "
DHZTAB2: DB " 时 分 秒 "
DHZTAB3: DB " 星 期 五 "
;--------------------------------------------------------------------
;显示汉字16X16点阵
DHZ: MOV ADDR,ADDR1 ; 开始行位置
MOV B,N1 ; 显示数量
DHZ1: MOV A,ADDR;
ORL A,#80H ; 送显示地址
LCALL COMMAND_GLCD ;调写命令子程序
DHZ2: CLR A
MOVC A,@A+DPTR ; 查找汉字的高位码
INC DPTR
LCALL WRITE_GLCD ; 送显示
CLR A
MOVC A,@A+DPTR ; 查找汉字的低位码
INC DPTR
LCALL WRITE_GLCD ; 送显示
DJNZ B,DHZ2
RET
LDHZ: MOV ADDR,ADDR1 ; 开始行位置
;MOV B,N1 ; 显示数量
LDHZ1: MOV A,ADDR;
ORL A,#80H ; 送显示地址
LCALL COMMAND_GLCD
LDHZ3: MOV A,3DH
LDHZ2: LCALL HEX_LCD
;DJNZ B,LDHZ3
RET
;===================================================
ALARM_INT: PUSH ACC ;闹钟中断服务程序
PUSH DPL
PUSH DPH
MOV DPTR,#REG_C
MOVX A,@DPTR ;读取寄存器C,清除寄存器C的所有位
MOV R5,#10
BEEP: CPL P1.1 ; 蜂鸣器响一声(10次)
LCALL DELAY100
DJNZ R5,BEEP
POP DPH
POP DPL
POP ACC
RETI
;--------------------------------------------------------------------
;---------------------------------------------------------
;点阵式 LCD(128X64)模块显示实验
;以下是公共的程序:
;----------------------------------------------------------
;执行 LCD 初始化工作
INITIAL_GLCD:
PUSH ACC
MOV A,#30H ;功能设定
CALL COMMAND_GLCD
MOV A,#30H ;功能设定
CALL COMMAND_GLCD
MOV A,#30H ;功能设定
CALL COMMAND_GLCD
MOV A,#06H ;显示器控制:游标不显示;但是字会闪烁
CALL COMMAND_GLCD
MOV A,#01H ;清除显示器
CALL COMMAND_GLCD
MOV A,#0CH ;进入模式设定
CALL COMMAND_GLCD
POP ACC
RET
;---------------------------------------------------------------
;检查LCD 忙碌标志
CHKBUSY_GLCD:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#R_B_GLCD
CHK$: MOVX A,@DPTR
JB ACC.7,CHK$ ;判别是不是忙?
POP ACC
POP DPL
POP DPH
RET
;---------------------------------------------------------------
;写命令到 GLCD
COMMAND_GLCD:
PUSH DPH
PUSH DPL
CALL CHKBUSY_GLCD ;判别是不是忙?
MOV DPTR,#W_C_GLCD
MOVX @DPTR,A ;写入命令
POP DPL
POP DPH
RET
;---------------------------------------------------------------
;写资料到 GLCD
WRITE_GLCD:
PUSH DPH
PUSH DPL
CALL CHKBUSY_GLCD ;判别是不是忙?
MOV DPTR,#W_D_GLCD ;写入数据
MOVX @DPTR,A
POP DPL
POP DPH
RET
;--------------------------------------------------------------------
;清除 LCD 的显示幕
CLEAR_GLCD:
PUSH ACC
MOV A,#01H ;清除显示器
CALL COMMAND_GLCD
POP ACC
RET
;--------------------------------------------------------------------
;将 ACC 内容,以十六进制值显示
HEX_LCD:
PUSH DPH
PUSH DPL
PUSH ACC
PUSH ACC
SWAP A ;高低四位元交换
ANL A,#0FH ;留下低四位元
MOV DPTR,#ASCII_CODE ;DPTR 指到 ASCII_CODE
MOVC A,@A+DPTR ;取得 ASCII 码
CALL WRITE_GLCD ;写到 LCD
POP ACC
ANL A,#0FH ;留下低四位元
MOVC A,@A+DPTR ;取得 ASCII 码
CALL WRITE_GLCD ;写到 LCD
POP ACC
POP DPL
POP DPH
RET
ASCII_CODE: DB '0123456789ABCDEF'
;--------------------------------------------
;延时子程序
DELAY: PUSH TIMER1; 延时TIMER1*1 ms for 12MHz
PUSH TIMER0
DELAY1: MOV TIMER0,#250 ;循环一次需要4个机器周期,时间为4*1μS
DELAY2: NOP ; 1个周期
NOP ; 1个周期
DJNZ TIMER0,DELAY2 ;2个周期
DJNZ TIMER1,DELAY1
POP TIMER0
POP TIMER1
RET
NOP;--------------------
DELAY01: NOP; 延时 1 ms
PUSH TIMER1
MOV TIMER1,#01H
LCALL DELAY
POP TIMER1
RET
NOP;--------------------
DELAY10: NOP; 延时 10 ms
PUSH TIMER1
MOV TIMER1,#10
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY100: NOP; 延时100 ms
PUSH TIMER1
MOV TIMER1,#100
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY250: NOP; 延时 250 ms
PUSH TIMER1
MOV TIMER1,#250
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY500: NOP; 延时 500 ms
PUSH TIMER1
MOV TIMER1,#250
LCALL DELAY
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
DELAY1S: NOP; 延时 1 sec
PUSH TIMER1
MOV TIMER1,#250
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
POP TIMER1
RET
NOP;---------------------
END
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -