DU BIT P2.6
WE BIT P2.7
LCD_RS BIT P1.0 ;LCD1602
LCD_RW BIT P1.1
LCD_EN BIT P2.5
DS_SCLK BIT P2.1 ;DS1302
DS_IO BIT P2.0
DS_RST BIT P2.4
COM EQU 20H
DAT EQU 21H
BYTE1 EQU 22H
BYTE2 EQU 23H
TEAR EQU 29H ;定义时钟显示位
MONTH EQU 2AH
DAY EQU 2BH
SHI EQU 2CH
FEN EQU 2DH
MIAO EQU 2EH
WEEK EQU 2FH
/******************************主函数*******************************************/
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#30H
LCALL LCD_INIT ;LCD1602初始化
LCALL DS_INIT ;DS1302初始化
LOOP1: MOV COM,#80H
LCALL LCD_W_COM
MOV A,#81H
LCALL DS_W_BYTE
NOP
LCALL DS_R_DAT
NOP
LCALL BCD_TRANS
MOV DAT,A
LCALL LCD_W_DAT
NOP
MOV DAT,B
LCALL LCD_W_DAT
LJMP LOOP1
/*******************DS1302初始化****************************************/
DS_INIT: MOV A,#8EH ;打开写保护
LCALL DS_W_BYTE
NOP
MOV A,#00H
LCALL DS_W_BYTE
MOV A,#80H ;miao位初始化
LCALL DS_W_BYTE
NOP
MOV A,#20H
LCALL DS_W_BYTE
; MOV A,#8EH ;关闭写保护
; LCALL DS_W_BYTE
; MOV A,#80H
; LCALL DS_W_BYTE
RET
/*******************DS1302写字节*********************************************/
DS_W_BYTE: MOV R3,#08H
CLR DS_RST
CLR DS_SCLK
SETB DS_RST
LOOP3: RRC A
MOV DS_IO,C
SETB DS_SCLK
NOP
NOP
CLR DS_SCLK
DJNZ R3,LOOP3
RET
/*******************DS1302读数据**********************************************/
DS_R_DAT: MOV R3,#08H
CLR DS_RST
SETB DS_SCLK
SETB DS_RST
CLR A
CLR C
LOOP4: MOV C,DS_IO
CLR DS_SCLK
NOP
NOP
RRC A
SETB DS_SCLK
DJNZ R3,LOOP4
RET
BCD_TRANS: MOV B,#16
DIV AB
MOV R4,B ;BCD码转成十进制
MOV B,#10
MUL AB
ADD A,R4
MOV B,#10 ;十进制转成ASCII码
DIV AB
ADD A,#30H
MOV R4,A
MOV A,B
ADD A,#30H
MOV B,A
MOV A,R4
RET
LCD_INIT: CLR DU
CLR WE
MOV COM,#38H ;设置16*2显示
LCALL LCD_W_COM
MOV COM,#01H ;清屏
LCALL LCD_W_COM
MOV COM,#06H ;地址指针加1
LCALL LCD_W_COM
MOV COM,#0CH ;显示开关
LCALL LCD_W_COM
RET
LCD_W_COM: CLR LCD_RS ;写指令
CLR LCD_RW
MOV P0,COM
CLR LCD_EN
SETB LCD_EN
LCALL DELAY_5ms
CLR LCD_EN
RET
LCD_W_DAT: SETB LCD_RS ;写数据
CLR LCD_RW
MOV P0,DAT
CLR LCD_EN
SETB LCD_EN
LCALL DELAY_5ms
CLR LCD_EN
RET
DELAY_5ms: MOV R6,#13H ;延时
LOOP2: MOV R7,#82H
DJNZ R7,$
DJNZ R6,LOOP2
RET
/*TAB1: DB "XIAO KE AI"
TAB2: DB "I LOVE YOU" */
END
-
-
因为读数据都一样,我只测试了 秒 位,但是显示*5就不变,*是乱码;反复查了程序,查不出原因,能帮忙看看吗
BCD_TRANS: MOV B,#10
DIV AB
; MOV R4,B ;BCD码转成十进制
; MOV B,#10
; MUL AB
; ADD A,R4
; MOV B,#10 ;十进制转成ASCII码
; DIV AB
ADD A,#30H
MOV R4,A
MOV A,B
ADD A,#30H
MOV B,A
MOV A,R4
RET
数据转换部分按上面的改一下。时间关系,其余部分没有看。如有问题再问。