📄 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 0807 .byte 8,7
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 1115 .byte 17,21
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 0002 .byte 0,2
.area data(ram, con, rel)
0008 .dbfile D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\ds1302.c
0008 .dbsym e time_buf _time_buf A[8:8]c
.area text(rom, con, rel)
0000 .dbfile D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\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 37
0004 ;
0004 ; #include "iom16v.h"
0004 ;
0004 ; /*复位脚*/
0004 ; #define RST_CLR PORTC &= ~(1 << PC4)/*电平置低*/
0004 ; #define RST_SET PORTC |= (1 << PC4)/*电平置高*/
0004 ; #define RST_IN DDRC &= ~(1 << PC4)/*方向输入*/
0004 ; #define RST_OUT DDRC |= (1 << PC4)/*方向输出*/
0004 ;
0004 ; /*双向数据*/
0004 ; #define IO_CLR PORTC &= ~(1 << PC3)/*电平置低*/
0004 ; #define IO_SET PORTC |= (1 << PC3)/*电平置高*/
0004 ; #define IO_R PINC & (1 << PC3)/*电平读取*/
0004 ; #define IO_IN DDRC &= ~(1 << PC3)/*方向输入*/
0004 ; #define IO_OUT DDRC |= (1 << PC3)/*方向输出*/
0004 ;
0004 ; /*时钟信号*/
0004 ; #define SCK_CLR PORTC &= ~(1 << PC2)/*时钟信号*/
0004 ; #define SCK_SET PORTC |= (1 << PC2)/*电平置高*/
0004 ; #define SCK_IN DDRC &= ~(1 << PC2)/*方向输入*/
0004 ; #define SCK_OUT DDRC |= (1 << PC2)/*方向输出*/
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,0x08,0x07,0x11,0x15,0x00,0x02};
0004 ;
0004 ; /*向DS1302写入一字节数据*/
0004 ; void ds1302_write_byte(unsigned char addr, unsigned char d) {
0004 .dbline 40
0004 ;
0004 ; unsigned char i;
0004 ; RST_SET; /*启动DS1302总线*/
0004 AC9A sbi 0x15,4
0006 .dbline 43
0006 ;
0006 ; /*写入目标地址:addr*/
0006 ; IO_OUT;
0006 A39A sbi 0x14,3
0008 .dbline 44
0008 ; addr = addr & 0xFE;/*最低位置零*/
0008 0E7F andi R16,254
000A .dbline 45
000A 4427 clr R20
000C 09C0 xjmp L5
000E L2:
000E .dbline 45
000E ; for (i = 0; i < 8; i ++) {
000E .dbline 46
000E ; if (addr & 0x01) {
000E 00FF sbrs R16,0
0010 02C0 rjmp L6
0012 .dbline 46
0012 .dbline 47
0012 ; IO_SET;
0012 AB9A sbi 0x15,3
0014 .dbline 48
0014 ; }
0014 01C0 xjmp L7
0016 L6:
0016 .dbline 49
0016 ; else {
0016 .dbline 50
0016 ; IO_CLR;
0016 AB98 cbi 0x15,3
0018 .dbline 51
0018 ; }
0018 L7:
0018 .dbline 52
0018 AA9A sbi 0x15,2
001A .dbline 53
001A AA98 cbi 0x15,2
001C .dbline 54
001C 0695 lsr R16
001E .dbline 55
001E L3:
001E .dbline 45
001E 4395 inc R20
0020 L5:
0020 .dbline 45
0020 4830 cpi R20,8
0022 A8F3 brlo L2
0024 .dbline 58
0024 ; SCK_SET;
0024 ; SCK_CLR;
0024 ; addr = addr >> 1;
0024 ; }
0024 ;
0024 ; /*写入数据:d*/
0024 ; IO_OUT;
0024 A39A sbi 0x14,3
0026 .dbline 59
0026 4427 clr R20
0028 09C0 xjmp L11
002A L8:
002A .dbline 59
002A ; for (i = 0; i < 8; i ++) {
002A .dbline 60
002A ; if (d & 0x01) {
002A 20FF sbrs R18,0
002C 02C0 rjmp L12
002E .dbline 60
002E .dbline 61
002E ; IO_SET;
002E AB9A sbi 0x15,3
0030 .dbline 62
0030 ; }
0030 01C0 xjmp L13
0032 L12:
0032 .dbline 63
0032 ; else {
0032 .dbline 64
0032 ; IO_CLR;
0032 AB98 cbi 0x15,3
0034 .dbline 65
0034 ; }
0034 L13:
0034 .dbline 66
0034 AA9A sbi 0x15,2
0036 .dbline 67
0036 AA98 cbi 0x15,2
0038 .dbline 68
0038 2695 lsr R18
003A .dbline 69
003A L9:
003A .dbline 59
003A 4395 inc R20
003C L11:
003C .dbline 59
003C 4830 cpi R20,8
003E A8F3 brlo L8
0040 .dbline 70
0040 ; SCK_SET;
0040 ; SCK_CLR;
0040 ; d = d >> 1;
0040 ; }
0040 ; RST_CLR; /*停止DS1302总线*/
0040 AC98 cbi 0x15,4
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 74
004C ; }
004C ;
004C ; /*从DS1302读出一字节数据*/
004C ; unsigned char ds1302_read_byte(unsigned char addr) {
004C .dbline 78
004C ;
004C ; unsigned char i;
004C ; unsigned char temp;
004C ; RST_SET; /*启动DS1302总线*/
004C AC9A sbi 0x15,4
004E .dbline 81
004E ;
004E ; /*写入目标地址:addr*/
004E ; IO_OUT;
004E A39A sbi 0x14,3
0050 .dbline 82
0050 ; addr = addr | 0x01;/*最低位置高*/
0050 0160 ori R16,1
0052 .dbline 83
0052 6627 clr R22
0054 09C0 xjmp L18
0056 L15:
0056 .dbline 83
0056 ; for (i = 0; i < 8; i ++) {
0056 .dbline 84
0056 ; if (addr & 0x01) {
0056 00FF sbrs R16,0
0058 02C0 rjmp L19
005A .dbline 84
005A .dbline 85
005A ; IO_SET;
005A AB9A sbi 0x15,3
005C .dbline 86
005C ; }
005C 01C0 xjmp L20
005E L19:
005E .dbline 87
005E ; else {
005E .dbline 88
005E ; IO_CLR;
005E AB98 cbi 0x15,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -