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

📄 ds1302.lst

📁 时钟芯片将给显示时间
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    003C E5CF      LDI	R28,0x5F
    003D E0D4      LDI	R29,4
    003E BFCD      OUT	0x3D,R28
    003F BFDE      OUT	0x3E,R29
    0040 51C0      SUBI	R28,0x10
    0041 40D0      SBCI	R29,0
    0042 EA0A      LDI	R16,0xAA
    0043 8308      STD	Y+0,R16
    0044 2400      CLR	R0
    0045 E6E0      LDI	R30,0x60
    0046 E0F0      LDI	R31,0
    0047 E010      LDI	R17,0
    0048 36E0      CPI	R30,0x60
    0049 07F1      CPC	R31,R17
    004A F011      BEQ	0x004D
    004B 9201      ST	R0,Z+
    004C CFFB      RJMP	0x0048
    004D 8300      STD	Z+0,R16
    004E E7E8      LDI	R30,0x78
    004F E0F0      LDI	R31,0
    0050 E6A0      LDI	R26,0x60
    0051 E0B0      LDI	R27,0
    0052 E010      LDI	R17,0
    0053 37E8      CPI	R30,0x78
    0054 07F1      CPC	R31,R17
    0055 F021      BEQ	0x005A
    0056 95C8      LPM
    0057 9631      ADIW	R30,1
    0058 920D      ST	R0,X+
    0059 CFF9      RJMP	0x0053
    005A 940E01FC  CALL	_main
_exit:
    005C CFFF      RJMP	_exit
_delay:
  i                    --> R20
  j                    --> R22
  ms                   --> R16
    005D 940E0290  CALL	push_gset2
FILE: D:\卜凡涛单片机\卜凡涛做板\DS1302\xianshi.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define  uchar unsigned char
(0004) #define  uint  unsigned int
(0005) #pragma data:code 
(0006) const  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0007) 		           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0008) void delay(uint ms)
(0009) {
(0010)         uint i,j;
(0011) 	for(i=0;i<ms;i++)
    005F 2744      CLR	R20
    0060 2755      CLR	R21
    0061 C00B      RJMP	0x006D
(0012) 	   {
(0013) 	   for(j=0;j<1141;j++);
    0062 2766      CLR	R22
    0063 2777      CLR	R23
    0064 C002      RJMP	0x0067
    0065 5F6F      SUBI	R22,0xFF
    0066 4F7F      SBCI	R23,0xFF
    0067 3765      CPI	R22,0x75
    0068 E0E4      LDI	R30,4
    0069 077E      CPC	R23,R30
    006A F3D0      BCS	0x0065
    006B 5F4F      SUBI	R20,0xFF
    006C 4F5F      SBCI	R21,0xFF
    006D 1740      CP	R20,R16
    006E 0751      CPC	R21,R17
    006F F390      BCS	0x0062
    0070 940E0284  CALL	pop_gset2
    0072 9508      RET
_show:
  j                    --> R20
  i                    --> R22
    0073 940E0290  CALL	push_gset2
    0075 2F42      MOV	R20,R18
    0076 2F60      MOV	R22,R16
(0014)        }
(0015) }
(0016) void show(uchar i,uchar j)
(0017) { DDRB=0XFF;
    0077 EF8F      LDI	R24,0xFF
    0078 BB87      OUT	0x17,R24
(0018)   DDRD=0X3C;
    0079 E38C      LDI	R24,0x3C
    007A BB81      OUT	0x11,R24
(0019)   PORTB=table[i];
    007B E082      LDI	R24,2
    007C 9F86      MUL	R24,R22
    007D 01F0      MOVW	R30,R0
    007E E584      LDI	R24,0x54
    007F E090      LDI	R25,0
    0080 0FE8      ADD	R30,R24
    0081 1FF9      ADC	R31,R25
    0082 9005      LPM	R0,Z+
    0083 9014      LPM	R1,0(Z)
    0084 01F0      MOVW	R30,R0
    0085 BBE8      OUT	0x18,R30
(0020) 
(0021)   
(0022)   PORTD&=~BIT(j+2);
    0086 2F14      MOV	R17,R20
    0087 5F1E      SUBI	R17,0xFE
    0088 E001      LDI	R16,1
    0089 940E02A9  CALL	lsl8
    008B 2E20      MOV	R2,R16
    008C 9420      COM	R2
    008D B232      IN	R3,0x12
    008E 2032      AND	R3,R2
    008F BA32      OUT	0x12,R3
(0023)   delay(1);
    0090 E001      LDI	R16,1
    0091 E010      LDI	R17,0
    0092 DFCA      RCALL	_delay
    0093 940E0284  CALL	pop_gset2
    0095 9508      RET
_Delayus:
  i                    --> R20
  US                   --> R22
    0096 940E0290  CALL	push_gset2
    0098 01B8      MOVW	R22,R16
FILE: D:\卜凡涛单片机\卜凡涛做板\DS1302\DS1302.c
(0001) #include <iom16v.h>			//包含型号头文件
(0002) #include <macros.h>			//包含"位"操作头文件
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) 
(0006) #define TRUE 1
(0007) #define FALSE 0
(0008) #include "xianshi.C"			//包含1602液晶函数文件
(0009) 
(0010) /******************RTC常量******************/
(0011) #define RTC_CLK   	PC7
(0012) #define RTC_DATA  	PC6
(0013) #define RTC_CS    	PC1
(0014) 	//命令
(0015) #define RD	  	0x01
(0016) #define WR	  	0x00
(0017) #define C_SEC		0x80	//秒
(0018) #define C_MIN		0x82	//分
(0019) #define C_HR		0x84	//时
(0020) #define C_DAY		0x86	//日
(0021) #define C_MTH		0x88	//月
(0022) #define C_WK		0x8A	//星期 DATE
(0023) #define C_YR		0x8C	//年
(0024) #define C_WP		0x8E	//控制(写保护)
(0025) #define C_CHARGE	0x90	//涓流充电
(0026) #define C_BURST		0xBE	//时钟多字节
(0027) 	//配置
(0028) #define CLK_HALT		0x80	//停止时钟控制位    SECOND	bit7
(0029) #define CLK_START		0x00	//启动时钟
(0030) #define M12_24			0x80	//12/24小时值选择位 HOUR		bit7 
(0031) #define PROTECT			0x80	//写保护控制位      CONTROL	bit7 
(0032) #define UPROTECT		0x00	//写保护控制位      CONTROL	bit7 
(0033) 	//涓流充电控制常量
(0034) #define TC_D1R2			0xA5	//high 1 Diode +2K Resistors  
(0035) #define TC_D2R8			0xAB	//low  2 Diodes+8K Resistors  
(0036) #define TC_DISABLED		0x00	//Disabled(TCS<>1010 or DS=00 or RS=00)
(0037) 	//RAM 命令
(0038) #define C_RAMBASE		0xC0	//RAM0~RAM30<<1 地址需左移一位 
(0039) 
(0040) void Delayus(uint US)		  
(0041) {
(0042)  uint i;
(0043)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0099 E005      LDI	R16,5
    009A E010      LDI	R17,0
    009B 019B      MOVW	R18,R22
    009C 940E0274  CALL	empy16s
    009E 01B8      MOVW	R22,R16
    009F 9576      LSR	R23
    00A0 9567      ROR	R22
    00A1 9576      LSR	R23
    00A2 9567      ROR	R22
(0044)  for( i=0;i<US;i++); 
    00A3 2744      CLR	R20
    00A4 2755      CLR	R21
    00A5 C002      RJMP	0x00A8
    00A6 5F4F      SUBI	R20,0xFF
    00A7 4F5F      SBCI	R21,0xFF
    00A8 1746      CP	R20,R22
    00A9 0757      CPC	R21,R23
    00AA F3D8      BCS	0x00A6
    00AB 940E0284  CALL	pop_gset2
    00AD 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    00AE 940E0290  CALL	push_gset2
(0045) }
(0046) void Delayms(uint MS)		  
(0047) {
(0048)  uint i,j;
(0049)  for( i=0;i<MS;i++)
    00B0 2744      CLR	R20
    00B1 2755      CLR	R21
    00B2 C00B      RJMP	0x00BE
(0050)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    00B3 2766      CLR	R22
    00B4 2777      CLR	R23
    00B5 C002      RJMP	0x00B8
    00B6 5F6F      SUBI	R22,0xFF
    00B7 4F7F      SBCI	R23,0xFF
    00B8 3765      CPI	R22,0x75
    00B9 E0E4      LDI	R30,4
    00BA 077E      CPC	R23,R30
    00BB F3D0      BCS	0x00B6
    00BC 5F4F      SUBI	R20,0xFF
    00BD 4F5F      SBCI	R21,0xFF
    00BE 1740      CP	R20,R16
    00BF 0751      CPC	R21,R17
    00C0 F390      BCS	0x00B3
    00C1 940E0284  CALL	pop_gset2
    00C3 9508      RET
(0051) }
(0052) 
(0053) 
(0054) 
(0055) /*******************************************
(0056) 函数名称: DS1302_init
(0057) 功    能: 初始化DS1302的数据接口
(0058) 参    数: 无
(0059) 返回值  : 无
(0060) /********************************************/
(0061) void DS1302_portinit(void)		  
(0062) {
(0063)  DDRC|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
_DS1302_portinit:
    00C4 B384      IN	R24,0x14
    00C5 6C82      ORI	R24,0xC2
    00C6 BB84      OUT	0x14,R24
    00C7 9508      RET
_DS1302_writeB:
  i                    --> R20
  byte                 --> R22
    00C8 940E0290  CALL	push_gset2
    00CA 2F60      MOV	R22,R16
(0064) }
(0065) /*******************************************
(0066) 函数名称: DS1302_writeB
(0067) 功    能: 向DS1302写入一个字节数据(没有RST操作)
(0068) 参    数: byte--要写入的数据
(0069) 返回值  : 无
(0070) /********************************************/
(0071) void DS1302_writeB(uchar byte)
(0072) {
(0073)  uchar i;
(0074)  for(i=0;i<8;i++)		 	  //8位数据计数
    00CB 2744      CLR	R20
    00CC C00C      RJMP	0x00D9
(0075)  {
(0076)   PORTC&=~BIT(RTC_CLK);		  //拉低时钟端
    00CD 98AF      CBI	0x15,7
(0077)   if(byte&0x01)				  //当前位是否是1
    00CE FF60      SBRS	R22,0
    00CF C002      RJMP	0x00D2
(0078)   {
(0079)    PORTC|=BIT(RTC_DATA);	  //当前位是1,拉高数据端
    00D0 9AAE      SBI	0x15,6
(0080)   }
    00D1 C001      RJMP	0x00D3
(0081)   else						  
(0082)   {
(0083)    PORTC&=~BIT(RTC_DATA);	  //当前位是0,拉低数据端
    00D2 98AE      CBI	0x15,6
(0084)   }  
(0085)   Delayus(10);				  //调整时钟和脉冲宽度
    00D3 E00A      LDI	R16,0xA
    00D4 E010      LDI	R17,0
    00D5 DFC0      RCALL	_Delayus
(0086)   PORTC|=BIT(RTC_CLK);		  //时钟上升沿(DS1302采样数据)
    00D6 9AAF      SBI	0x15,7
(0087)   byte>>=1;					  //数据右移1位,为送出新数据位做准备
    00D7 9566      LSR	R22
    00D8 9543      INC	R20
    00D9 3048      CPI	R20,0x8
    00DA F390      BCS	0x00CD
    00DB 940E0284  CALL	pop_gset2
    00DD 9508      RET
_DS1302_readB:
  i                    --> R20
  byte                 --> R22
    00DE 940E0290  CALL	push_gset2
(0088)  }
(0089) }
(0090) /*******************************************
(0091) 函数名称: DS1302_readB
(0092) 功    能: 从DS1302读出一个字节数据(没有RST操作)
(0093) 参    数: 无
(0094) 返回值  : byte--读出的数据
(0095) /********************************************/
(0096) uchar DS1302_readB(void)
(0097) {
(0098)  uchar i,byte=0;
    00E0 2766      CLR	R22
(0099)  DDRC&=~BIT(RTC_DATA);		 //将数据端口设置为输入		  
    00E1 98A6      CBI	0x14,6
(0100)  PORTC&=~BIT(RTC_DATA);		 //无上拉电阻
    00E2 98AE      CBI	0x15,6
(0101)  for(i=0;i<8;i++)			 //8位数据计数
    00E3 2744      CLR	R20
    00E4 C00F      RJMP	0x00F4
(0102)  {
(0103)   byte>>=1;  				 //保存读入的数据位
    00E5 9566      LSR	R22
(0104)   PORTC|=BIT(RTC_CLK);		 //时钟上升沿
    00E6 9AAF      SBI	0x15,7
(0105)   Delayus(10);				 //延时,调整时钟脉冲宽度
    00E7 E00A      LDI	R16,0xA
    00E8 E010      LDI	R17,0
    00E9 DFAC      RCALL	_Delayus
(0106)   PORTC&=~BIT(RTC_CLK);		 //时钟下降沿,DS1302输出数据位
    00EA 98AF      CBI	0x15,7
(0107)   Delayus(10);				 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
    00EB E00A      LDI	R16,0xA
    00EC E010      LDI	R17,0
    00ED DFA8      RCALL	_Delayus
(0108)   if(PINC&BIT(RTC_DATA))	 //当前位是否是高电平
    00EE 9B9E      SBIS	0x13,6
    00EF C002      RJMP	0x00F2
(0109)   {
(0110)    byte|=BIT(PC7);			 //是高电平就将返回数据的当前位置1
    00F0 6860      ORI	R22,0x80
(0111)   }
    00F1 C001      RJMP	0x00F3
(0112)   else
(0113)   {
(0114)    byte&=~BIT(PC7);			 //是低电平就将返回数据的当前位置0
    00F2 776F      ANDI	R22,0x7F
    00F3 9543      INC	R20
    00F4 3048      CPI	R20,0x8
    00F5 F378      BCS	0x00E5
(0115)   }
(0116)  }
(0117)  DDRC|=BIT(RTC_DATA);		 //最后将数据端口设置为输出
    00F6 9AA6      SBI	0x14,6
(0118)  
(0119)  byte=byte/16*10+byte%16;  //BCD码转为二进制
    00F7 E110      LDI	R17,0x10
    00F8 2F06      MOV	R16,R22
    00F9 940E025C  CALL	mod8u

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -