时钟程序先送上,该日在上图
//寄存器宏定义
WRITE_SECOND EQU 80H
WRITE_MINUITE EQU 82H
WRITE_HOUR EQU 84H
READ_SECOND EQU 81H
READ_MINUITE EQU 83H
READ_HOUR EQU 85H
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 // 命令字节地址
RcvDat EQU 40H // 接收数据缓冲区
XmtDat EQU 50H // 发送数据缓冲区
ORG 0000H
LJMP 0030H
ORG 0030H
Initial:
MOV Command,#0BFH//命令字节为BFh,多数据传输模式
MOV ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV A,#60H
SUBB A,RcvDat
JNC Initial0
MOV RcvDat,#00H
Initial0:
MOV A,#60H
SUBB A,RcvDat+1
JNC Initial1
MOV RcvDat,#00H
Initial1:
MOV A,#24H
SUBB A,RcvDat+2
JNC Initial2
MOV RcvDat,#00H
Initial2:
//允许数据写入
MOV Command,#WRITE_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址赋给R0
MOV XmtDat,#00h// 数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//允许数据读出
MOV Command,#READ_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址赋给R0
MOV XmtDat,#00h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//写入秒初值
MOV Command,#WRITE_SECOND
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入分初值
MOV Command,#WRITE_MINUITE
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat+1//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入时初值
MOV Command,#WRITE_HOUR
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat+2//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//禁止写入数据
MOV Command,#WRITE_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,#80h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//振荡器工作设置
MOV Command,#80h
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,#00h //数据内容为0 振荡器工作允许
ACALL Send_Byte//调用写入数据子程序
Set_Time:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T0
ajmp Read_time
Set_T0:
acall Delay_Short
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T1
ajmp Read_time
Set_T1:
cjne a,#0feh,Set_M0
mov a,RcvDat+2
add a,#1
da a
cjne a,#24h,Set_H0
mov a,#00H
Set_H0:
mov RcvDat+2,a
ajmp Set_H1
Set_M0:
cjne a,#0fdh,Read_time
mov a,RcvDat+1
add a,#1
da a
cjne a,#60h,Set_M1
mov a,#00h
Set_M1:
mov RcvDat+1,a
Set_H1:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_H1
//允许数据写入
MOV Command,#WRITE_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址赋给R0
MOV XmtDat,#00h// 数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//允许数据读出
MOV Command,#READ_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址赋给R0
MOV XmtDat,#00h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//写入秒初值
MOV Command,#WRITE_SECOND
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入分初值
MOV Command,#WRITE_MINUITE
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat+1//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入时初值
MOV Command,#WRITE_HOUR
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat+2//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//禁止写入数据
MOV Command,#WRITE_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,#80h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//振荡器工作设置
MOV Command,#80h
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,#00h //数据内容为0 振荡器工作允许
ACALL Send_Byte//调用写入数据子程序
//读取时分秒数据
Read_Time:
MOV Command,#0BFH//命令字节为BFh,多数据传输模式
MOV ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV DPTR,#LEDTAB
MOV R1,#RcvDat//数据地址覆给R1
MOV ByteCnt,#3//循环3次
MOV R2,#7//选择数码
LOOP0:
MOV P2,R2//把数码选择数据送到P2
MOV A,#0FH
ANL A,@R1//和时间数据作与操作,取出低四位数据
MOVC A,@A+DPTR//查表获得数码管显示数据
MOV P0,A
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
//显示时、分、秒间的短横
CJNE R2,#0,LOOP1
AJMP LOOP2
LOOP1:
DEC R2
MOV P2,R2
MOV P0,#40H
DEC R2
INC R1
LOOP2:
ACALL Delay_Short
DJNZ ByteCnt,LOOP0
AJMP Set_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_Short:
mov r6,#0f0h
dys0:
djnz r6,dys0
ret
LEDTAB:
db 3fh,06h,5bh,4fh,66h
db 6dh,7dh,07h,7fh,67h
END
时间显示程序再次更新,对老程序优化,并添加了可以调节秒的功能,大家多多支持
//寄存器宏定义
WRITE_SECOND EQU 80H
WRITE_MINUITE EQU 82H
WRITE_HOUR EQU 84H
READ_SECOND EQU 81H
READ_MINUITE EQU 83H
READ_HOUR EQU 85H
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 // 命令字节地址
RcvDat EQU 40H // 接收数据缓冲区
XmtDat EQU 50H // 发送数据缓冲区
ORG 0000H
LJMP 0030H
ORG 0030H
Initial:
MOV Command,#0BFH//命令字节为BFh,多数据传输模式
MOV ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV A,#60H
SUBB A,RcvDat
JNC Initial0
MOV RcvDat,#00H
Initial0:
MOV A,#60H
SUBB A,RcvDat+1
JNC Initial1
MOV RcvDat,#00H
Initial1:
MOV A,#24H
SUBB A,RcvDat+2
JNC Write_Time
MOV RcvDat,#00H
AJMP Write_Time
//设定时间,可以设定时,分,秒
Set_Time:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T0
ajmp Read_time
Set_T0:
acall Delay_Short
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_H0
ajmp Read_time
Set_H0:
cjne a,#0feh,Set_M0
mov a,RcvDat+2
add a,#1
da a
cjne a,#24h,Set_H1
mov a,#00H
Set_H1:
mov RcvDat+2,a
ajmp Set_T1
Set_M0:
cjne a,#0fdh,Set_S0
mov a,RcvDat+1
add a,#1
da a
cjne a,#60h,Set_M1
mov a,#00h
Set_M1:
mov RcvDat+1,a
ajmp Set_T1
Set_S0:
cjne a,#0fbh,Read_Time
mov a,RcvDat
add a,#1
da a
cjne a,#60h,Set_S1
mov a,#00h
Set_S1:
mov RcvDat,a
Set_T1:
mov p3,#0ffh
mov a,p3
cjne a,#0ffh,Set_T1
Write_Time:
//允许数据写入
MOV Command,#WRITE_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址赋给R0
MOV XmtDat,#00h// 数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//允许数据读出
MOV Command,#READ_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址赋给R0
MOV XmtDat,#00h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//写入秒初值
MOV Command,#WRITE_SECOND
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入分初值
MOV Command,#WRITE_MINUITE
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat+1//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//写入时初值
MOV Command,#WRITE_HOUR
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,RcvDat+2//数据内容为00h
ACALL Send_Byte//调用写入数据子程序
//禁止写入数据
MOV Command,#WRITE_PROTECT
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,#80h//数据内容为0 写入允许
ACALL Send_Byte //调用写入数据子程序
//振荡器工作设置
MOV Command,#80h
MOV ByteCnt,#1//单字节传送模式
MOV R0,#XmtDat//数据地址覆给R0
MOV XmtDat,#00h //数据内容为0 振荡器工作允许
ACALL Send_Byte//调用写入数据子程序
//读取时分秒数据
Read_Time:
MOV Command,#0BFH//命令字节为BFh,多数据传输模式
MOV ByteCnt,#3//多字节传送模式,读3个寄存器,即秒、分、时
MOV R1,#RcvDat//数据地址覆给R1
ACALL Receive_Byte//调用读出数据子程序
MOV DPTR,#LEDTAB
MOV R1,#RcvDat//数据地址覆给R1
MOV ByteCnt,#3//循环3次
MOV R2,#7//选择数码
LOOP0:
MOV P2,R2//把数码选择数据送到P2
MOV A,#0FH
ANL A,@R1//和时间数据作与操作,取出低四位数据
MOVC A,@A+DPTR//查表获得数码管显示数据
MOV P0,A
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
//显示时、分、秒间的短横
CJNE R2,#0,LOOP1
AJMP LOOP2
LOOP1:
DEC R2
MOV P2,R2
MOV P0,#40H
DEC R2
INC R1
LOOP2:
ACALL Delay_Short
DJNZ ByteCnt,LOOP0
AJMP Set_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_Short:
mov r6,#0f0h
dys0:
djnz r6,dys0
ret
LEDTAB:
db 3fh,06h,5bh,4fh,66h
db 6dh,7dh,07h,7fh,67h
END
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |