⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -