日期、时间的显示与调整
日期、时间的显示与调整
//名字:时钟和日期的显示
//功能:通过按键S4切换显示时钟/日期,通过按键S3选择设置时分秒或者
//星期月日信息,通过S2调整各个参数
//copyright:ylzhjy
//
//寄存器宏定义
WRITE_SECOND EQU 80H
WRITE_MINUITE EQU 82H
WRITE_HOUR EQU 84H
WRITE_DAY EQU 86H
WRITE_MONTH EQU 88H
WRITE_WEEK EQU 8AH
WRITE_YEAR EQU 8CH
READ_SECOND EQU 81H
READ_MINUITE EQU 83H
READ_HOUR EQU 85H
READ_DAY EQU 87H
READ_MONTH EQU 89H
READ_WEEK EQU 8BH
READ_YEAR EQU 8DH
WRITE_PROTECT EQU 8EH
READ_PROTECT EQU 8FH
//管脚定义
SCLK BIT P3.6
IO_DATA BIT P3.4
RST BIT P3.5
BitCnt EQU 30H //数据位计数器
ByteCnt EQU 31H //数据字节计数器
Command EQU 32h // 命令字节地址
ShowText EQU 33H//显示时间、日期,0-时间,1-日期
KeyDat EQU 34H//存储按键信息
KeyNum EQU 35H
RcvDat EQU 40H // 接收数据缓冲区
XmtDat EQU 50H // 发送数据缓冲区
DatBuf EQU 60H
//主程序
ORG 0000H
AJMP 0030H
ORG 0030H
Initial: //初始化程序
MOV ShowText,#0
MOV KeyNum,#0
MOV Command,#0BFH//命令字节为BFh,多数据传输模式
MOV ByteCnt,#8//多字节传送模式,读3个寄存器,即秒、分、时
MOV R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV A,#60H
SUBB A,RcvDat
JNC Initial1
MOV RcvDat,#00H
Initial1:
MOV A,#60H
SUBB A,RcvDat+1
JNC Initial2
MOV RcvDat+1,#00H
Initial2:
MOV A,#24H
SUBB A,RcvDat+2
JNC Initial3
MOV RcvDat+2,#00H
Initial3:
MOV A,#32H
SUBB A,RcvDat+3
JNC Initial4
MOV RcvDat+3,#01H
Initial4:
MOV A,#13H
SUBB A,RcvDat+4
JNC Initial5
MOV RcvDat+4,#01H
Initial5:
MOV A,#08H
SUBB A,RcvDat+5
JNC Initial6
MOV RcvDat+5,#01H
Initial6:
MOV A,#99H
SUBB A,RcvDat+6
JNC Initial7
MOV RcvDat+6,#00H
Initial7:
ACALL Write_Data_Time
//设定时间和日期
Set_Data_Time:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Read_Key0
ajmp Set_Data_Time0
Read_Key0:
acall Delay_Long
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Show_Text
ajmp Set_Data_Time0
Show_Text:
cjne a,#0f7h,Change_Data_Time
mov KeyNum,#0
mov a,ShowText
jz Show_Text0
jnz Show_Text1
Show_Text0:
mov ShowText,#1
ajmp Read_Key2
Show_Text1:
mov ShowText,#0
ajmp Read_Key2
Change_Data_Time:
cjne a,#0fbh,Add_Data_Time
inc KeyNum
mov a,KeyNum
CJNE a,#4,Read_Key3
mov KeyNum,#0
Read_Key3:
ajmp Read_Key2
Add_Data_Time:
cjne a,#0fdh,Sub_Data_Time
mov a,KeyNum
cjne a,#0,Add_Day_Second
ajmp Read_Key2
Add_Day_Second:
cjne a,#1,Add_Month_Minuite
mov a,ShowText
jz Add_Second
jnz Add_Day
Add_Second:
mov a,RcvDat
add a,#1
da a
cjne a,#60h,Add_Second0
mov a,#00h
Add_Second0:
mov RcvDat,a
ajmp Set_End
Add_Day:
mov a,RcvDat+3
add a,#1
da a
cjne a,#32h,Add_Day0
mov a,#01h
Add_Day0:
mov RcvDat+3,a
ajmp Set_End
Add_Month_Minuite:
cjne a,#2,Add_Year_Hour
mov a,ShowText
jz Add_Minuite
jnz Add_Month
Add_Minuite:
mov a,RcvDat+1
add a,#1
da a
cjne a,#60h,Add_Minuite0
mov a,#00h
Add_Minuite0:
mov RcvDat+1,a
ajmp Set_End
Add_Month:
mov a,RcvDat+4
add a,#1
da a
cjne a,#13h,Add_Month0
mov a,#01h
Add_Month0:
mov RcvDat+4,a
ajmp Set_End
Add_Year_Hour:
cjne a,#3,Set_Data_Time0
mov a,ShowText
jz Add_Hour
jnz Add_Year
Add_Hour:
mov a,RcvDat+2
add a,#1
da a
cjne a,#24h,Add_Hour0
mov a,#00h
Add_Hour0:
mov RcvDat+2,a
ajmp Set_End
Add_Year:
mov a,RcvDat+6
add a,#1
da a
cjne a,#00h,Add_Year0
mov a,#00h
Add_Year0:
mov RcvDat+6,a
ajmp Set_End
Sub_Data_Time:
Set_End:
Acall Write_Data_Time
Read_Key2:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Read_Key2
Set_Data_Time0:
ajmp Read_Data_Time
ajmp Set_Data_Time
Write_Data_Time:
MOV Command,#0BEh// ;命令字节为BEh
MOV ByteCnt,#8// ;多字节写入模式此模块为8 个
MOV R0,#XmtDat// 数据地址覆给R0
MOV XmtDat,RcvDat// 秒单元内容为59h
MOV XmtDat+1,RcvDat+1// 分单元内容为59h
MOV XmtDat+2,RcvDat+2// 时单元内容为13h
MOV XmtDat+3,RcvDat+3// 日期单元内容为21h
MOV XmtDat+4,RcvDat+4// 月单元内容为06h
MOV XmtDat+5,RcvDat+5// 星期单元内容为03h
MOV XmtDat+6,RcvDat+6// 年单元内容为00h
MOV XmtDat+7,#00h// 写保护单元内容为00h
ACALL Send_Byte// 调用写入数据子程序
RET
Read_Data_Time:
MOV Command,#0BFH//命令字节为BFh,多数据传输模式
MOV ByteCnt,#8//多字节传送模式,读3个寄存器,即秒、分、时
MOV R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV DatBuf,RcvDat
MOV DatBuf+1,RcvDat+1
MOV DatBuf+2,RcvDat+2
MOV DatBuf+3,RcvDat+3
MOV DatBuf+4,RcvDat+4
MOV DatBuf+5,RcvDat+6
Show_Data_Time:
MOV DPTR,#LEDTAB
MOV ByteCnt,#3//循环3次
MOV R2,#7//选择数码
MOV A,ShowText
JZ Show_Time
JNZ Show_Data
Show_Time:
MOV R1,#DatBuf//数据地址覆给R1
AJMP Show_Data_Time0
Show_Data:
MOV R1,#DatBuf+3//数据地址覆给R1
Show_Data_Time0:
MOV A,KeyNum
JZ Show_Data_Time1
Show_Second_Day:
CJNE A,#1,Show_Month_Minuite
MOV DatBuf+1,#0aaH
MOV DatBuf+2,#0aaH
MOV DatBuf+4,#0aaH
MOV DatBuf+5,#0aaH
AJMP Show_Data_Time1
Show_Month_Minuite:
CJNE A,#2,Show_Year_Hour
MOV DatBuf+0,#0aaH
MOV DatBuf+2,#0aaH
MOV DatBuf+3,#0aaH
MOV DatBuf+5,#0aaH
AJMP Show_Data_Time1
Show_Year_Hour:
CJNE A,#3,Show_Data_Time1
MOV DatBuf+0,#0aaH
MOV DatBuf+1,#0aaH
MOV DatBuf+3,#0aaH
MOV DatBuf+4,#0aaH
//AJMP Show_Data_Time1
Show_Data_Time1:
MOV P2,R2//把数码选择数据送到P2
MOV A,#0FH
ANL A,@R1//和时间数据作与操作,取出低四位数据
MOVC A,@A+DPTR//查表获得数码管显示数据
MOV P0,A
ACALL Delay_Short
MOV P0,#00H
ACALL Delay_Short
DEC R2
MOV P2,R2
MOV A,#0F0H
ANL A,@R1//和时间数据作与操作,取出高四位数据
SWAP A//高四位和低四位互换
MOVC A,@A+DPTR
MOV P0,A
ACALL Delay_Short
MOV P0,#00H
ACALL Delay_Short
//显示时、分、秒间的短横
CJNE R2,#0,Show_T0
AJMP Show_T1
Show_T0:
DEC R2
MOV P2,R2
MOV P0,#40H
DEC R2
INC R1
Show_T1:
ACALL Delay_Short
MOV P0,#00H
ACALL Delay_Short
DJNZ ByteCnt,Show_Data_Time1
ajmp Set_Data_Time
Send_Byte:
CLR RST//复位引脚为低电平所有数据传送终止复位引脚为低电平所有数据传送终止
NOP
CLR SCLK//清时钟总线
NOP
SETB RST//复位引脚为高电平逻辑控制有效
NOP
MOV A,Command
MOV BitCnt,#08h//传送数位为8
S_Byte0://发送命令
RRC A//将最低位传送给进位位C
MOV IO_DATA,C//位传送至数据总线
NOP
SETB SCLK//时钟上升沿发送数据有效
NOP
CLR SCLK//清时钟总线
DJNZ BitCnt,S_Byte0//位传送未完毕则继续
NOP
S_Byte1:
MOV A,@R0
MOV BitCnt,#08h
S_Byte2:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte2
INC R0//发送数据的内存地址加1
DJNZ ByteCnt,S_Byte1//字节传送未完毕则继续
NOP
CLR RST//逻辑操作完毕清RST
RET
Receive_Byte:
CLR RST //复位引脚为低电平所有数据传送终止
NOP
CLR SCLK//清时钟总线
NOP
SETB RST//复位引脚为高电平逻辑控制有效
MOV A,Command//准备发送命令字节
MOV BitCnt,#08h//传送位数为8
R_Byte0:
RRC A//将最低位传送给进位位C
MOV IO_DATA,C//位传送至数据总线
NOP
SETB SCLK//时钟上升沿发送数据有效
NOP
CLR SCLK// 清时钟总线
DJNZ BitCnt,R_Byte0//位传送未完毕则继续
NOP
R_Byte1://准备接收数据
CLR A //清类加器
CLR C//清进位位C
MOV BitCnt,#08h//接收位数为8
NOP
R_Byte2:
MOV C,IO_DATA //数据总线上的数据传送给C
RRC A//从最低位接收数据
SETB SCLK//时钟总线置高
NOP
CLR SCLK //时钟下降沿接收数据有效
DJNZ BitCnt,R_Byte2//位接收未完毕则继续
MOV @R1,A//接收到的完整数据字节放入接收内存缓冲区
INC R1//接收数据的内存地址加1
DJNZ ByteCnt,R_Byte1//字节接收未完毕则继续
NOP
CLR RST//逻辑操作完毕清RST
RET
//用于读取按键值时的延时防抖动操作
Delay_Long:
MOV r4,#0ffh
Delay_L0:
MOV r5,#0ffh
Delay_L1:
djnz r5,Delay_L1
djnz r4,Delay_L0
ret
//用于显示时的延时,让数码管之间能够充分点亮与熄灭,使显示更加清晰
Delay_Short:
MOV r6,#0f0h
Delay_S0:
djnz r6,Delay_S0
ret
LEDTAB:
db 3fh,06h,5bh,4fh,66h
db 6dh,7dh,07h,7fh,6fh
db 40h
END
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |