📄 ds1302.lst
字号:
__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 + -