📄 ds1302.lis
字号:
.module ds1302.c
.area data(ram, con, rel)
0000 _time_buf::
0000 .blkb 2
.area idata
0000 2007 .byte 32,7
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 0508 .byte 5,8
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 1615 .byte 22,21
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 0002 .byte 0,2
.area data(ram, con, rel)
0008 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
0008 .dbsym e time_buf _time_buf A[8:8]c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
0000 .dbfunc e ds1302_write_byte _ds1302_write_byte fV
0000 ; i -> R20
0000 ; d -> R18
0000 ; addr -> R16
.even
0000 _ds1302_write_byte::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 43
0004 ; /*
0004 ; DS1302时钟芯片驱动函数
0004 ;
0004 ; DS1302是产品中最常用的时钟芯片,此文件中的代码可以嵌入项目中使用。
0004 ;
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ;
0004 ; /*复位脚*/
0004 ; #define RST_CLR PORTD &= ~(1 << PD7)/*电平置低*/
0004 ; #define RST_SET PORTD |= (1 << PD7)/*电平置高*/
0004 ; #define RST_IN DDRD &= ~(1 << PD7)/*方向输入*/
0004 ; #define RST_OUT DDRD |= (1 << PD7)/*方向输出*/
0004 ;
0004 ; /*双向数据*/
0004 ; #define IO_CLR PORTD &= ~(1 << PD6)/*电平置低*/
0004 ; #define IO_SET PORTD |= (1 << PD6)/*电平置高*/
0004 ; #define IO_R PIND & (1 << PD6)/*电平读取*/
0004 ; #define IO_IN DDRD &= ~(1 << PD6)/*方向输入*/
0004 ; #define IO_OUT DDRD |= (1 << PD6)/*方向输出*/
0004 ;
0004 ; /*时钟信号*/
0004 ; #define SCK_CLR PORTD &= ~(1 << PD5)/*时钟信号*/
0004 ; #define SCK_SET PORTD |= (1 << PD5)/*电平置高*/
0004 ; #define SCK_IN DDRD &= ~(1 << PD5)/*方向输入*/
0004 ; #define SCK_OUT DDRD |= (1 << PD5)/*方向输出*/
0004 ;
0004 ; #define ds1302_sec_add 0x80 //秒数据地址
0004 ; #define ds1302_min_add 0x82 //分数据地址
0004 ; #define ds1302_hr_add 0x84 //时数据地址
0004 ; #define ds1302_date_add 0x86 //日数据地址
0004 ; #define ds1302_month_add 0x88 //月数据地址
0004 ; #define ds1302_day_add 0x8a //星期数据地址
0004 ; #define ds1302_year_add 0x8c //年数据地址
0004 ; #define ds1302_control_add 0x8e //控制数据地址
0004 ; #define ds1302_charger_add 0x90
0004 ; #define ds1302_clkburst_add 0xbe
0004 ;
0004 ; unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
0004 ;
0004 ; /*向DS1302写入一字节数据*/
0004 ; void ds1302_write_byte(unsigned char addr, unsigned char d) {
0004 .dbline 46
0004 ;
0004 ; unsigned char i;
0004 ; RST_SET; /*启动DS1302总线*/
0004 979A sbi 0x12,7
0006 .dbline 49
0006 ;
0006 ; /*写入目标地址:addr*/
0006 ; IO_OUT;
0006 8E9A sbi 0x11,6
0008 .dbline 50
0008 ; addr = addr & 0xFE;/*最低位置零*/
0008 0E7F andi R16,254
000A .dbline 51
000A 4427 clr R20
000C 09C0 xjmp L5
000E L2:
000E .dbline 51
000E ; for (i = 0; i < 8; i ++) {
000E .dbline 52
000E ; if (addr & 0x01) {
000E 00FF sbrs R16,0
0010 02C0 rjmp L6
0012 .dbline 52
0012 .dbline 53
0012 ; IO_SET;
0012 969A sbi 0x12,6
0014 .dbline 54
0014 ; }
0014 01C0 xjmp L7
0016 L6:
0016 .dbline 55
0016 ; else {
0016 .dbline 56
0016 ; IO_CLR;
0016 9698 cbi 0x12,6
0018 .dbline 57
0018 ; }
0018 L7:
0018 .dbline 58
0018 959A sbi 0x12,5
001A .dbline 59
001A 9598 cbi 0x12,5
001C .dbline 60
001C 0695 lsr R16
001E .dbline 61
001E L3:
001E .dbline 51
001E 4395 inc R20
0020 L5:
0020 .dbline 51
0020 4830 cpi R20,8
0022 A8F3 brlo L2
0024 .dbline 64
0024 ; SCK_SET;
0024 ; SCK_CLR;
0024 ; addr = addr >> 1;
0024 ; }
0024 ;
0024 ; /*写入数据:d*/
0024 ; IO_OUT;
0024 8E9A sbi 0x11,6
0026 .dbline 65
0026 4427 clr R20
0028 09C0 xjmp L11
002A L8:
002A .dbline 65
002A ; for (i = 0; i < 8; i ++) {
002A .dbline 66
002A ; if (d & 0x01) {
002A 20FF sbrs R18,0
002C 02C0 rjmp L12
002E .dbline 66
002E .dbline 67
002E ; IO_SET;
002E 969A sbi 0x12,6
0030 .dbline 68
0030 ; }
0030 01C0 xjmp L13
0032 L12:
0032 .dbline 69
0032 ; else {
0032 .dbline 70
0032 ; IO_CLR;
0032 9698 cbi 0x12,6
0034 .dbline 71
0034 ; }
0034 L13:
0034 .dbline 72
0034 959A sbi 0x12,5
0036 .dbline 73
0036 9598 cbi 0x12,5
0038 .dbline 74
0038 2695 lsr R18
003A .dbline 75
003A L9:
003A .dbline 65
003A 4395 inc R20
003C L11:
003C .dbline 65
003C 4830 cpi R20,8
003E A8F3 brlo L8
0040 .dbline 76
0040 ; SCK_SET;
0040 ; SCK_CLR;
0040 ; d = d >> 1;
0040 ; }
0040 ; RST_CLR; /*停止DS1302总线*/
0040 9798 cbi 0x12,7
0042 .dbline -2
0042 L1:
0042 0E940000 xcall pop_gset1
0046 .dbline 0 ; func end
0046 0895 ret
0048 .dbsym r i 20 c
0048 .dbsym r d 18 c
0048 .dbsym r addr 16 c
0048 .dbend
0048 .dbfunc e ds1302_read_byte _ds1302_read_byte fc
0048 ; temp -> R20
0048 ; i -> R22
0048 ; addr -> R16
.even
0048 _ds1302_read_byte::
0048 0E940000 xcall push_gset2
004C .dbline -1
004C .dbline 80
004C ; }
004C ;
004C ; /*从DS1302读出一字节数据*/
004C ; unsigned char ds1302_read_byte(unsigned char addr) {
004C .dbline 84
004C ;
004C ; unsigned char i;
004C ; unsigned char temp;
004C ; RST_SET; /*启动DS1302总线*/
004C 979A sbi 0x12,7
004E .dbline 87
004E ;
004E ; /*写入目标地址:addr*/
004E ; IO_OUT;
004E 8E9A sbi 0x11,6
0050 .dbline 88
0050 ; addr = addr | 0x01;/*最低位置高*/
0050 0160 ori R16,1
0052 .dbline 89
0052 6627 clr R22
0054 09C0 xjmp L18
0056 L15:
0056 .dbline 89
0056 ; for (i = 0; i < 8; i ++) {
0056 .dbline 90
0056 ; if (addr & 0x01) {
0056 00FF sbrs R16,0
0058 02C0 rjmp L19
005A .dbline 90
005A .dbline 91
005A ; IO_SET;
005A 969A sbi 0x12,6
005C .dbline 92
005C ; }
005C 01C0 xjmp L20
005E L19:
005E .dbline 93
005E ; else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -