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

📄 ds1302.lis

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module ds1302.c
                        .area text(rom, con, rel)
 0000                   .dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302/YJ1602.C
 0000                   .dbfunc e LCD1602_portini _LCD1602_portini fV
                        .even
 0000           _LCD1602_portini::
 0000                   .dbline -1
 0000                   .dbline 50
 0000           ; #include <iom16v.h>                   //包含型号头文件
 0000           ; #include <macros.h>                   //包含"位"操作头文件
 0000           ; #define uchar unsigned char
 0000           ; #define uint unsigned int
 0000           ; 
 0000           ; #define TRUE 1
 0000           ; #define FALSE 0
 0000           ; #include "YJ1602.C"                   //包含1602液晶函数文件
 0000           ; 
 0000           ; /******************RTC常量******************/
 0000           ; #define RTC_CLK       PB7
 0000           ; #define RTC_DATA      PB5
 0000           ; #define RTC_CS        PC7
 0000           ;       //命令
 0000           ; #define RD            0x01
 0000           ; #define WR            0x00
 0000           ; #define C_SEC         0x80    //秒
 0000           ; #define C_MIN         0x82    //分
 0000           ; #define C_HR          0x84    //时
 0000           ; #define C_DAY         0x86    //日
 0000           ; #define C_MTH         0x88    //月
 0000           ; #define C_WK          0x8A    //星期 DATE
 0000           ; #define C_YR          0x8C    //年
 0000           ; #define C_WP          0x8E    //控制(写保护)
 0000           ; #define C_CHARGE      0x90    //涓流充电
 0000           ; #define C_BURST               0xBE    //时钟多字节
 0000           ;       //配置
 0000           ; #define CLK_HALT              0x80    //停止时钟控制位    SECOND      bit7
 0000           ; #define CLK_START             0x00    //启动时钟
 0000           ; #define M12_24                        0x80    //12/24小时值选择位 HOUR                bit7 
 0000           ; #define PROTECT                       0x80    //写保护控制位      CONTROL     bit7 
 0000           ; #define UPROTECT              0x00    //写保护控制位      CONTROL     bit7 
 0000           ;       //涓流充电控制常量
 0000           ; #define TC_D1R2                       0xA5    //high 1 Diode +2K Resistors  
 0000           ; #define TC_D2R8                       0xAB    //low  2 Diodes+8K Resistors  
 0000           ; #define TC_DISABLED           0x00    //Disabled(TCS<>1010 or DS=00 or RS=00)
 0000           ;       //RAM 命令
 0000           ; #define C_RAMBASE             0xC0    //RAM0~RAM30<<1 地址需左移一位 
 0000           ; 
 0000           ; void Delayus(uint US)           
 0000           ; {
 0000           ;  uint i;
 0000           ;  US=US*5/4;                    //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
 0000           ;  for( i=0;i<US;i++); 
 0000           ; }
 0000           ; void Delayms(uint MS)           
 0000           ; {
 0000           ;  uint i,j;
 0000           ;  for( i=0;i<MS;i++)
 0000           ;  for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
 0000                   .dbline 51
 0000           ; }
 0000 81B3              in R24,0x11
 0002 8067              ori R24,112
 0004 81BB              out 0x11,R24
 0006                   .dbline 52
 0006           ; 
 0006 87B3              in R24,0x17
 0008 8F6F              ori R24,255
 000A 87BB              out 0x17,R24
 000C                   .dbline -2
 000C                   .dbline 53
 000C           ; 
 000C           L1:
 000C                   .dbline 0 ; func end
 000C 0895              ret
 000E                   .dbend
 000E                   .dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
 000E           ;          dByte -> R20
 000E           ;         DatCmd -> R20
                        .even
 000E           _LCD1602_readbyte::
 000E 0E940000          xcall push_gset1
 0012 402F              mov R20,R16
 0014                   .dbline -1
 0014                   .dbline 61
 0014           ; 
 0014           ; /*******************************************
 0014           ; 函数名称: DS1302_init
 0014           ; 功    能: 初始化DS1302的数据接口
 0014           ; 参    数: 无
 0014           ; 返回值  : 无
 0014           ; /********************************************/
 0014           ; void DS1302_portinit(void)              
 0014                   .dbline 63
 0014           ; {
 0014           ;  DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
 0014 4423              tst R20
 0016 11F4              brne L3
 0018                   .dbline 64
 0018           ; }
 0018 9498              cbi 0x12,4
 001A 01C0              xjmp L4
 001C           L3:
 001C                   .dbline 66
 001C           ; /*******************************************
 001C           ; 函数名称: DS1302_writeB
 001C 949A              sbi 0x12,4
 001E           L4:
 001E                   .dbline 68
 001E           ; 功    能: 向DS1302写入一个字节数据(没有RST操作)
 001E           ; 参    数: byte--要写入的数据
 001E 959A              sbi 0x12,5
 0020                   .dbline 69
 0020           ; 返回值  : 无
 0020 969A              sbi 0x12,6
 0022                   .dbline 70
 0022           ; /********************************************/
 0022 2224              clr R2
 0024 27BA              out 0x17,R2
 0026                   .dbline 71
 0026           ; void DS1302_writeB(uchar byte)
 0026 46B3              in R20,0x16
 0028                   .dbline 72
 0028           ; {
 0028 01E0              ldi R16,1
 002A 10E0              ldi R17,0
 002C 84D0              xcall _Delayms
 002E                   .dbline 73
 002E           ;  uchar i;
 002E 9698              cbi 0x12,6
 0030                   .dbline 74
 0030           ;  for(i=0;i<8;i++)                       //8位数据计数
 0030 87B3              in R24,0x17
 0032 8F6F              ori R24,255
 0034 87BB              out 0x17,R24
 0036                   .dbline 75
 0036           ;  {
 0036 042F              mov R16,R20
 0038                   .dbline -2
 0038           L2:
 0038 0E940000          xcall pop_gset1
 003C                   .dbline 0 ; func end
 003C 0895              ret
 003E                   .dbsym r dByte 20 c
 003E                   .dbsym r DatCmd 20 c
 003E                   .dbend
 003E                   .dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
 003E           ;          dByte -> R20
 003E           ;         DatCmd -> R22
                        .even
 003E           _LCD1602_sendbyte::
 003E 0E940000          xcall push_gset2
 0042 422F              mov R20,R18
 0044 602F              mov R22,R16
 0046                   .dbline -1
 0046                   .dbline 85
 0046           ;   PORTB&=~BIT(RTC_CLK);                 //拉低时钟端
 0046           ;   if(byte&0x01)                                 //当前位是否是1
 0046           ;   {
 0046           ;    PORTB|=BIT(RTC_DATA);        //当前位是1,拉高数据端
 0046           ;   }
 0046           ;   else                                                  
 0046           ;   {
 0046           ;    PORTB&=~BIT(RTC_DATA);       //当前位是0,拉低数据端
 0046           ;   }  
 0046           ;   Delayus(10);                                  //调整时钟和脉冲宽度
 0046                   .dbline 86
 0046           ;   PORTB|=BIT(RTC_CLK);                  //时钟上升沿(DS1302采样数据)
 0046 6623              tst R22
 0048 11F4              brne L6
 004A                   .dbline 87
 004A           ;   byte>>=1;                                     //数据右移1位,为送出新数据位做准备
 004A 9498              cbi 0x12,4
 004C 01C0              xjmp L7
 004E           L6:
 004E                   .dbline 89
 004E           ;  }
 004E           ; }
 004E 949A              sbi 0x12,4
 0050           L7:
 0050                   .dbline 91
 0050           ; /*******************************************
 0050           ; 函数名称: DS1302_readB
 0050 9598              cbi 0x12,5
 0052                   .dbline 92
 0052           ; 功    能: 从DS1302读出一个字节数据(没有RST操作)
 0052 969A              sbi 0x12,6
 0054                   .dbline 93
 0054           ; 参    数: 无
 0054 48BB              out 0x18,R20
 0056                   .dbline 94
 0056           ; 返回值  : byte--读出的数据
 0056 01E0              ldi R16,1
 0058 10E0              ldi R17,0
 005A 6DD0              xcall _Delayms
 005C                   .dbline 95
 005C           ; /********************************************/
 005C 9698              cbi 0x12,6
 005E                   .dbline -2
 005E                   .dbline 96
 005E           ; uchar DS1302_readB(void)
 005E           L5:
 005E 0E940000          xcall pop_gset2
 0062                   .dbline 0 ; func end
 0062 0895              ret
 0064                   .dbsym r dByte 20 c
 0064                   .dbsym r DatCmd 22 c
 0064                   .dbend
 0064                   .dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
 0064           ;       ptString -> R20,R21
                        .even
 0064           _LCD1602_sendstr::
 0064 0E940000          xcall push_gset1
 0068 A801              movw R20,R16
 006A                   .dbline -1
 006A                   .dbline 104
 006A           ; {
 006A           ;  uchar i,byte=0;
 006A           ;  DDRB&=~BIT(RTC_DATA);                 //将数据端口设置为输入           
 006A           ;  PORTB&=~BIT(RTC_DATA);                //无上拉电阻
 006A           ;  for(i=0;i<8;i++)                      //8位数据计数
 006A           ;  {
 006A           ;   byte>>=1;                            //保存读入的数据位
 006A           ;   PORTB|=BIT(RTC_CLK);                 //时钟上升沿
 006A 05C0              xjmp L10
 006C           L9:
 006C                   .dbline 106
 006C                   .dbline 107
 006C FA01              movw R30,R20
 006E 2191              ld R18,Z+
 0070 AF01              movw R20,R30
 0072 01E0              ldi R16,1
 0074 E4DF              xcall _LCD1602_sendbyte
 0076                   .dbline 108
 0076           L10:
 0076                   .dbline 105
 0076           ;   Delayus(10);                                 //延时,调整时钟脉冲宽度
 0076 FA01              movw R30,R20
 0078 2080              ldd R2,z+0
 007A 2220              tst R2
 007C B9F7              brne L9
 007E                   .dbline -2
 007E                   .dbline 109
 007E           ;   PORTB&=~BIT(RTC_CLK);                //时钟下降沿,DS1302输出数据位
 007E           ;   Delayus(10);                                 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
 007E           ;   if(PINB&BIT(RTC_DATA))       //当前位是否是高电平
 007E           ;   {
 007E           L8:
 007E 0E940000          xcall pop_gset1
 0082                   .dbline 0 ; func end
 0082 0895              ret
 0084                   .dbsym r ptString 20 pc
 0084                   .dbend
 0084                   .dbfunc e LCD1602_clear _LCD1602_clear fV
                        .even
 0084           _LCD1602_clear::
 0084                   .dbline -1
 0084                   .dbline 117
 0084           ;    byte|=BIT(PB7);                     //是高电平就将返回数据的当前位置1
 0084           ;   }
 0084           ;   else
 0084           ;   {
 0084           ;    byte&=~BIT(PB7);                    //是低电平就将返回数据的当前位置0
 0084           ;   }
 0084           ;  }
 0084           ;  DDRB|=BIT(RTC_DATA);          //最后将数据端口设置为输出
 0084                   .dbline 118
 0084           ;  return byte;                          //返回读出的数据
 0084 21E0              ldi R18,1
 0086 0027              clr R16
 0088 DADF              xcall _LCD1602_sendbyte
 008A                   .dbline 119
 008A           ; }
 008A 02E0              ldi R16,2
 008C 10E0              ldi R17,0
 008E                   .dbline -2
 008E                   .dbline 120
 008E           ; /*******************************************
 008E           L12:
 008E                   .dbline 0 ; func end
 008E 53C0              xjmp _Delayms
 0090                   .dbend
 0090                   .dbfunc e LCD1602_readBF _LCD1602_readBF fc
 0090           ;           busy -> R20
                        .even
 0090           _LCD1602_readBF::
 0090 0E940000          xcall push_gset1
 0094                   .dbline -1
 0094                   .dbline 128
 0094           ; 函数名称: DS1302_writeD
 0094           ; 功    能: 向DS1302的某个地址写入一个字节数据
 0094           ; 参    数: addr--地址值(寄存器或RAM)
 0094           ;                 data--要写入的地址
 0094           ; 返回值  : 无
 0094           ; /********************************************/
 0094           ; void DS1302_writeD(uchar addr,uchar data)
 0094           ; {
 0094                   .dbline 130
 0094           ;  PORTC&=~BIT(RTC_CS);  //拉低片选端
 0094           ;  PORTB&=~BIT(RTC_CLK);         //拉低时钟端
 0094 0027              clr R16
 0096 BBDF              xcall _LCD1602_readbyte
 0098 402F              mov R20,R16
 009A                   .dbline 131
 009A           ;  Delayus(10);
 009A 07FF              sbrs R16,7
 009C 02C0              rjmp L14
 009E                   .dbline 132
 009E           ;  PORTC|=BIT(RTC_CS);   //拉高片选端
 009E 41E0              ldi R20,1
 00A0 01C0              xjmp L15
 00A2           L14:
 00A2                   .dbline 134
 00A2           ;  Delayus(10);                          //调整片选脉冲
 00A2           ;  DS1302_writeB(addr);  //写入操作命令(地址)
 00A2 4427              clr R20
 00A4           L15:
 00A4                   .dbline 135
 00A4           ;  Delayus(10);
 00A4 042F              mov R16,R20
 00A6                   .dbline -2
 00A6           L13:
 00A6 0E940000          xcall pop_gset1
 00AA                   .dbline 0 ; func end
 00AA 0895              ret
 00AC                   .dbsym r busy 20 c
 00AC                   .dbend
 00AC                   .dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
 00AC           ;            Col -> R20
 00AC           ;            Row -> R22
                        .even
 00AC           _LCD1602_gotoXY::
 00AC 0E940000          xcall push_gset2
 00B0 422F              mov R20,R18
 00B2 602F              mov R22,R16
 00B4                   .dbline -1
 00B4                   .dbline 145
 00B4           ;  PORTB&=~BIT(RTC_CLK);         //拉低时钟端
 00B4           ;  Delayus(10);
 00B4           ;  DS1302_writeB(data);  //写入数据
 00B4           ;  PORTB&=~BIT(RTC_CLK);         //拉低时钟端
 00B4           ;  Delayus(10);                  //调整片选脉冲
 00B4           ;  PORTC&=~BIT(RTC_CS);  //拉低片选端
 00B4           ; }
 00B4           ; /*******************************************
 00B4           ; 函数名称: DS1302_readD
 00B4           ; 功    能: 从DS1302的某个地址读出一个字节数据
 00B4                   .dbline 146
 00B4           ; 参    数: addr--地址值(寄存器或RAM)
 00B4 7727              clr R23
 00B6 6230              cpi R22,2
 00B8 E0E0              ldi R30,0
 00BA 7E07              cpc R23,R30
 00BC 09F0              breq L20
 00BE 05C0              xjmp L17
 00C0           X0:
 00C0                   .dbline 147
 00C0           ; 返回值  : data--读出的数据
 00C0           L20:
 00C0                   .dbline 149
 00C0           ; /********************************************/
 00C0           ; uchar DS1302_readD(uchar addr)
 00C0 242F              mov R18,R20
 00C2 2054              subi R18,64    ; addi 192

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -