⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m16ds1302.lst

📁 AVR程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -