📄 m16ds1302.lst
字号:
(0036) #define DS1302_H
(0037)
(0038) #define DS1302RstOut DDRD |= (1<<7)
(0039) #define DS1302IOIn DDRD &=~(1<<6)
(0040) #define DS1302IOOut DDRD |= (1<<6)
(0041) #define DS1302SckOut DDRD |= (1<<5)
(0042)
(0043) #define DS1302DataIn (PIND & (1<<6))
(0044) #define DS1302DataSet PORTD |= (1<<6)
(0045) #define DS1302DataClr PORTD &=~(1<<6)
(0046)
(0047) #define DS1302SckSet PORTD |= (1<<5)
(0048) #define DS1302SckClr PORTD &=~(1<<5)
(0049)
(0050) #define DS1302RstSet PORTD |= (1<<7)
(0051) #define DS1302RstClr PORTD &=~(1<<7)
(0052)
(0053) //#define DS1302WrAdd 0x80
(0054) //#define DS1302RdAdd 0x81
(0055)
(0056) uchar AA;
(0057)
(0058) /********************************************************************
(0059) 函 数 名:DS1302WrByte()
(0060) 功 能:实时时钟写入一字节
(0061) 说 明:往DS1302写入1Byte数据 (内部函数)
(0062) 入口参数:d 写入的数据
(0063) 返 回 值:无
(0064) ***********************************************************************/
(0065) void DS1302WrByte(uchar x)
(0066) {
(0067) uchar i;
(0068) DS1302IOOut;
007C 9A8E SBI 0x11,6
(0069) for (i = 0; i < 8; i ++)
007D 2744 CLR R20
007E C00D RJMP 0x008C
(0070) {
(0071) if (x&(1<<i))
007F E001 LDI R16,1
0080 2F14 MOV R17,R20
0081 940E01B5 CALL lsl8
0083 2E26 MOV R2,R22
0084 2220 AND R2,R16
0085 F011 BEQ 0x0088
(0072) {
(0073)
(0074) DS1302DataSet;
0086 9A96 SBI 0x12,6
(0075) }
0087 C001 RJMP 0x0089
(0076) else
(0077) {
(0078) DS1302DataClr;
0088 9896 CBI 0x12,6
(0079) }
(0080) DS1302SckSet; /* CLK to H */
0089 9A95 SBI 0x12,5
(0081)
(0082) DS1302SckClr; /* CLK to L */
008A 9895 CBI 0x12,5
008B 9543 INC R20
008C 3048 CPI R20,0x8
008D F388 BCS 0x007F
008E 940E0193 CALL pop_gset2
0090 9508 RET
_DS1302RdByte:
k --> R20
i --> R22
0091 940E019C CALL push_gset2
(0083) }
(0084)
(0085) }
(0086)
(0087) /********************************************************************
(0088) 函 数 名:uchar DS1302RdByte(void)
(0089) 功 能:实时时钟读取一字节
(0090) 说 明:从DS1302读取1Byte数据 (内部函数)
(0091) 入口参数:无
(0092) 返 回 值:ACC
(0093) ***********************************************************************/
(0094) uchar DS1302RdByte(void)
(0095) {
(0096) uchar i,k;
(0097) DS1302IOIn;
0093 988E CBI 0x11,6
(0098) for (i = 0; i < 8; i ++)
0094 2766 CLR R22
0095 C01B RJMP 0x00B1
(0099) {
(0100) k = DS1302DataIn; /*读数据,从低位开始 */
0096 B340 IN R20,0x10
0097 7440 ANDI R20,0x40
(0101) if (k)
0098 F051 BEQ 0x00A3
(0102) {
(0103) AA|=(1<<i);
0099 E001 LDI R16,1
009A 2F16 MOV R17,R22
009B 940E01B5 CALL lsl8
009D 90200063 LDS R2,AA
009F 2A20 OR R2,R16
00A0 92200063 STS AA,R2
(0104) }
00A2 C00B RJMP 0x00AE
(0105) else
(0106) {
(0107) AA&=~(1<<i);
00A3 E001 LDI R16,1
00A4 2F16 MOV R17,R22
00A5 940E01B5 CALL lsl8
00A7 2E20 MOV R2,R16
00A8 9420 COM R2
00A9 90300063 LDS R3,AA
00AB 2032 AND R3,R2
00AC 92300063 STS AA,R3
(0108) }
(0109) DS1302SckSet; /* CLK to H */
00AE 9A95 SBI 0x12,5
(0110) DS1302SckClr; /* CLK to L */
00AF 9895 CBI 0x12,5
00B0 9563 INC R22
00B1 3068 CPI R22,0x8
00B2 F318 BCS 0x0096
(0111) }
(0112) DS1302SckSet; /* CLK to H */
00B3 9A95 SBI 0x12,5
(0113)
(0114) DS1302SckClr; /* CLK to L */
00B4 9895 CBI 0x12,5
(0115) DS1302IOOut;
00B5 9A8E SBI 0x11,6
(0116) return AA;
00B6 91000063 LDS R16,AA
00B8 940E0193 CALL pop_gset2
00BA 9508 RET
_DS1302Write:
ucDa --> R20
ucAddr --> R22
00BB 940E019C CALL push_gset2
00BD 2F42 MOV R20,R18
00BE 2F60 MOV R22,R16
(0117) }
(0118)
(0119) /********************************************************************
(0120) 函 数 名:void DS1302Write(uchar ucAddr, uchar ucDa)
(0121) 功 能:往DS1302写入数据
(0122) 说 明:先写地址,后写命令/数据 (内部函数)
(0123) 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
(0124) 返 回 值:无
(0125) ***********************************************************************/
(0126) void DS1302Write(uchar ucAddr, uchar ucDa)
(0127) {
(0128) DS1302RstClr; /* RST to L */
00BF 9897 CBI 0x12,7
(0129) DS1302SckClr; /* CLK to L */
00C0 9895 CBI 0x12,5
(0130) DS1302RstSet; /* RST to H */
00C1 9A97 SBI 0x12,7
(0131)
(0132) DS1302WrByte(ucAddr); /* 地址,命令 */
00C2 2F06 MOV R16,R22
00C3 DFB5 RCALL _DS1302WrByte
(0133) DS1302WrByte(ucDa); /* 写1Byte数据*/
00C4 2F04 MOV R16,R20
00C5 DFB3 RCALL _DS1302WrByte
(0134)
(0135) DS1302SckSet; /* CLK to H */
00C6 9A95 SBI 0x12,5
(0136) DS1302RstClr; /* RST to L */
00C7 9897 CBI 0x12,7
00C8 940E0193 CALL pop_gset2
00CA 9508 RET
_DS1302Read:
ucData --> R20
ucAddr --> R20
00CB 940E019E CALL push_gset1
00CD 2F40 MOV R20,R16
(0137) }
(0138)
(0139) /********************************************************************
(0140) 函 数 名:uchar DS1302Read(uchar ucAddr)
(0141) 功 能:读取DS1302某地址的数据
(0142) 说 明:先写地址,后读命令/数据 (内部函数)
(0143) 入口参数:ucAddr: DS1302地址
(0144) 返 回 值:ucData :读取的数据
(0145) ***********************************************************************/
(0146) uchar DS1302Read(uchar ucAddr)
(0147) {
(0148) uchar ucData;
(0149) DS1302RstClr; /* RST to L */
00CE 9897 CBI 0x12,7
(0150) DS1302SckClr; /* CLK to L */
00CF 9895 CBI 0x12,5
(0151) DS1302RstSet; /* RST to H */
00D0 9A97 SBI 0x12,7
(0152) DS1302WrByte(ucAddr); /* 地址,命令 */
00D1 2F04 MOV R16,R20
00D2 DFA6 RCALL _DS1302WrByte
(0153) ucData = DS1302RdByte(); /* 读1Byte数据 */
00D3 DFBD RCALL _DS1302RdByte
00D4 2F40 MOV R20,R16
(0154)
(0155) DS1302SckSet; /* CLK to H */
00D5 9A95 SBI 0x12,5
(0156) // PORTD |= (1<<7);
(0157) DS1302RstClr; /* RST to L */
00D6 9897 CBI 0x12,7
(0158) return ucData;
00D7 940E01A1 CALL pop_gset1
00D9 9508 RET
_DS1302SetTime:
second --> Y+4
minutes --> R22
hour --> R20
00DA 940E019C CALL push_gset2
00DC 2F62 MOV R22,R18
00DD 2F40 MOV R20,R16
(0159) }
(0160) /*-----------------------------------------------------------------
(0161) 函数名称: void DS1302SetTime(uchar hour,uchar minutes,uchar second)
(0162) 函数功能: DS1302时间设定
(0163) 参 数: uchar hour,uchar minutes,uchar second
(0164) 返 回 值: 无
(0165) -----------------------------------------------------------------*/
(0166) void DS1302SetTime(uchar hour,uchar minutes,uchar second)
(0167) {
(0168) DS1302Write(0x80,second);
00DE 812C LDD R18,Y+4
00DF E800 LDI R16,0x80
00E0 DFDA RCALL _DS1302Write
(0169) DS1302Write(0x82,minutes);
00E1 2F26 MOV R18,R22
00E2 E802 LDI R16,0x82
00E3 DFD7 RCALL _DS1302Write
(0170) DS1302Write(0x84,hour);
00E4 2F24 MOV R18,R20
00E5 E804 LDI R16,0x84
00E6 DFD4 RCALL _DS1302Write
00E7 940E0193 CALL pop_gset2
00E9 9508 RET
_DS1302GetTime:
time --> R20
00EA 940E019E CALL push_gset1
00EC 01A8 MOVW R20,R16
(0171) }
(0172) /*-----------------------------------------------------------------
(0173) 函数名称: void DS1302GetTime(uchar *time)
(0174) 函数功能: 读DS1302时间
(0175) 参 数: uchar hour,uchar minutes,uchar second
(0176) 返 回 值: 无
(0177) -----------------------------------------------------------------*/
(0178) void DS1302GetTime(uchar *time)
(0179) {
(0180) *time++ = DS1302Read(0x85);
00ED E805 LDI R16,0x85
00EE DFDC RCALL _DS1302Read
00EF 01FA MOVW R30,R20
00F0 9301 ST R16,Z+
00F1 01AF MOVW R20,R30
(0181) *time++ = DS1302Read(0x83);
00F2 E803 LDI R16,0x83
00F3 DFD7 RCALL _DS1302Read
00F4 01FA MOVW R30,R20
00F5 9301 ST R16,Z+
00F6 01AF MOVW R20,R30
(0182) *time++ = DS1302Read(0x81);
00F7 E801 LDI R16,0x81
00F8 DFD2 RCALL _DS1302Read
00F9 01FA MOVW R30,R20
00FA 9301 ST R16,Z+
00FB 01AF MOVW R20,R30
00FC 940E01A1 CALL pop_gset1
00FE 9508 RET
(0183) }
(0184) /*-----------------------------------------------------------------
(0185) 函数名称: void DS1302Init(void)
(0186) 函数功能: 初始化时钟端口信息
(0187) 参 数:
(0188) 返 回 值: 无
(0189) -----------------------------------------------------------------*/
(0190) void DS1302Init(void)
(0191) {
(0192) DS1302RstOut; //DS1302复位信号设置为输出
_DS1302Init:
00FF 9A8F SBI 0x11,7
(0193) DS1302IOOut; //DS1302数据信号设置为输出
0100 9A8E SBI 0x11,6
(0194) DS1302SckOut; //DS1302时钟信号设定为输出
0101 9A8D SBI 0x11,5
0102 9508 RET
FILE: F:\job\M16学习板\DS1302时钟(实验十三)\M16DS1302.c
(0001) /*******************************************************************
(0002) 实验十三
(0003) 实验名称: DS1302时钟实验
(0004) 实验目的: 学习AVR单片机读写时钟芯片,综合应用定时器中断溢出,串口通信
(0005) 实验现象: 每隔4SPC机得一时间,十六进制格式
(0006) 环 境: ICCAVR6.31A
(0007) 设 计 者: shinea8868
(0008) 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
(0009) 作商业用途请保留本段文字
(0010) 完成日期: 2007年4月11日
(0011) *******************************************************************/
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014) #include "..\ICC_H\SOFTWARE.H"
(0015) #include "..\ICC_H\DS1302.H"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -