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

📄 ds1302.lis

📁 1302+lcd时钟显示C语言程序
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0100 0E940000          xcall pop_gset2
 0104                   .dbline 0 ; func end
 0104 0895              ret
 0106                   .dbsym r data 20 i
 0106                   .dbsym r command 22 i
 0106                   .dbend
 0106                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 0106           ;        address -> R20
                        .even
 0106           _LCD_set_xy::
 0106 0E940000          xcall push_gset1
 010A 402F              mov R20,R16
 010C                   .dbline -1
 010C                   .dbline 67
 010C           ; 函数名称: DS1302_init
 010C           ; 功    能: 初始化DS1302的数据接口
 010C           ; 参    数: 无
 010C           ; 返回值  : 无
 010C           ; /********************************************/
 010C           ; void DS1302_portinit(void)              
 010C           ; {
 010C           ;  DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
 010C           ; }
 010C           ; /*******************************************
 010C           ; 函数名称: DS1302_writeB
 010C           ; 功    能: 向DS1302写入一个字节数据(没有RST操作)
 010C           ; 参    数: byte--要写入的数据
 010C           ; 返回值  : 无
 010C           ; /********************************************/
 010C           ; void DS1302_writeB(uchar byte)
 010C                   .dbline 68
 010C           ; {
 010C 242F              mov R18,R20
 010E 3327              clr R19
 0110 0027              clr R16
 0112 1127              clr R17
 0114 D0DF              xcall _LCD_write_char
 0116                   .dbline -2
 0116           L26:
 0116 0E940000          xcall pop_gset1
 011A                   .dbline 0 ; func end
 011A 0895              ret
 011C                   .dbsym r address 20 c
 011C                   .dbend
 011C                   .dbfunc e LCD_write_string _LCD_write_string fV
 011C           ;              s -> R20,R21
 011C           ;        address -> R22
                        .even
 011C           _LCD_write_string::
 011C 0E940000          xcall push_gset2
 0120 A901              movw R20,R18
 0122 602F              mov R22,R16
 0124                   .dbline -1
 0124                   .dbline 91
 0124           ;  uchar i;
 0124           ;  for(i=0;i<8;i++)                       //8位数据计数
 0124           ;  {
 0124           ;   PORTB&=~BIT(RTC_CLK);                 //拉低时钟端
 0124           ;   if(byte&0x01)                                 //当前位是否是1
 0124           ;   {
 0124           ;    PORTB|=BIT(RTC_DATA);        //当前位是1,拉高数据端
 0124           ;   }
 0124           ;   else                                                  
 0124           ;   {
 0124           ;    PORTB&=~BIT(RTC_DATA);       //当前位是0,拉低数据端
 0124           ;   }  
 0124           ;   Delayus(10);                                  //调整时钟和脉冲宽度
 0124           ;   PORTB|=BIT(RTC_CLK);                  //时钟上升沿(DS1302采样数据)
 0124           ;   byte>>=1;                                     //数据右移1位,为送出新数据位做准备
 0124           ;  }
 0124           ; }
 0124           ; /*******************************************
 0124           ; 函数名称: DS1302_readB
 0124           ; 功    能: 从DS1302读出一个字节数据(没有RST操作)
 0124           ; 参    数: 无
 0124           ; 返回值  : byte--读出的数据
 0124           ; /********************************************/
 0124                   .dbline 92
 0124           ; uchar DS1302_readB(void)
 0124 062F              mov R16,R22
 0126 EFDF              xcall _LCD_set_xy
 0128 08C0              xjmp L29
 012A           L28:
 012A                   .dbline 94
 012A                   .dbline 95
 012A FA01              movw R30,R20
 012C 2081              ldd R18,z+0
 012E 3327              clr R19
 0130 01E0              ldi R16,1
 0132 10E0              ldi R17,0
 0134 C0DF              xcall _LCD_write_char
 0136                   .dbline 96
 0136 4F5F              subi R20,255  ; offset = 1
 0138 5F4F              sbci R21,255
 013A                   .dbline 97
 013A           L29:
 013A                   .dbline 93
 013A           ; {
 013A FA01              movw R30,R20
 013C 2080              ldd R2,z+0
 013E 2220              tst R2
 0140 A1F7              brne L28
 0142                   .dbline -2
 0142           L27:
 0142 0E940000          xcall pop_gset2
 0146                   .dbline 0 ; func end
 0146 0895              ret
 0148                   .dbsym r s 20 pc
 0148                   .dbsym r address 22 c
 0148                   .dbend
 0148                   .dbfunc e LCD_write_onechar _LCD_write_onechar fV
 0148           ;           data -> R20
 0148           ;        address -> R22
                        .even
 0148           _LCD_write_onechar::
 0148 0E940000          xcall push_gset2
 014C 422F              mov R20,R18
 014E 602F              mov R22,R16
 0150                   .dbline -1
 0150                   .dbline 113
 0150           ;  uchar i,byte=0;
 0150           ;  DDRB&=~BIT(RTC_DATA);                 //将数据端口设置为输入           
 0150           ;  PORTB&=~BIT(RTC_DATA);                //无上拉电阻
 0150           ;  for(i=0;i<8;i++)                      //8位数据计数
 0150           ;  {
 0150           ;   byte>>=1;                            //保存读入的数据位
 0150           ;   PORTB|=BIT(RTC_CLK);                 //时钟上升沿
 0150           ;   Delayus(10);                                 //延时,调整时钟脉冲宽度
 0150           ;   PORTB&=~BIT(RTC_CLK);                //时钟下降沿,DS1302输出数据位
 0150           ;   Delayus(10);                                 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
 0150           ;   if(PINB&BIT(RTC_DATA))       //当前位是否是高电平
 0150           ;   {
 0150           ;    byte|=BIT(PB7);                     //是高电平就将返回数据的当前位置1
 0150           ;   }
 0150           ;   else
 0150           ;   {
 0150           ;    byte&=~BIT(PB7);                    //是低电平就将返回数据的当前位置0
 0150           ;   }
 0150           ;  }
 0150           ;  DDRB|=BIT(RTC_DATA);          //最后将数据端口设置为输出
 0150                   .dbline 114
 0150           ;  return byte;                          //返回读出的数据
 0150 062F              mov R16,R22
 0152 D9DF              xcall _LCD_set_xy
 0154                   .dbline 115
 0154           ; }
 0154 242F              mov R18,R20
 0156 3327              clr R19
 0158 01E0              ldi R16,1
 015A 10E0              ldi R17,0
 015C ACDF              xcall _LCD_write_char
 015E                   .dbline -2
 015E           L31:
 015E 0E940000          xcall pop_gset2
 0162                   .dbline 0 ; func end
 0162 0895              ret
 0164                   .dbsym r data 20 c
 0164                   .dbsym r address 22 c
 0164                   .dbend
 0164                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0164           _LCD_init::
 0164                   .dbline -1
 0164                   .dbline 120
 0164           ; /*******************************************
 0164           ; 函数名称: DS1302_writeD
 0164           ; 功    能: 向DS1302的某个地址写入一个字节数据
 0164           ; 参    数: addr--地址值(寄存器或RAM)
 0164           ;                 data--要写入的地址
 0164                   .dbline 121
 0164           ; 返回值  : 无
 0164 28E3              ldi R18,56
 0166 30E0              ldi R19,0
 0168 0027              clr R16
 016A 1127              clr R17
 016C A4DF              xcall _LCD_write_char
 016E                   .dbline 122
 016E           ; /********************************************/
 016E 01E0              ldi R16,1
 0170 10E0              ldi R17,0
 0172 70DF              xcall _delay
 0174                   .dbline 123
 0174           ; void DS1302_writeD(uchar addr,uchar data)
 0174 22E0              ldi R18,2
 0176 30E0              ldi R19,0
 0178 0027              clr R16
 017A 1127              clr R17
 017C 9CDF              xcall _LCD_write_char
 017E                   .dbline 124
 017E           ; {
 017E 01E0              ldi R16,1
 0180 10E0              ldi R17,0
 0182 68DF              xcall _delay
 0184                   .dbline 125
 0184           ;  PORTB&=~BIT(RTC_CS);  //拉低片选端
 0184 28E2              ldi R18,40
 0186 30E0              ldi R19,0
 0188 0027              clr R16
 018A 1127              clr R17
 018C 94DF              xcall _LCD_write_char
 018E                   .dbline 126
 018E           ;  PORTB&=~BIT(RTC_CLK);         //拉低时钟端
 018E 01E0              ldi R16,1
 0190 10E0              ldi R17,0
 0192 60DF              xcall _delay
 0194                   .dbline 127
 0194           ;  Delayus(10);
 0194 28E0              ldi R18,8
 0196 30E0              ldi R19,0
 0198 0027              clr R16
 019A 1127              clr R17
 019C 8CDF              xcall _LCD_write_char
 019E                   .dbline 128
 019E           ;  PORTB|=BIT(RTC_CS);   //拉高片选端
 019E 01E0              ldi R16,1
 01A0 10E0              ldi R17,0
 01A2 58DF              xcall _delay
 01A4                   .dbline 129
 01A4           ;  Delayus(10);                          //调整片选脉冲
 01A4 21E0              ldi R18,1
 01A6 30E0              ldi R19,0
 01A8 0027              clr R16
 01AA 1127              clr R17
 01AC 84DF              xcall _LCD_write_char
 01AE                   .dbline 130
 01AE           ;  DS1302_writeB(addr);  //写入操作命令(地址)
 01AE 01E0              ldi R16,1
 01B0 10E0              ldi R17,0
 01B2 50DF              xcall _delay
 01B4                   .dbline 131
 01B4           ;  Delayus(10);
 01B4 26E0              ldi R18,6
 01B6 30E0              ldi R19,0
 01B8 0027              clr R16
 01BA 1127              clr R17
 01BC 7CDF              xcall _LCD_write_char
 01BE                   .dbline 132
 01BE           ;  PORTB&=~BIT(RTC_CLK);         //拉低时钟端
 01BE 01E0              ldi R16,1
 01C0 10E0              ldi R17,0
 01C2 48DF              xcall _delay
 01C4                   .dbline 133
 01C4           ;  Delayus(10);
 01C4 2CE0              ldi R18,12
 01C6 30E0              ldi R19,0
 01C8 0027              clr R16
 01CA 1127              clr R17
 01CC 74DF              xcall _LCD_write_char
 01CE                   .dbline 134
 01CE           ;  DS1302_writeB(data);  //写入数据
 01CE 05E0              ldi R16,5
 01D0 10E0              ldi R17,0
 01D2 40DF              xcall _delay
 01D4                   .dbline -2
 01D4           L32:
 01D4                   .dbline 0 ; func end
 01D4 0895              ret
 01D6                   .dbend
 01D6                   .dbfile D:\单片机\ds1302\ds1302_end\ds1302.c
 01D6                   .dbfunc e Delayus _Delayus fV
 01D6           ;             US -> R16,R17
                        .even
 01D6           _Delayus::
 01D6                   .dbline -1
 01D6                   .dbline 39
 01D6                   .dbline 40
 01D6 0000              nop
 01D8                   .dbline -2
 01D8           L33:
 01D8                   .dbline 0 ; func end
 01D8 0895              ret
 01DA                   .dbsym r US 16 i
 01DA                   .dbend
 01DA                   .dbfunc e Delayms _Delayms fV
 01DA           ;              i -> R20,R21
 01DA           ;              j -> R22,R23
 01DA           ;             MS -> R16,R17
                        .even
 01DA           _Delayms::
 01DA 0E940000          xcall push_gset2
 01DE                   .dbline -1
 01DE                   .dbline 43
 01DE                   .dbline 45
 01DE 4427              clr R20
 01E0 5527              clr R21
 01E2 0BC0              xjmp L38
 01E4           L35:
 01E4                   .dbline 46
 01E4 6627              clr R22
 01E6 7727              clr R23
 01E8 02C0              xjmp L42
 01EA           L39:
 01EA                   .dbline 46
 01EA           L40:
 01EA                   .dbline 46
 01EA 6F5F              subi R22,255  ; offset = 1
 01EC 7F4F              sbci R23,255

⌨️ 快捷键说明

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