;***************************************************************
;*------------------ --电子万年历制作--------------------------*
;*-------------------------------------------------------------*
;*---------------------MCS-51汇编语言---------------------------*
;*-------------------------------------------------------------*
;*----------------------CPU: A T89C51---------------------------*
;-------------------------------------------------------------*
;*------------------------晶振:12MHz----------------------------*
;*-------------------------------------------------------------*
RTC EQU 0200H ;定义MC146818起始地址=秒地址
LCDIR EQU 0100H ;指令寄存器地址
LCDIR EQU 0500H ;数据寄存器地址
RAM EQU 20H ;寄存器RAM 20H
PTR EQU 28H ;年、月、日、时、分、秒位置的指针0~5 ORG 00H
JMP START
ORG 13H
JMP EXT1 ;INT1中断子程序
START: MOV SP,#60H ;设置堆栈
MOV RAM,#01H ;LCD清除屏幕
CALL PUTIR
CALL DRLAY1 ;2ms
MOV RAM,#38H ;LCD功能设定,8位,2行,显示,
CALL PUTIR
MOV PTR,#0FH ;设定显示屏幕,光标ON,光标闪烁
CALL PUTIR
MOV RAM,#6H ;加1, 光标向右移
CALL PUTIR
MOV PTR,#00 ; 位置指针为0,即停在”年”位置
MOV IE,#84H ;TIMER1 INT1中断使能
MOV DPTR,#RTC+0AH ;A寄存器32,768kHz DV2=0 DV1=1 DV0=0
MOV A ,#20H
MOVX @DPTR, A
MOV DPTR ,#RTC+0BH ;B寄存器SET=1更新周期停止,进行时钟设定
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#RTC+0EH ;读取RTC OE 地址内容判断是否为3?
MOVX A,@DPTR
CJNE A,#01H,START0
JMP START1
START0: ; 不是则写入内定时间2008年1月1日12:00:00 MOV RAM,#80H ; 设定光标停在第一行第一格CALL PUTIR
MOV DPTR,#RTC ;秒地址写入00秒
MOV A,#00H ;;00秒
MOVX @DPTR,A
MOV DPTR,#RTC+2;分地址写入00分
MOV A,#00H ;00分
MOVX @DPTR,A
MOV DPTR,#RTC+4 ;时地址写入12时
MOV A,#12H ;12时
MOVX @DPTR,A
MOV DPTR,#RTC+7 ;日地址写入1日
MOV A,#01H ;1日
MOVX @DPTR,A
MOV DPTR,#RTC+8 ;月地址写入1月
MOV A,#01H ;1月
MOVX @DPTR,A
MOV DPTR,#RTC+9 ; 年地址写入08年
MOV A,#08H ;08年
MOVX @DPTR,A
MOV DPTR,#RTC+0EH ;RTC OE 地址写入1,
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示内部已有;时间值的识别码,
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#TAB ;LCD显示内定日期时间
CALL PUTSTR
JMP START2
START1: ;是1表示RTC内已有时间
MOV RAM,#80H ;设定光标停在第一行第一格
CALL PUTIR
MOV DPTR,#TAB1 ;LCD显示”19 : :”
CALL PUTSTR
START2: MOV RMA,#82H ;光标停在”年”位置
CALL PUTIR
MOV DPTR,#RTC+0BH ;B寄存器UIE=1 RTC中断使能开始计时,(十进制,24小时制)
MOV A,#12H
MOVX @DPTR,A
LOOP: JNB P1,0,CUR0 ;是否按P1.0?是则光标位置加1 JNB P1,1,INC0 ;是否按P1,1?是则光标所在位置的值加1
JNB P1,2,DEC0 ;是否按,P1,2?是则光标所在位置的值减1
JMP LOOP
CUR0: JMP CUR1 ;间接跳跃
INC0: JMP INC1 ;间接跳跃
DEC0: SJMP DEC ;间接跳跃
CUR1:
CALL DELAY ; 按钮清除抖动
JNB P1.0,S ;检测按钮是否放开?
CALL DELAY ; 按钮清除抖动
INC PTR
MOV A,PTR ;读取位置指针
CJNE A,#06H,CUR10 ;是否超过”秒”位置? 第6个位置
MOV PTR,#00H
CUR10: MOV DPTR,#CUR ;指向LCD位置表(年、月、日、时、分、秒所在的光标地址)
MOVC A,@A+DPTR ;依位置指针读取对应的光标地址来设定
MOV RAM,A ;设定LCD光标地址
CALL PUTIR
JMP LOOP
INC1: CALL DELAY ;按钮清除抖动
JNB P1.1,S ;检测按钮是否放开?
CALL DELAY ;按钮清除抖动
MOV DPTR,#RTC+OBH ;B寄存器SET=1更新周期停止,进行时钟设定
MOV A,#80H
MOVX #DPTR.A
MOV DPTR.#TIM ;依位置指针读取该RTC地址存入RAM 20H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
MOV DPTR,#MAX ; 依位置指针取该时间最大值存入RAM 21H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+1.A
MOV DPTR.#MIN ;依位置指针取该时间最小值存入RAM 22H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+2,A
MOV DPTR,#RTC ; 读取(#RTC+RAM)地址的内容
MOV DPL.RAM
MOVX A,@DPTR
CJNE A,RAM+1,INC10 ;是否=最大值?不是则跳至INC 10
MOV A.RAM+2 ;是则存入最小值
JMP INC11
INC10: ADD A.#01H
DA A
INC11: MOVX @DPTR.A ;写入RTC
MOV B,#10H ;将时间值十位数,个位数拆开
DIV AB
ADD A,#'0' ; 位数转换为ASCII码送至LCD显示
MOV RAM,A
CALL PUTCHR
MOV A,B ; 个位数转换为ASCII码送至LCD显示
ADD A,#'0'0
MOV RAM,A
CALL PUTCHR
MOV DPTR,#CUR ;让光标回到原来位置
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
CALL PUTIR
MOV DPTR,#RTC+0BH ;B寄存器UIE=1 RTC中断使能开始计时(十进制,24小时制)
MOV A,#12H
MOVX @DPTR,A
JMP LOOP
DEC1:
CALL DELAY ;按钮清除抖动
JNB P1,2 ;检测按钮是否放开?
CALL DELAY ;按钮清除抖动
MOV DPTR,#RTC+0BH ;B寄存器SET=1更新周期停止,进行时钟设定
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#TIM ;依位置指针取RTC地址存入RAM 20H
MOV A,PTR
MOVC A@A+DPTR
MOV RAM,A
MOV DPTR,#MAX ;依位置指针取该时间最大值存入RAM 21H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+1,A
MOV DPTR,#MIN ;依位置指针取该时间最小值存入RAM 22H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+2,A
MOV DPTR,#TRC ;读取(#RTC+RAM)地址的内容存入RAM 23H
MOV DPL,RAM
MOVX A,@DPTR
MOV RAM+3,A
CJNE A,#RAM+2 DEC10 ;是否=最小值?不是由跳至DEC10
MOV A,RAM+1 ;是则存入最大值
JMP DEC12
DEC10: ;不是最小值则检测个位数是否为0?
ANL A,#0FH
XRL A,#00H
JNZ DEC11 ;个位数不是0则跳至DEC11
MOV A,RAM+3 ;个位数为0则读取RTC值减7(即十位数减1,个位数为9)
CLR C
SUBB A,#07H
JMP DEC12
DEC11: MOV A,RAM+3 ; 个位数不为0则读取RTC值减1 DEC A
DEC12: JMP INC11
PUTIR: ;写入指令子程序
CALL BUSY ;检测忙碌标志位
MOV DPTR,#LCDIR ; LCD指令寄存器
MOV A,RAM ; 将RAM内容写入指令寄存器
MOVX @DPTR,A
RET
PUTCHR: ; 显示字子程序
CALL BUSY ;检测忙碌标志位
MOV A,RAM ;LCD数据寄存器
MOVX @DPTR,A
RET
PUTSTR: ;显示字串子程序
MOV R2,#00 ;取字串的指针值为0
PUTSTR1: MOV A,R2 ;载入字串指针值
MOVC A,@A+DPTR ;取字串数据码
MOV RAM,A ;写入RAM寄存器
XRL A,#00H ; 是否取到结束码0?
JZ PUTSTR2 ;是则返回
PUSH DPH ;不是则先将DPTT压入堆栈,以免损坏字串指针
PUSH DPL
CALL PUTCHR ;将字串显示数据码显示(此子程序会破坏DPTR值)
INC R2 ;指向字串下一个数据码
POP DPL ;取回字串指针DPTR
POP DPH
JMP PUTSTR1
PUTSTR2: RET
BUSY: ;检测忙碌标志位子程序
MOV DPTR,#LCDIR ;LCD指令寄存器
BUSY1: MOVX A,@DPTR ;读取忙碌标志位(bit7)
ANL A,#80H
XRL A,#80H ;检测bit7=1?
JZ BUSY1 ;是则表示在忙碌中
RET
EXT1:
PUSH ACC
PUSH PSW
MOV DPTR,#RTC+0CH ;读C 寄存器,清除中断标志位,IRQF MOVX A,@DPTR
MOV R2,#00
EXT10:
MOV DPTR,#CUR ;依R2值读取光标地址
MOV A,R2
MOVC A,@A+DPTR
MOV RAM,A ;设定停在指定位置
CALL PUTIR
MOV DPTR,#TIM ;依R2值读取RTC内部地址
MOV A,R2
MOVC A,@A+DPTR
MOV DPTR,#RTC ;DPTR指向#RTC外部地址
MOV DPL,A ;PTR=RTC+OFFSET地址
MOVX A,@DPTR ;取该地址的内容
MOV B,#10H ;将十位数,个位数分开
DIV AB
ADD A,#'0' ;位数转换为ASCII码送至LCD显示
MOV RAM,A
CALL PUTCHR
MOV A,B ; 个位数转换为ASCII码送至LCD
ADD A,#'0'
MOV RAM,A
CALL PUTCHR
INC R2 ;指向下一组时间
CJNE R2,#06H,EXT10
MOV DPTR,#CUR ; 让光标回到原来位置
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
CALL PUTIR
POP PSW
POP ACC
RETI
DELAY: MOV R6,#60 ; 延时30ms
D1: MOV R7,#248
DJNZ R7,#$
DJNZ R6,D1
RET
DELAY1: MOV R6,#4 ;延时2ms
D11: MOV R7,#248
DJNZ R7,$
DJNZ R6,D11
RET
TAB: DB '08 01 01 12:00:00',00H ;内定年、月、日、时、分、秒显示于LCD
TAB1: DB '20 : : ;' ;0H ;LCD屏幕显示
TIM: DB 09H,08H,07H,04H,02H,00H ;RTC“年月日时分秒”
CUR: DB 82H,85H,88H,8BH,8EH,91H ;LCD“年月日时分秒”光标地址
MAX: DB 99H,12H,31H,23H,59H,59H ;年月日时分秒最大值
MIN : DB 00H,01H,01H,00H,00H,00H ;年月日时分秒最小值END