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

📄 pcf8563_test.s

📁 pcf8563开发
💻 S
📖 第 1 页 / 共 3 页
字号:
	.dbline 115
;  LCD_write_char(0,' ');
	ldi R18,32
	ldi R19,0
	clr R16
	clr R17
	xcall _LCD_write_char
L30:
	.dbline 114
	inc R20
L32:
	.dbline 114
	cpi R20,16
	brlo L29
X6:
	.dbline -2
L24:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e LCD_write_string _LCD_write_string fV
;              s -> R20,R21
;              Y -> R12
;              X -> R10
	.even
_LCD_write_string::
	xcall push_xgset303C
	mov R12,R18
	mov R10,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 123
; }
; /*-------------------------------------------------------------
; 函数: 写字符串
; 参数:列---X=0~15,行---Y=0~1 写地址
;       s为所要写的字符串
; ---------------------------------------------------------------*/
; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) 
; {
	.dbline 124
;  LCD_set_xy(X,Y);   
	mov R18,R12
	mov R16,R10
	xcall _LCD_set_xy
	xjmp L35
L34:
	.dbline 126
;  while(*s)  
;  {
	.dbline 127
;   LCD_write_char(0,*s);
	movw R30,R20
	ldd R18,z+0
	clr R19
	clr R16
	clr R17
	xcall _LCD_write_char
	.dbline 128
;   s++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 129
;  }
L35:
	.dbline 125
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L34
X7:
	.dbline -2
L33:
	.dbline 0 ; func end
	xjmp pop_xgset303C
	.dbsym r s 20 pc
	.dbsym r Y 12 c
	.dbsym r X 10 c
	.dbend
	.dbfunc e LCD_write_data _LCD_write_data fV
;           data -> y+0
;              i -> R20
;            dat -> R14,R15
;              Y -> R12
;              X -> R10
	.even
_LCD_write_data::
	xcall push_xgset30FC
	mov R12,R18
	mov R10,R16
	sbiw R28,4
	ldd R14,y+12
	ldd R15,y+13
	.dbline -1
	.dbline 138
; }
; 
; /*-------------------------------------------------------------
; 函数: 写数字
; 参数:列---X=0~15,行---Y=0~1 写地址
;       dat为所要写的数字
; ---------------------------------------------------------------*/
; void LCD_write_data(unsigned char X,unsigned char Y,int dat)
; {
	.dbline 151
;  //unsigned char fuhao;
;  unsigned char data[4];
;  unsigned char i;
;   
;  /*if(dat<0)
;  {
;   fuhao='-';
;   dat=0-dat;
;  }
;  else
;   fuhao=' ';
;  data[0]=fuhao;*/
;  data[0]=dat/1000+0x30; dat%=1000;
	ldi R18,1000
	ldi R19,3
	movw R16,R14
	xcall div16s
	movw R24,R16
	adiw R24,48
	std y+0,R24
	.dbline 151
	ldi R18,1000
	ldi R19,3
	movw R16,R14
	xcall mod16s
	movw R14,R16
	.dbline 152
;  data[1]=dat/100+0x30;  dat%=100;
	ldi R18,100
	ldi R19,0
	xcall div16s
	movw R24,R16
	adiw R24,48
	std y+1,R24
	.dbline 152
	ldi R18,100
	ldi R19,0
	movw R16,R14
	xcall mod16s
	movw R14,R16
	.dbline 153
;  data[2]=dat/10+0x30; 
	ldi R18,10
	ldi R19,0
	xcall div16s
	movw R24,R16
	adiw R24,48
	std y+2,R24
	.dbline 154
;  data[3]=dat%10+0x30; 
	ldi R18,10
	ldi R19,0
	movw R16,R14
	xcall mod16s
	movw R24,R16
	adiw R24,48
	std y+3,R24
	.dbline 156
;  
;  LCD_set_xy(X,Y);
	mov R18,R12
	mov R16,R10
	xcall _LCD_set_xy
	.dbline 157
;  for(i=0;i<4;i++)
	clr R20
	xjmp L44
L41:
	.dbline 158
;   LCD_write_char(0,data[i]);
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R18,z+0
	clr R19
	clr R16
	clr R17
	xcall _LCD_write_char
L42:
	.dbline 157
	inc R20
L44:
	.dbline 157
	cpi R20,4
	brlo L41
X8:
	.dbline -2
L37:
	.dbline 0 ; func end
	adiw R28,4
	xjmp pop_xgset30FC
	.dbsym l data 0 A[4:4]c
	.dbsym r i 20 c
	.dbsym r dat 14 I
	.dbsym r Y 12 c
	.dbsym r X 10 c
	.dbend
	.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563.h
	.dbfunc e write_tim _write_tim fc
;              a -> R16
	.even
_write_tim::
	.dbline -1
	.dbline 15
; /*******************************************
; *       PCF8563的I2C(TWI)操作函数		   *
; *  文 件 名:pcf8563.h					   *
; *  函数功能:利用CPU的硬件TWI接口操作	   *
; *  设    计:张子凤						       *
; *  修改日期:2008年11月11日				   *
; *  版    本:V1.0						   *
; *  主控芯片:Mega16						   *
; *******************************************/
; //全局变量定义
; unsigned char timer[8];		  				 //时钟数据
; 
; //写入时间函数
; unsigned char write_tim(unsigned char a)
; {   
	.dbline 16
;   sendbyte(a);				  //发送
	.dbline 16
	out 0x3,R16
	.dbline 16
	ldi R24,132
	out 0x36,R24
	.dbline 16
	.dbline 16
	.dbline 17
;   waitack();						  //等待写完成
L46:
	.dbline 17
L47:
	.dbline 17
	in R2,0x36
	sbrs R2,7
	rjmp L46
X9:
	.dbline 17
	.dbline 17
	.dbline 18
;   if(chkack()!=MT_SLA_ACK)return I2C_ERR;  //检查是否正确写入
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L49
X10:
	.dbline 18
	clr R16
	xjmp L45
L49:
	.dbline 19
;   else return I2C_CRR;
	ldi R16,1
	.dbline -2
L45:
	.dbline 0 ; func end
	ret
	.dbsym r a 16 c
	.dbend
	.dbfunc e read_tim _read_tim fc
	.even
_read_tim::
	.dbline -1
	.dbline 24
; }
; 
; //读出时间函数
; unsigned char read_tim(void)
; {
	.dbline 25
;  rcvackbyte();					  //接收一字节并返回应答
	ldi R24,196
	out 0x36,R24
	.dbline 26
;  waitack();						  //等待接收完成
L52:
	.dbline 26
L53:
	.dbline 26
	in R2,0x36
	sbrs R2,7
	rjmp L52
X11:
	.dbline 26
	.dbline 26
	.dbline 27
;  if(chkack()!=MR_DATA_ACK)return I2C_ERR; 		  //检查是否接收成功
	in R24,0x1
	andi R24,248
	cpi R24,80
	breq L55
X12:
	.dbline 27
	clr R16
	xjmp L51
L55:
	.dbline 29
;  else
;  return(TWDR);				  //读出时钟数据
	in R16,0x3
	.dbline -2
L51:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e read_timer _read_timer fc
	.even
_read_timer::
	st -y,R10
	st -y,R20
	.dbline -1
	.dbline 36
; }
; 
; /**********************************
; *          读出数据函数			  *
; **********************************/
; unsigned char read_timer(void)
; {
	.dbline 37
;  start();		 	 	          //启动总线
	ldi R24,164
	out 0x36,R24
	.dbline 38
;  waitack();						  //等待启动完成
L58:
	.dbline 38
L59:
	.dbline 38
	in R2,0x36
	sbrs R2,7
	rjmp L58
X13:
	.dbline 38
	.dbline 38
	.dbline 39
;  if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L61
X14:
	.dbline 39
	clr R16
	xjmp L57
L61:
	.dbline 40
;  write_tim(PCF8563_SLA_W);				  //发送写地址
	ldi R16,162
	xcall _write_tim
	.dbline 41
;  write_tim(0x02);				  //写数据地址
	ldi R16,2
	xcall _write_tim
	.dbline 43
; 	
;  start();
	ldi R24,164
	out 0x36,R24
	.dbline 44
;  waitack();						  //等待启动完成
L63:
	.dbline 44
L64:
	.dbline 44
	in R2,0x36
	sbrs R2,7
	rjmp L63
X15:
	.dbline 44
	.dbline 44
	.dbline 45
;  if(chkack()!=RESTART)return I2C_ERR;	  //检查是否启动成功
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L66
X16:
	.dbline 45
	clr R16
	xjmp L57
L66:
	.dbline 46
;  write_tim(PCF8563_SLA_R);				  //发送读地址
	ldi R16,163
	xcall _write_tim
	.dbline 48
; 	
;  timer[0]=read_tim()&0x7F;		  //读出秒数据
	xcall _read_tim
	mov R24,R16
	andi R24,127
	sts _timer,R24
	.dbline 49
;  timer[1]=read_tim()&0x7F;		  //读出分数据
	xcall _read_tim
	mov R24,R16
	andi R24,127
	sts _timer+1,R24
	.dbline 50
;  timer[2]=read_tim()&0x3F;		  //读出时数据
	xcall _read_tim
	mov R20,R16
	mov R24,R20
	andi R24,63
	sts _timer+2,R24
	.dbline 51
;  timer[3]=read_tim()&0x3F;		  //读出日数据
	xcall _read_tim
	mov R20,R16
	mov R24,R20
	andi R24,63
	sts _timer+3,R24
	.dbline 52
;  timer[4]=read_tim()&0x07;		  //读出周数据
	xcall _read_tim
	mov R20,R16
	mov R24,R20
	andi R24,7
	sts _timer+4,R24
	.dbline 53
;  if(timer[4]==0)timer[4]=7;
	tst R24
	brne L72
X17:
	.dbline 53
	ldi R24,7
	sts _timer+4,R24
L72:
	.dbline 54
;  timer[5]=read_tim();	  		  //读出月数据
	xcall _read_tim
	mov R10,R16
	sts _timer+5,R10
	.dbline 55
;  if((timer[5]&0x80)==0)
	sbrc R16,7
	rjmp L77
X18:
	.dbline 56
;   timer[7]=0x20;	 		  //世纪位为0,是21世纪
	ldi R24,32
	sts _timer+7,R24
	xjmp L78
L77:
	.dbline 58
;  else 
;   timer[7]=0x19;			  //世纪位不为0,是20世纪
	ldi R24,25
	sts _timer+7,R24
L78:
	.dbline 59
;  timer[5]=timer[5]&0x1F;
	lds R24,_timer+5
	andi R24,31
	sts _timer+5,R24
	.dbline 60
;  timer[6]=read_tim();			  //读出年数据
	xcall _read_tim
	mov R10,R16
	sts _timer+6,R10
	.dbline 61
;  stop();
	ldi R24,148
	out 0x36,R24
	.dbline 62
;  return I2C_CRR;
	ldi R16,1
	.dbline -2
L57:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbend
	.dbfunc e write_timer _write_timer fc
;            dat -> R20,R21
	.even
_write_timer::
	st -y,R20
	st -y,R21
	movw R20,R16
	.dbline -1
	.dbline 69
; }
; 
; /**********************************
; *          写入时钟函数			  *
; **********************************/
; unsigned char write_timer(unsigned char *dat)
; {
	.dbline 70
;  start();		 	 	          //启动总线
	ldi R24,164
	out 0x36,R24
	.dbline 71
;  waitack();						  //等待启动完成
L86:
	.dbline 71
L87:
	.dbline 71
	in R2,0x36
	sbrs R2,7
	rjmp L86
X19:
	.dbline 71
	.dbline 71
	.dbline 72
;  if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L89
X20:
	.dbline 72
	clr R16
	xjmp L85
L89:
	.dbline 73
;  write_tim(PCF8563_SLA_W);				  //发送写地址
	ldi R16,162
	xcall _write_tim
	.dbline 74
;  write_tim(0x00);				  //写数据首地址
	clr R16
	xcall _write_tim
	.dbline 75
;  write_tim(0x20);				  //写控制/状态寄存器1,暂停计时
	ldi R16,32
	xcall _write_tim
	.dbline 76
;  write_tim(0x00);				  //写控制/状态寄存器2
	clr R16
	xcall _write_tim
	.dbline 77
;  write_tim(dat[0]);			      //写秒数据0
	movw R30,R20
	ldd R16,z+0
	xcall _write_tim
	.dbline 78
;  write_tim(dat[1]);			  //写分数据
	movw R30,R20
	ldd R16,z+1
	xcall _write_tim
	.dbline 79
;  write_tim(dat[2]);			  //写时数据
	movw R30,R20
	ldd R16,z+2
	xcall _write_tim
	.dbline 80
;  write_tim(dat[3]);			  //写日数据
	movw R30,R20
	ldd R16,z+3
	xcall _write_tim
	.dbline 81
;  write_tim(dat[4]);			  //写周数据
	movw R30,R20
	ldd R16,z+4
	xcall _write_tim
	.dbline 82
;  write_tim(dat[5]);			  //写月数据
	movw R30,R20
	ldd R16,z+5
	xcall _write_tim
	.dbline 83
;  write_tim(dat[6]);			  //写年数据
	movw R30,R20
	ldd R16,z+6
	xcall _write_tim
	.dbline 84
;  stop();
	ldi R24,148
	out 0x36,R24
	.dbline 85
;  return I2C_CRR;
	ldi R16,1
	.dbline -2
L85:

⌨️ 快捷键说明

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