📄 ds1302.lst
字号:
__text_start:
__start:
002E E5CF LDI R28,0x5F
002F E0D4 LDI R29,4
0030 BFCD OUT 0x3D,R28
0031 BFDE OUT 0x3E,R29
0032 51C0 SUBI R28,0x10
0033 40D0 SBCI R29,0
0034 EA0A LDI R16,0xAA
0035 8308 STD Y+0,R16
0036 2400 CLR R0
0037 E6E8 LDI R30,0x68
0038 E0F0 LDI R31,0
0039 E010 LDI R17,0
003A 36E8 CPI R30,0x68
003B 07F1 CPC R31,R17
003C F011 BEQ 0x003F
003D 9201 ST R0,Z+
003E CFFB RJMP 0x003A
003F 8300 STD Z+0,R16
0040 E5E4 LDI R30,0x54
0041 E0F0 LDI R31,0
0042 E6A0 LDI R26,0x60
0043 E0B0 LDI R27,0
0044 E010 LDI R17,0
0045 35EC CPI R30,0x5C
0046 07F1 CPC R31,R17
0047 F021 BEQ 0x004C
0048 95C8 LPM
0049 9631 ADIW R30,1
004A 920D ST R0,X+
004B CFF9 RJMP 0x0045
004C 940E0106 CALL _main
_exit:
004E CFFF RJMP _exit
_delay_ms:
i --> R20
time --> R16
004F 940E0133 CALL push_gset1
FILE: D:\AVR\我的程序\DS1302的时钟实验\cfg.h
(0001) /*******************************
(0002) *程序名称:功能函数集
(0003) *设 计:萧联珠
(0004) *日 期:2007-11-22
(0005) ********************************/
(0006) #include <iom16v.h>
(0007)
(0008) /*复位脚*/
(0009) #define RST_CLR PORTC &= ~(1 << PC4)/*电平置低*/
(0010) #define RST_SET PORTC |= (1 << PC4)/*电平置高*/
(0011) #define RST_IN DDRC &= ~(1 << PC4)/*方向输入*/
(0012) #define RST_OUT DDRC |= (1 << PC4)/*方向输出*/
(0013)
(0014) /*双向数据*/
(0015) #define IO_CLR PORTC &= ~(1 << PC3)/*电平置低*/
(0016) #define IO_SET PORTC |= (1 << PC3)/*电平置高*/
(0017) #define IO_R PINC & (1 << PC3)/*电平读取*/
(0018) #define IO_IN DDRC &= ~(1 << PC3)/*方向输入*/
(0019) #define IO_OUT DDRC |= (1 << PC3)/*方向输出*/
(0020)
(0021) /*时钟信号*/
(0022) #define SCK_CLR PORTC &= ~(1 << PC2)/*时钟信号*/
(0023) #define SCK_SET PORTC |= (1 << PC2)/*电平置高*/
(0024) #define SCK_IN DDRC &= ~(1 << PC2)/*方向输入*/
(0025) #define SCK_OUT DDRC |= (1 << PC2)/*方向输出*/
(0026)
(0027) #define ds1302_sec_add 0x80 //秒数据地址
(0028) #define ds1302_min_add 0x82 //分数据地址
(0029) #define ds1302_hr_add 0x84 //时数据地址
(0030) #define ds1302_date_add 0x86 //日数据地址
(0031) #define ds1302_month_add 0x88 //月数据地址
(0032) #define ds1302_day_add 0x8a //星期数据地址
(0033) #define ds1302_year_add 0x8c //年数据地址
(0034) #define ds1302_control_add 0x8e //控制数据地址
(0035) #define ds1302_charger_add 0x90
(0036) #define ds1302_clkburst_add 0xbe
(0037)
(0038) unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
(0039)
(0040) /*延时子程序*/
(0041) void delay_ms(int time)
(0042) {
(0043) int i;
(0044) for(;time>0;time--)
0051 C00A RJMP 0x005C
(0045) for(i=0;i<1000;i++);
0052 2744 CLR R20
0053 2755 CLR R21
0054 5F4F SUBI R20,0xFF
0055 4F5F SBCI R21,0xFF
0056 3E48 CPI R20,0xE8
0057 E0E3 LDI R30,3
0058 075E CPC R21,R30
0059 F3D4 BLT 0x0054
005A 5001 SUBI R16,1
005B 4010 SBCI R17,0
005C 2422 CLR R2
005D 2433 CLR R3
005E 1620 CP R2,R16
005F 0631 CPC R3,R17
0060 F38C BLT 0x0052
0061 940E0136 CALL pop_gset1
0063 9508 RET
(0046) }
(0047)
(0048) /*串口初始化*/
(0049) void uart_init()
(0050) {
(0051) UCSRA=0x02; //异步正常模式
_uart_init:
0064 E082 LDI R24,2
0065 B98B OUT 0x0B,R24
(0052) UCSRB=0x18; //允许发送接受中断和使能
0066 E188 LDI R24,0x18
0067 B98A OUT 0x0A,R24
(0053) UCSRC=0x06; //8位数据
0068 E086 LDI R24,6
0069 BD80 OUT 0x20,R24
(0054) UBRRH=0x00;
006A 2422 CLR R2
006B BC20 OUT 0x20,R2
(0055) UBRRL=12; //波特率位9600
006C E08C LDI R24,0xC
006D B989 OUT 0x09,R24
006E 9508 RET
_ds1302_write_byte:
i --> R20
d --> R18
addr --> R16
006F 940E0133 CALL push_gset1
(0056) }
(0057)
(0058)
(0059) /*向DS1302写入一字节数据*/
(0060) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0061)
(0062) unsigned char i;
(0063) RST_SET; /*启动DS1302总线*/
0071 9AAC SBI 0x15,4
(0064)
(0065) /*写入目标地址:addr*/
(0066) IO_OUT;
0072 9AA3 SBI 0x14,3
(0067) addr = addr & 0xFE;/*最低位置零*/
0073 7F0E ANDI R16,0xFE
(0068) for (i = 0; i < 8; i ++) {
0074 2744 CLR R20
0075 C009 RJMP 0x007F
(0069) if (addr & 0x01) {
0076 FF00 SBRS R16,0
0077 C002 RJMP 0x007A
(0070) IO_SET;
0078 9AAB SBI 0x15,3
(0071) }
0079 C001 RJMP 0x007B
(0072) else {
(0073) IO_CLR;
007A 98AB CBI 0x15,3
(0074) }
(0075) SCK_SET;
007B 9AAA SBI 0x15,2
(0076) SCK_CLR;
007C 98AA CBI 0x15,2
(0077) addr = addr >> 1;
007D 9506 LSR R16
007E 9543 INC R20
007F 3048 CPI R20,0x8
0080 F3A8 BCS 0x0076
(0078) }
(0079)
(0080) /*写入数据:d*/
(0081) IO_OUT;
0081 9AA3 SBI 0x14,3
(0082) for (i = 0; i < 8; i ++) {
0082 2744 CLR R20
0083 C009 RJMP 0x008D
(0083) if (d & 0x01) {
0084 FF20 SBRS R18,0
0085 C002 RJMP 0x0088
(0084) IO_SET;
0086 9AAB SBI 0x15,3
(0085) }
0087 C001 RJMP 0x0089
(0086) else {
(0087) IO_CLR;
0088 98AB CBI 0x15,3
(0088) }
(0089) SCK_SET;
0089 9AAA SBI 0x15,2
(0090) SCK_CLR;
008A 98AA CBI 0x15,2
(0091) d = d >> 1;
008B 9526 LSR R18
008C 9543 INC R20
008D 3048 CPI R20,0x8
008E F3A8 BCS 0x0084
(0092) }
(0093) RST_CLR; /*停止DS1302总线*/
008F 98AC CBI 0x15,4
0090 940E0136 CALL pop_gset1
0092 9508 RET
_ds1302_read_byte:
temp --> R20
i --> R22
addr --> R16
0093 940E0131 CALL push_gset2
(0094) }
(0095)
(0096) /*从DS1302读出一字节数据*/
(0097) unsigned char ds1302_read_byte(unsigned char addr) {
(0098)
(0099) unsigned char i;
(0100) unsigned char temp;
(0101) RST_SET; /*启动DS1302总线*/
0095 9AAC SBI 0x15,4
(0102)
(0103) /*写入目标地址:addr*/
(0104) IO_OUT;
0096 9AA3 SBI 0x14,3
(0105) addr = addr | 0x01;/*最低位置高*/
0097 6001 ORI R16,1
(0106) for (i = 0; i < 8; i ++) {
0098 2766 CLR R22
0099 C009 RJMP 0x00A3
(0107) if (addr & 0x01) {
009A FF00 SBRS R16,0
009B C002 RJMP 0x009E
(0108) IO_SET;
009C 9AAB SBI 0x15,3
(0109) }
009D C001 RJMP 0x009F
(0110) else {
(0111) IO_CLR;
009E 98AB CBI 0x15,3
(0112) }
(0113) SCK_SET;
009F 9AAA SBI 0x15,2
(0114) SCK_CLR;
00A0 98AA CBI 0x15,2
(0115) addr = addr >> 1;
00A1 9506 LSR R16
00A2 9563 INC R22
00A3 3068 CPI R22,0x8
00A4 F3A8 BCS 0x009A
(0116) }
(0117)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -