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

📄 ds1302.s

📁 该程序是医院用的CPCR记录仪的终端控制程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ds1302.c
	.area data(ram, con, rel)
_code::
	.blkb 2
	.area idata
	.byte 1,2
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 4,8
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 16,32
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 64,128
	.area data(ram, con, rel)
	.dbfile F:\yyjapp\yymk\software\ds1302.c
	.dbsym e code _code A[8:8]c
	.area text(rom, con, rel)
	.dbfile F:\yyjapp\yymk\software\ds1302.c
	.dbfunc e W_Byte _W_Byte fV
;              i -> R20
;           Data -> R22
	.even
_W_Byte::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 14
; #include <f:\yyjapp\yymk\software\main.h>
; #include <f:\yyjapp\yymk\software\ds1302.h>
; #include <iom128v.h>
; #include <macros.h>
; unsigned char code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
; /******************************************************************** 
;  函 数 名:W_Byte()
;  功    能:实时时钟写入一字节
;  说    明:往DS1302写入1Byte数据
;  入口参数:Data 写入的数据 
;  返 回 值:无  
; ***********************************************************************/
; void W_Byte(unsigned char Data) 
; { 
	.dbline 16
;     unsigned char i;
;     for(i=0;i<8;i++)
	clr R20
	xjmp L5
L2:
	.dbline 17
;     {
	.dbline 18
; 		if(Data&0x01)      //相当于汇编的RRC命令
	sbrs R22,0
	rjmp L6
	.dbline 19
; 		SET_IO();
	cbi 0x2,5
	xjmp L7
L6:
	.dbline 21
; 		else
; 		CLEAR_IO();
	sbi 0x2,5
L7:
	.dbline 22
	lsr R22
	.dbline 23
	xcall _CLOCK
	.dbline 24
L3:
	.dbline 16
	inc R20
L5:
	.dbline 16
	cpi R20,8
	brlo L2
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r Data 22 c
	.dbend
	.dbfunc e R_Byte _R_Byte fc
;           data -> R20
;              i -> R22
	.even
_R_Byte::
	xcall push_gset2
	.dbline -1
	.dbline 35
; 		Data>>=1;
; 		CLOCK();
;     } 
; }
; /******************************************************************** 
; 
;  函 数 名:R_Byte()
;  功    能:实时时钟读取一字节
;  说    明:从DS1302读取1Byte数据
;  入口参数:无  
;  返 回 值:data
; ***********************************************************************/
; unsigned char R_Byte(void) 
; { 
	.dbline 36
;     unsigned char i,data=0;
	clr R20
	.dbline 37
; 	for(i=0;i<8;i++)
	clr R22
	xjmp L12
L9:
	.dbline 38
;     {
	.dbline 39
; 		if(PINE&0x20)
	sbis 0x1,5
	rjmp L13
	.dbline 40
; 		data|=code[i];
	ldi R24,<_code
	ldi R25,>_code
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	or R20,R2
L13:
	.dbline 41
	xcall _CLOCK
	.dbline 42
L10:
	.dbline 37
	inc R22
L12:
	.dbline 37
	cpi R22,8
	brlo L9
	.dbline 43
; 		CLOCK();
;     } 
;     return data; 
	mov R16,R20
	.dbline -2
L8:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e W_1302 _W_1302 fV
;           Data -> R20
;           Addr -> R22
	.even
_W_1302::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 55
; }
; /******************************************************************** 
; 
;  函 数 名:W_1302()
;  功    能:往DS1302写入数据
;  说    明:先写地址,后写命令/数据
;  调    用:W_Byte() , R_Byte()
;  入口参数:Addr: DS1302地址, Data: 要写的数据
;  返 回 值:无
; ***********************************************************************/
; void W_1302(unsigned char Addr, unsigned char Data)
; {
	.dbline 56
;  	CLEAR_RST();
	sbi 0x2,6
	.dbline 57
; 	CLEAR_CLK();
	sbi 0x2,4
	.dbline 58
;  	SET_RST();
	cbi 0x2,6
	.dbline 59
; 	SET_IO();
	cbi 0x2,5
	.dbline 60
;     W_Byte(Addr);       /* 地址,命令 */
	mov R16,R22
	xcall _W_Byte
	.dbline 61
;     W_Byte(Data);       /* 写1Byte数据*/
	mov R16,R20
	xcall _W_Byte
	.dbline 62
;     SET_CLK();
	cbi 0x2,4
	.dbline 63
;     CLEAR_RST();
	sbi 0x2,6
	.dbline -2
L15:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Data 20 c
	.dbsym r Addr 22 c
	.dbend
	.dbfunc e R_1302 _R_1302 fc
;          Data1 -> R20
;           Addr -> R20
	.even
_R_1302::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 75
; } 
; /******************************************************************** 
; 
;  函 数 名:R_1302()
;  功    能:读取DS1302某地址的数据
;  说    明:先写地址,后读命令/数据
;  调    用:W_Byte() , R_Byte()
;  入口参数:ucAddr: DS1302地址
;  返 回 值:ucData :读取的数据
; ***********************************************************************/
; unsigned char R_1302(unsigned char Addr)
; {
	.dbline 77
;     unsigned char Data1;
; 	CLEAR_RST();
	sbi 0x2,6
	.dbline 78
; 	CLEAR_CLK();
	sbi 0x2,4
	.dbline 79
;     SET_RST();
	cbi 0x2,6
	.dbline 80
;     W_Byte(Addr);             /* 地址,命令 */
	mov R16,R20
	xcall _W_Byte
	.dbline 81
;     Data1 = R_Byte();         /* 读1Byte数据 */
	xcall _R_Byte
	mov R20,R16
	.dbline 82
;     SET_CLK();
	cbi 0x2,4
	.dbline 83
;     CLEAR_RST();
	sbi 0x2,6
	.dbline 84
;     return Data1;
	.dbline -2
L16:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Data1 20 c
	.dbsym r Addr 20 c
	.dbend
	.dbfunc e BurstW1302T _BurstW1302T fV
;              i -> R20
;          Cdata -> R22,R23
	.even
_BurstW1302T::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 97
; }
; /******************************************************************** 
; 
;  函 数 名:BurstW1302T()
;  功    能:往DS1302写入时钟数据(多字节方式)
;  说    明:先写地址,后写命令/数据
;  调    用:W_Byte() 
;  入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
;                          8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
;  返 回 值:无
; ***********************************************************************/
; void BurstW1302T(unsigned char *Cdata)
; {
	.dbline 99
;     unsigned char i;
;     W_1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
	clr R18
	ldi R16,142
	xcall _W_1302
	.dbline 100
;     CLEAR_RST();
	sbi 0x2,6
	.dbline 101
; 	CLEAR_CLK();
	sbi 0x2,4
	.dbline 102
; 	SET_RST();
	cbi 0x2,6
	.dbline 103
;     W_Byte(0xbe);        /* 0xbe:时钟多字节写命令 */
	ldi R16,190
	xcall _W_Byte
	.dbline 104
;     for (i=0;i<8;i++)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
	clr R20
	xjmp L21
L18:
	.dbline 105
	.dbline 106
	movw R30,R22
	ldd R16,z+0
	xcall _W_Byte
	.dbline 107
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 108
L19:
	.dbline 104
	inc R20
L21:
	.dbline 104
	cpi R20,8
	brlo L18
	.dbline 109
;     {
;         W_Byte(*Cdata); /* 写1Byte数据*/
;         Cdata++;
;     }
;     SET_CLK();
	cbi 0x2,4
	.dbline 110
;     CLEAR_RST();
	sbi 0x2,6
	.dbline -2
L17:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r Cdata 22 pc
	.dbend
	.dbfunc e BurstR1302T _BurstR1302T fV
;              i -> R20
;          Cdata -> R22,R23
	.even
_BurstR1302T::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 123
; } 
; /******************************************************************** 
; 
;  函 数 名:BurstR1302T()
;  功    能:读取DS1302时钟数据
;  说    明:先写地址/命令,后读数据(时钟多字节方式)
;  调    用:W_Byte() , R_Byte()
;  入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
;                              7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
;  返 回 值:无
; ***********************************************************************/
; void BurstR1302T(unsigned char *Cdata)
; {
	.dbline 125
;     unsigned char i;
; 	CLEAR_RST();
	sbi 0x2,6
	.dbline 126
; 	CLEAR_CLK();
	sbi 0x2,4
	.dbline 127
;     SET_RST();
	cbi 0x2,6
	.dbline 128
;     W_Byte(0xbf);             /* 0xbf:时钟多字节读命令 */
	ldi R16,191
	xcall _W_Byte
	.dbline 129
;     for (i=0;i<8;i++) 
	clr R20
	xjmp L26
L23:
	.dbline 130
	.dbline 131
	xcall _R_Byte
	movw R30,R22
	std z+0,R16
	.dbline 132
	subi R22,255  ; offset = 1

⌨️ 快捷键说明

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