📄 ds1302.lst
字号:
(0118) /*输出数据:temp*/
(0119) IO_IN;
00A5 98A3 CBI 0x14,3
(0120) for (i = 0; i < 8; i ++) {
00A6 2766 CLR R22
00A7 C009 RJMP 0x00B1
(0121) temp = temp >> 1;
00A8 9546 LSR R20
(0122) if (IO_R) {
00A9 9B9B SBIS 0x13,3
00AA C002 RJMP 0x00AD
(0123) temp |= 0x80;
00AB 6840 ORI R20,0x80
(0124) }
00AC C001 RJMP 0x00AE
(0125) else {
(0126) temp &= 0x7F;
00AD 774F ANDI R20,0x7F
(0127) }
(0128) SCK_SET;
00AE 9AAA SBI 0x15,2
(0129) SCK_CLR;
00AF 98AA CBI 0x15,2
00B0 9563 INC R22
00B1 3068 CPI R22,0x8
00B2 F3A8 BCS 0x00A8
(0130) }
(0131)
(0132) RST_CLR; /*停止DS1302总线*/
00B3 98AC CBI 0x15,4
(0133) return temp;
00B4 2F04 MOV R16,R20
00B5 940E0128 CALL pop_gset2
00B7 9508 RET
(0134) }
(0135)
(0136) /*向DS302写入时钟数据*/
(0137) void ds1302_write_time(void) {
(0138)
(0139) ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
_ds1302_write_time:
00B8 2722 CLR R18
00B9 E80E LDI R16,0x8E
00BA DFB4 RCALL _ds1302_write_byte
(0140) ds1302_write_byte(ds1302_sec_add,0x80); //暂停
00BB E820 LDI R18,0x80
00BC E800 LDI R16,0x80
00BD DFB1 RCALL _ds1302_write_byte
(0141) //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
(0142) ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
00BE 91200061 LDS R18,time_buf+1
00C0 E80C LDI R16,0x8C
00C1 DFAD RCALL _ds1302_write_byte
(0143) ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
00C2 91200062 LDS R18,time_buf+2
00C4 E808 LDI R16,0x88
00C5 DFA9 RCALL _ds1302_write_byte
(0144) ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
00C6 91200063 LDS R18,time_buf+3
00C8 E806 LDI R16,0x86
00C9 DFA5 RCALL _ds1302_write_byte
(0145) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00CA 91200067 LDS R18,0x67
00CC E80A LDI R16,0x8A
00CD DFA1 RCALL _ds1302_write_byte
(0146) ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
00CE 91200064 LDS R18,0x64
00D0 E804 LDI R16,0x84
00D1 DF9D RCALL _ds1302_write_byte
(0147) ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
00D2 91200065 LDS R18,0x65
00D4 E802 LDI R16,0x82
00D5 DF99 RCALL _ds1302_write_byte
(0148) ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
00D6 91200066 LDS R18,0x66
00D8 E800 LDI R16,0x80
00D9 DF95 RCALL _ds1302_write_byte
(0149) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00DA 91200067 LDS R18,0x67
00DC E80A LDI R16,0x8A
00DD DF91 RCALL _ds1302_write_byte
(0150) ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
00DE E820 LDI R18,0x80
00DF E80E LDI R16,0x8E
00E0 DF8E RCALL _ds1302_write_byte
00E1 9508 RET
(0151) }
(0152)
(0153) /*从DS302读出时钟数据*/
(0154) void ds1302_read_time(void) {
(0155)
(0156) time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
_ds1302_read_time:
00E2 E80C LDI R16,0x8C
00E3 DFAF RCALL _ds1302_read_byte
00E4 93000061 STS time_buf+1,R16
(0157) time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
00E6 E808 LDI R16,0x88
00E7 DFAB RCALL _ds1302_read_byte
00E8 93000062 STS time_buf+2,R16
(0158) time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
00EA E806 LDI R16,0x86
00EB DFA7 RCALL _ds1302_read_byte
00EC 93000063 STS time_buf+3,R16
(0159) time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
00EE E804 LDI R16,0x84
00EF DFA3 RCALL _ds1302_read_byte
00F0 93000064 STS 0x64,R16
(0160) time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
00F2 E802 LDI R16,0x82
00F3 DF9F RCALL _ds1302_read_byte
00F4 93000065 STS 0x65,R16
(0161) time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
00F6 E800 LDI R16,0x80
00F7 DF9B RCALL _ds1302_read_byte
00F8 2F80 MOV R24,R16
00F9 778F ANDI R24,0x7F
00FA 93800066 STS 0x66,R24
(0162) time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
00FC E80A LDI R16,0x8A
00FD DF95 RCALL _ds1302_read_byte
00FE 93000067 STS 0x67,R16
0100 9508 RET
(0163) }
(0164)
(0165) /*DS302初始化函数*/
(0166) void ds1302_init(void) {
(0167)
(0168) RST_CLR; /*RST脚置低*/
_ds1302_init:
0101 98AC CBI 0x15,4
(0169) SCK_CLR; /*SCK脚置低*/
0102 98AA CBI 0x15,2
(0170) RST_OUT; /*RST脚设置为输出*/
0103 9AA4 SBI 0x14,4
(0171) SCK_OUT; /*SCK脚设置为输出*/
0104 9AA2 SBI 0x14,2
0105 9508 RET
FILE: D:\AVR\我的程序\DS1302的时钟实验\main.c
(0001) /***********************************
(0002) *实验目的:熟悉DS1302编程
(0003) *设 计:萧联珠
(0004) *日 期:2007-11-22
(0005) ************************************/
(0006) #include <iom16v.h>
(0007) #include "cfg.h"
(0008)
(0009) void main()
(0010) {
(0011) unsigned char i;
(0012) ds1302_init();
_main:
i --> R20
0106 DFFA RCALL _ds1302_init
(0013) uart_init();
0107 DF5C RCALL _uart_init
(0014) delay_ms(1000);
0108 EE08 LDI R16,0xE8
0109 E013 LDI R17,3
010A DF44 RCALL _delay_ms
(0015) ds1302_write_time(); //写入时间初始值
010B DFAC RCALL _ds1302_write_time
010C C019 RJMP 0x0126
(0016)
(0017) while(1)
(0018) {
(0019) ds1302_read_time(); //读时间值
010D DFD4 RCALL _ds1302_read_time
(0020) delay_ms(100);
010E E604 LDI R16,0x64
010F E010 LDI R17,0
0110 DF3E RCALL _delay_ms
(0021) for(i=1;i<7;i++)
0111 E041 LDI R20,1
0112 C00E RJMP 0x0121
(0022) {
(0023) while(!(UCSRA&(1<<UDRE))); //等待发送寄存器为空
0113 9B5D SBIS 0x0B,5
0114 CFFE RJMP 0x0113
(0024) delay_ms(10);
0115 E00A LDI R16,0xA
0116 E010 LDI R17,0
0117 DF37 RCALL _delay_ms
(0025) UDR=time_buf[i]; //发送时间数据:年月日周时分秒
0118 E680 LDI R24,0x60
0119 E090 LDI R25,0
011A 2FE4 MOV R30,R20
011B 27FF CLR R31
011C 0FE8 ADD R30,R24
011D 1FF9 ADC R31,R25
011E 8020 LDD R2,Z+0
011F B82C OUT 0x0C,R2
0120 9543 INC R20
0121 3047 CPI R20,7
0122 F380 BCS 0x0113
(0026) }
(0027) delay_ms(100);
FILE: <library>
0123 E604 LDI R16,0x64
0124 E010 LDI R17,0
0125 DF29 RCALL _delay_ms
0126 CFE6 RJMP 0x010D
0127 9508 RET
pop_gset2:
0128 E0E2 LDI R30,2
0129 940C0137 JMP pop
push_gset5:
012B 92FA ST R15,-Y
012C 92EA ST R14,-Y
push_gset4:
012D 92DA ST R13,-Y
012E 92CA ST R12,-Y
push_gset3:
012F 92BA ST R11,-Y
0130 92AA ST R10,-Y
push_gset2:
0131 937A ST R23,-Y
0132 936A ST R22,-Y
push_gset1:
0133 935A ST R21,-Y
0134 934A ST R20,-Y
0135 9508 RET
pop_gset1:
0136 E0E1 LDI R30,1
pop:
0137 9149 LD R20,Y+
0138 9159 LD R21,Y+
0139 FDE0 SBRC R30,0
013A 9508 RET
013B 9169 LD R22,Y+
013C 9179 LD R23,Y+
013D FDE1 SBRC R30,1
013E 9508 RET
013F 90A9 LD R10,Y+
0140 90B9 LD R11,Y+
0141 FDE2 SBRC R30,2
0142 9508 RET
0143 90C9 LD R12,Y+
0144 90D9 LD R13,Y+
0145 FDE3 SBRC R30,3
0146 9508 RET
0147 90E9 LD R14,Y+
0148 90F9 LD R15,Y+
0149 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -