这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » ylzhjy MCU DIY进程帖

共13条 2/2 1 2 跳转至
工程师
2011-12-14 08:21:41     打赏
11楼

日期、时间的显示与调整


工程师
2011-12-14 08:23:00     打赏
12楼

日期、时间的显示与调整
//名字:时钟和日期的显示
//功能:通过按键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


工程师
2011-12-14 12:33:05     打赏
13楼

蜂鸣器无法工作


共13条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]