SETB RS
CLR RW
SETB E
MOV Pdate,A
CLR E
RET
;==============延时子程序===============
DL10MS: CALL DL5MS
CALL DL5MS
RET
DL5MS: MOV R6,#5
D0: MOV R5,#250
D1: NOP
NOP
DJNZ R5,D1
DJNZ R6,D0
RET
DL120US:MOV R5,#30
D2: NOP
NOP
DJNZ R5,D1
RET
;===========把自创字符写入CGRAM程序==============
;=====
LCD_WORD:
MOV A,#40H ;设置CGRAM的首地址为00H
LCALL LCD_WRC ;写命令
MOV R3,#56 ;写入24个字符码
MOV DPTR,#TAB1
MOV R4,#00H ;偏移量初始值
NEXT: MOV A,R4
MOVC A,@A+DPTR
LCALL LCD_WRTD
INC R4
DJNZ R3,NEXT
RET
TAB: DB '0','1','2','3','4','5','6','7','8','9'
TAB1: DB 08H,0FH,12H,0FH,0AH,1FH,02H,00H ;年
DB 0FH,09H,0FH,09H,0FH,09H,13H,00H ;月
DB 0FH,09H,09H,0FH,09H,09H,0FH,00H ;日
;向上
;-- 宽度x高度=8x8 --
DB 00H,04H,0EH,15H,04H,04H,04H,00H
;向下
;-- 宽度x高度=8x8 --
DB 04H,04H,04H,15H,0EH,04H,00H,00H
;========================================================================================================
;========================================================================================================
;========================================================================================================
;========================================================================================================
;DS1302时钟芯片
;**********************************************************
;功 能:设置DS1302 初始时间,并启动计时。
;**********************************************************
SET1302:MOV Second,#38H ;给初始值
MOV Minute,#39H
MOV Hour,#18H
MOV Day,#20H
MOV Month,#12H
MOV WEEK,#01H
MOV Year,#10H
MOV A,#8EH ;写操作寄存器
MOV B,#00H ;允许写,将WP =0
LCALL CLOCK_WR ;调用写子程序
MOV R0,#Second ;单片机年地址
MOV R7,#7 ;循环7次
MOV R1,#80H ;DS1302秒写地址
S13021: MOV A,R1 ;秒 分 时 日 月 星期 年 的地址
MOV B,@R0 ;单片机地址R0所对应的值
LCALL CLOCK_WR ;调用写子程序
INC R0
INC R1
INC R1
DJNZ R7,S13021
MOV A,#8EH ;写操作寄存器
MOV B,#80H ;WP=1,写保护
LCALL CLOCK_WR
RET
Get1302:MOV A,#8DH ;年
LCALL CLOCK_RD
MOV YEAR,A
MOV A,#8BH ;星期
LCALL CLOCK_RD
MOV WEEK,A
MOV A,#89H ;月
LCALL CLOCK_RD
MOV Month,A
MOV A,#87H ;日
LCALL CLOCK_RD
MOV Day,A
MOV A,#85H ;时
LCALL CLOCK_RD
MOV Hour,A
MOV A,#83H ;分
LCALL CLOCK_RD
MOV Minute,A
MOV A,#81H ;秒
LCALL CLOCK_RD
MOV Second,A
RET
;**********************************************************
;**********************************************************
;功 能:从DS1302 读数据子程序
;**********************************************************
;功 能:读数据子程序 八位
;入口参数:A存放要读的数据 地址
;出口参数:A存放读取的数据
;**********************************************************
CLOCK_RD:
CLR RST
CLR SCLK
SETB RST ;选通DS1302
MOV R4,#8
Outbit1:RRC A
MOV IO,C ;通过IO口输出一位寄存器写地址
CLR SCLK
SETB SCLK ;发个输出脉冲
DJNZ R4,Outbit1
CLR SCLK
NOP ;延时,防止后面串行读数据丢失
SETB IO ;将单片机对应的IO口设为输入端口
MOV R4,#8
Outbit2:MOV C,IO ;经IO口读入一位数据
RRC A ;通过IO口输出一位寄存器写地址
SETB SCLK
CLR SCLK
DJNZ R4,Outbit2
RET
;**********************************************************
;功 能:写数据子程序 八位
;入口参数:A/B分别存放要写入的地址和数据
;**********************************************************
CLOCK_WR:
CLR RST
CLR SCLK
SETB RST ;选通DS1302
MOV R4,#8
Inbit1: RRC A
MOV IO,C ;通过IO口输出一位寄存器写地址
CLR SCLK
SETB SCLK
DJNZ R4,Inbit1
NOP
MOV A,B ;将待写入数据送到A
MOV R4,#8
Inbit2: RRC A
MOV IO,C ;通过IO口输出一位寄存器写地址
CLR SCLK
SETB SCLK
DJNZ R4,Inbit2
RET
END
评论