ds1302.lis
来自「该程序是医院用的CPCR记录仪的终端控制程序」· LIS 代码 · 共 794 行 · 第 1/3 页
LIS
794 行
.module ds1302.c
.area data(ram, con, rel)
0000 _code::
0000 .blkb 2
.area idata
0000 0102 .byte 1,2
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 0408 .byte 4,8
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 1020 .byte 16,32
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 4080 .byte 64,128
.area data(ram, con, rel)
0008 .dbfile F:\yyjapp\yymk\software\ds1302.c
0008 .dbsym e code _code A[8:8]c
.area text(rom, con, rel)
0000 .dbfile F:\yyjapp\yymk\software\ds1302.c
0000 .dbfunc e W_Byte _W_Byte fV
0000 ; i -> R20
0000 ; Data -> R22
.even
0000 _W_Byte::
0000 0E940000 xcall push_gset2
0004 602F mov R22,R16
0006 .dbline -1
0006 .dbline 14
0006 ; #include <f:\yyjapp\yymk\software\main.h>
0006 ; #include <f:\yyjapp\yymk\software\ds1302.h>
0006 ; #include <iom128v.h>
0006 ; #include <macros.h>
0006 ; unsigned char code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
0006 ; /********************************************************************
0006 ; 函 数 名:W_Byte()
0006 ; 功 能:实时时钟写入一字节
0006 ; 说 明:往DS1302写入1Byte数据
0006 ; 入口参数:Data 写入的数据
0006 ; 返 回 值:无
0006 ; ***********************************************************************/
0006 ; void W_Byte(unsigned char Data)
0006 ; {
0006 .dbline 16
0006 ; unsigned char i;
0006 ; for(i=0;i<8;i++)
0006 4427 clr R20
0008 08C0 xjmp L5
000A L2:
000A .dbline 17
000A ; {
000A .dbline 18
000A ; if(Data&0x01) //相当于汇编的RRC命令
000A 60FF sbrs R22,0
000C 02C0 rjmp L6
000E .dbline 19
000E ; SET_IO();
000E 1598 cbi 0x2,5
0010 01C0 xjmp L7
0012 L6:
0012 .dbline 21
0012 ; else
0012 ; CLEAR_IO();
0012 159A sbi 0x2,5
0014 L7:
0014 .dbline 22
0014 6695 lsr R22
0016 .dbline 23
0016 DCD0 xcall _CLOCK
0018 .dbline 24
0018 L3:
0018 .dbline 16
0018 4395 inc R20
001A L5:
001A .dbline 16
001A 4830 cpi R20,8
001C B0F3 brlo L2
001E .dbline -2
001E L1:
001E 0E940000 xcall pop_gset2
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbsym r i 20 c
0024 .dbsym r Data 22 c
0024 .dbend
0024 .dbfunc e R_Byte _R_Byte fc
0024 ; data -> R20
0024 ; i -> R22
.even
0024 _R_Byte::
0024 0E940000 xcall push_gset2
0028 .dbline -1
0028 .dbline 35
0028 ; Data>>=1;
0028 ; CLOCK();
0028 ; }
0028 ; }
0028 ; /********************************************************************
0028 ;
0028 ; 函 数 名:R_Byte()
0028 ; 功 能:实时时钟读取一字节
0028 ; 说 明:从DS1302读取1Byte数据
0028 ; 入口参数:无
0028 ; 返 回 值:data
0028 ; ***********************************************************************/
0028 ; unsigned char R_Byte(void)
0028 ; {
0028 .dbline 36
0028 ; unsigned char i,data=0;
0028 4427 clr R20
002A .dbline 37
002A ; for(i=0;i<8;i++)
002A 6627 clr R22
002C 0CC0 xjmp L12
002E L9:
002E .dbline 38
002E ; {
002E .dbline 39
002E ; if(PINE&0x20)
002E 0D9B sbis 0x1,5
0030 08C0 rjmp L13
0032 .dbline 40
0032 ; data|=code[i];
0032 80E0 ldi R24,<_code
0034 90E0 ldi R25,>_code
0036 E62F mov R30,R22
0038 FF27 clr R31
003A E80F add R30,R24
003C F91F adc R31,R25
003E 2080 ldd R2,z+0
0040 4229 or R20,R2
0042 L13:
0042 .dbline 41
0042 C6D0 xcall _CLOCK
0044 .dbline 42
0044 L10:
0044 .dbline 37
0044 6395 inc R22
0046 L12:
0046 .dbline 37
0046 6830 cpi R22,8
0048 90F3 brlo L9
004A .dbline 43
004A ; CLOCK();
004A ; }
004A ; return data;
004A 042F mov R16,R20
004C .dbline -2
004C L8:
004C 0E940000 xcall pop_gset2
0050 .dbline 0 ; func end
0050 0895 ret
0052 .dbsym r data 20 c
0052 .dbsym r i 22 c
0052 .dbend
0052 .dbfunc e W_1302 _W_1302 fV
0052 ; Data -> R20
0052 ; Addr -> R22
.even
0052 _W_1302::
0052 0E940000 xcall push_gset2
0056 422F mov R20,R18
0058 602F mov R22,R16
005A .dbline -1
005A .dbline 55
005A ; }
005A ; /********************************************************************
005A ;
005A ; 函 数 名:W_1302()
005A ; 功 能:往DS1302写入数据
005A ; 说 明:先写地址,后写命令/数据
005A ; 调 用:W_Byte() , R_Byte()
005A ; 入口参数:Addr: DS1302地址, Data: 要写的数据
005A ; 返 回 值:无
005A ; ***********************************************************************/
005A ; void W_1302(unsigned char Addr, unsigned char Data)
005A ; {
005A .dbline 56
005A ; CLEAR_RST();
005A 169A sbi 0x2,6
005C .dbline 57
005C ; CLEAR_CLK();
005C 149A sbi 0x2,4
005E .dbline 58
005E ; SET_RST();
005E 1698 cbi 0x2,6
0060 .dbline 59
0060 ; SET_IO();
0060 1598 cbi 0x2,5
0062 .dbline 60
0062 ; W_Byte(Addr); /* 地址,命令 */
0062 062F mov R16,R22
0064 CDDF xcall _W_Byte
0066 .dbline 61
0066 ; W_Byte(Data); /* 写1Byte数据*/
0066 042F mov R16,R20
0068 CBDF xcall _W_Byte
006A .dbline 62
006A ; SET_CLK();
006A 1498 cbi 0x2,4
006C .dbline 63
006C ; CLEAR_RST();
006C 169A sbi 0x2,6
006E .dbline -2
006E L15:
006E 0E940000 xcall pop_gset2
0072 .dbline 0 ; func end
0072 0895 ret
0074 .dbsym r Data 20 c
0074 .dbsym r Addr 22 c
0074 .dbend
0074 .dbfunc e R_1302 _R_1302 fc
0074 ; Data1 -> R20
0074 ; Addr -> R20
.even
0074 _R_1302::
0074 0E940000 xcall push_gset1
0078 402F mov R20,R16
007A .dbline -1
007A .dbline 75
007A ; }
007A ; /********************************************************************
007A ;
007A ; 函 数 名:R_1302()
007A ; 功 能:读取DS1302某地址的数据
007A ; 说 明:先写地址,后读命令/数据
007A ; 调 用:W_Byte() , R_Byte()
007A ; 入口参数:ucAddr: DS1302地址
007A ; 返 回 值:ucData :读取的数据
007A ; ***********************************************************************/
007A ; unsigned char R_1302(unsigned char Addr)
007A ; {
007A .dbline 77
007A ; unsigned char Data1;
007A ; CLEAR_RST();
007A 169A sbi 0x2,6
007C .dbline 78
007C ; CLEAR_CLK();
007C 149A sbi 0x2,4
007E .dbline 79
007E ; SET_RST();
007E 1698 cbi 0x2,6
0080 .dbline 80
0080 ; W_Byte(Addr); /* 地址,命令 */
0080 042F mov R16,R20
0082 BEDF xcall _W_Byte
0084 .dbline 81
0084 ; Data1 = R_Byte(); /* 读1Byte数据 */
0084 CFDF xcall _R_Byte
0086 402F mov R20,R16
0088 .dbline 82
0088 ; SET_CLK();
0088 1498 cbi 0x2,4
008A .dbline 83
008A ; CLEAR_RST();
008A 169A sbi 0x2,6
008C .dbline 84
008C ; return Data1;
008C .dbline -2
008C L16:
008C 0E940000 xcall pop_gset1
0090 .dbline 0 ; func end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?