📄 调时2.asm
字号:
NO99: INC DATE2
Equal_2:
ACALL DELAY
WAIT5: MOV DATE3,#84H
ACALL Display_Time1
ACALL DELAY
JNB P3.0,JUMP1
ACALL DELAY
JB P3.1,WAIT5
KEY2222: ACALL DELAY
SETB P3.1
JNB P3.1,KEY2222
AJMP LOOP2
JUMP1:
KEY1_Fo: ACALL DELAY
SETB P3.0
JNB P3.0,KEY1_Fo
RET
;显示字符:程序
Display_Spot: MOV R3,#89H
ACALL WRLCD
MOV DATE,#3AH
ACALL WRDATE
MOV R3,#86H
ACALL WRLCD
MOV DATE,#3AH
ACALL WRDATE
RET
;显示秒分时程序
Display_Time: ACALL Deal_SMH
MOV R3,DATE3
ACALL WRLCD
MOV DATE,DATE1
ACALL WRDATE
INC R3
ACALL WRLCD
MOV DATE,DATE2
ACALL WRDATE
RET
;按下KEY后显示等待程序
Display_Time1: MOV R3,DATE3
ACALL WRLCD
MOV DATE,DATE1
ACALL WRDATE
INC R3
ACALL WRLCD
MOV DATE,DATE2
ACALL WRDATE
RET
;the programme of the initialization of lcd016l(load the command code to R3)
LCDINT: MOV R3,#01H ;清屏
ACALL WRLCD ;写入指令
MOV R3,#3CH ;功能设定:8位字符,2行,5X10点阵
ACALL WRLCD
MOV R3,#06H ;I/D=1,AC自动+1,S=0整体显示不移动
ACALL WRLCD
MOV R3,#0CH ;D=1开显示,C=0关光标,B=0字符不闪耀
ACALL WRLCD
RET
;写命令子程序,R3中存放要写入的命令
WRLCD: ACALL BUSY
MOV A,R3
CLR RS
CLR RW
MOV P0,A
CLR E
ACALL DELAY
SETB E
RET
;查询“忙碌”(BF)子程序
BUSY: CLR RS
SETB RW
MOV A,P0
CLR E
ACALL DELAY
SETB E
JB ACC.7,BUSY ;F=1忙碌
RET
;延时子程序
DELAY: MOV R6,#5
D1: MOV R5,#25
DJNZ R5,$
DJNZ R6,D1
RET
;写一位字符数据子程序,DATE中存放要写入的数据
WRDATE: ACALL BUSY
SETB RS ;RS=1,RW=0,可以显示各字符
CLR RW
MOV P0,DATE
CLR E ;读写使能(下降沿使能)
ACALL DELAY ;让一个字节的数据顺利写入LCD
SETB E
RET
;时钟允许运行程序
Clock_Enable: MOV COMMAND,#80H;命令字节为80H
MOV BYTECNT,#1 ;单字节传送模式
MOV SENDATA,#00H;数据内容为0,振荡器工作允许,时钟运行开始
ACALL Send_Data ;调用写入DS1302数据程序
RET
;时钟停止程序
Clock_Unable: MOV COMMAND,#80H
MOV BYTECNT,#1
MOV SENDATA,#80H
ACALL Send_Data
RET
;从DS1302的秒,分,时register 中读出数据程序(采用单字节模式)
Read_Sec: MOV COMMAND,#81H ;命令字节为81H
MOV BYTECNT,#1 ;单字节读出模式
ACALL Rec_Data ;调用读出DS1302数据程序
RET
Read_Min: MOV COMMAND,#83H
MOV BYTECNT,#1
ACALL Rec_Data
RET
Read_Hour: MOV COMMAND,#85H
MOV BYTECNT,#1
ACALL Rec_Data
RET
;将分,时数据写入DS1302相应register程序
Send_Min: MOV COMMAND,#82H
MOV BYTECNT,#1
MOV SENDATA,A
ACALL Send_Data
RET
Send_Hour: MOV COMMAND,#84H
MOV BYTECNT,#1
MOV SENDATA,A
ACALL Send_Data
RET
Send_Enable:MOV COMMAND,#8EH
MOV BYTECNT,#1
MOV SENDATA,#00H
ACALL Send_Data
RET
;发送命令字节Send_Cmd程序
;描述:命令字节即DS1302的控制字,要与DS1302通信,首先要发送命令字节(具体作用
;见说明书)
Send_Cmd: CLR RST ;复位pin为低电平所有数据传送终止
NOP ;空操作
CLR SCLK ;使串行时钟信号为低电平
NOP
SETB RST ;在读写数据期间RST只能为高
NOP
MOV A ,COMMAND;将命令字节中的内容送到累加器A
MOV BITCNT,#8 ; BITCNT此时为8位
Sent_Bit:
RRC A ;累加器A的内容和进位标志Cy一起向右环移一位,
;A.0进入Cy,Cy进入A.7
MOV IO,C ;将Cy位中的内容经IO端口送到DS1302中
NOP
SETB SCLK ;SCLK时钟的上沿时数据被写入DS1302
NOP
CLR SCLK
DJNZ BITCNT, Sent_Bit ;BITCNT减1不为0则转移到Sent_Cmd
NOP
RET ;返回主程序
;发送数据程序Sent_Data
;描述:将BYETCNT个字节发送到DS1302中,要发送的数据存放在SENDAT开始的发送
;数据缓冲区中(从P1.1发送到IO),此程序由Sent_Cmd和Sent_Byte两部分组成
Send_Data: ACALL Send_Cmd ;发送命令字节
;下面开始写入字节数据
Sent_Byte0:
MOV R0,#SENDATA;将SENTDATA的地址传给R0
MOV A,@R0 ;将发送数据缓冲区的第一个字节送给A 寄存器间接
;寻址
MOV BITCNT,#8 ;令数据位计数器为8位
Sent_Byte1:
RRC A ;以下7行程序和传送命令是一个道理
MOV IO,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BITCNT,Sent_Byte1;完成一个字节的传送
INC R0 ;R0中的内容自加1即使地址字节加1来到下
;个要传送的缓冲区单元
DJNZ BYTECNT,Sent_Byte0;查看所需传送的字节是否已传完如没有则
;继续传送此为一循环程序
NOP
CLR RST ;复位信号为低所有读写数据停止
RET
;接受数据Rec_Data程序
;描述:从DS1302中读出数据(IO到P1.1),此程序由发送命令字节程序和读出数据程序两部
;分组成,发送的数据字节存放在RECDATA开始的接受数据缓冲区单元中
Rec_Data: ACALL Send_Cmd ;传送命令字节
;下面开始接受数据
Rec_Data0:
CLR A ;清累加器
CLR C ;清Cy
MOV BITCNT,#8
Rec_Data1:
MOV C,IO
SETB SCLK
NOP
CLR SCLK ;SCLK时钟下沿将IO的数据位传送到Cy
RRC A
DJNZ BITCNT,Rec_Data1;查看一个字节是否传完
MOV R1,#RECDATA ;将接受数据缓冲区的开始地址传给R1
MOV @R1,A ;将A的内容传给缓冲区单元
INC R1 ;缓冲区单元地址自加1
DJNZ BYTECNT,Rec_Data0;查看读入字节数是否符合要求
NOP
CLR RST ;所有数据读写终止
RET ;返回主程序
;对在接受数据缓冲区中的秒数据单元分成高四位和低四位分别放在两个显示缓冲单元中的低四位中
Deal_SMH: CLR A ;令累加器A的各位为0
MOV R1,#RECDATA ;将接受数据缓冲区的首地址传送给R1
XCHD A,@R1 ;累加器A的低4位与R1中地址所存储数据的低四
;位交换
MOV DATE2,A ;在低四位存放秒的个位
CLR A
MOV A,@R1
SWAP A
MOV DATE1,A ;在低四位存放秒的十位
ORL DATE2,#30H
ORL DATE1,#30H
RET
Deal_M: ANL DATE1,#0FH
ANL DATE2,#0FH
CLR A
MOV A,DATE1
SWAP A
ORL A,DATE2
RET
Deal_H: ANL DATE1,#0FH
ANL DATE2,#0FH
CLR A
MOV A,DATE1
SWAP A
ORL A,DATE2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -