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

📄 test.lst

📁 pcf8563开发
💻 LST
📖 第 1 页 / 共 3 页
字号:
      FF 9543      INC	R20
     100 3140      CPI	R20,0x10
     101 F3D0      BCS	0x00FC
     102 9149      LD	R20,Y+
     103 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R12
  X                    --> R10
     104 D220      RCALL	push_xgset303C
     105 2EC2      MOV	R12,R18
     106 2EA0      MOV	R10,R16
     107 814E      LDD	R20,Y+6
     108 815F      LDD	R21,Y+7
(0116) }
(0117) /*-------------------------------------------------------------
(0118) 函数: 写字符串
(0119) 参数:列---X=0~15,行---Y=0~1 写地址
(0120)       s为所要写的字符串
(0121) ---------------------------------------------------------------*/
(0122) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) 
(0123) {
(0124)  LCD_set_xy(X,Y);   
     109 2D2C      MOV	R18,R12
     10A 2D0A      MOV	R16,R10
     10B DF8E      RCALL	_LCD_set_xy
     10C C006      RJMP	0x0113
(0125)  while(*s)  
(0126)  {
(0127)   LCD_write_char(0,*s);
     10D 01FA      MOVW	R30,R20
     10E 940E 0375 CALL	0x0375
     110 DF9F      RCALL	_LCD_write_char
(0128)   s++;
     111 5F4F      SUBI	R20,0xFF
     112 4F5F      SBCI	R21,0xFF
     113 01FA      MOVW	R30,R20
     114 8020      LDD	R2,Z+0
     115 2022      TST	R2
     116 F7B1      BNE	0x010D
     117 C214      RJMP	pop_xgset303C
_LCD_write_data:
  data                 --> Y,+0
  i                    --> R20
  dat                  --> R14
  Y                    --> R12
  X                    --> R10
     118 D1F7      RCALL	push_xgset30FC
     119 2EC2      MOV	R12,R18
     11A 2EA0      MOV	R10,R16
     11B 9724      SBIW	R28,4
     11C 84EC      LDD	R14,Y+12
     11D 84FD      LDD	R15,Y+13
(0129)  }
(0130) }
(0131) 
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135)       dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139)  //unsigned char fuhao;
(0140)  unsigned char data[4];
(0141)  unsigned char i;
(0142)   
(0143)  /*if(dat<0)
(0144)  {
(0145)   fuhao='-';
(0146)   dat=0-dat;
(0147)  }
(0148)  else
(0149)   fuhao=' ';
(0150)  data[0]=fuhao;*/
(0151)  data[0]=dat/1000+0x30; dat%=1000;
     11E EE28      LDI	R18,0xE8
     11F E033      LDI	R19,3
     120 0187      MOVW	R16,R14
     121 D1B4      RCALL	div16s
     122 01C8      MOVW	R24,R16
     123 96C0      ADIW	R24,0x30
     124 8388      STD	Y+0,R24
     125 EE28      LDI	R18,0xE8
     126 E033      LDI	R19,3
     127 0187      MOVW	R16,R14
     128 D1A9      RCALL	mod16s
     129 0178      MOVW	R14,R16
(0152)  data[1]=dat/100+0x30;  dat%=100;
     12A E624      LDI	R18,0x64
     12B E030      LDI	R19,0
     12C D1A9      RCALL	div16s
     12D 01C8      MOVW	R24,R16
     12E 96C0      ADIW	R24,0x30
     12F 8389      STD	Y+1,R24
     130 E624      LDI	R18,0x64
     131 E030      LDI	R19,0
     132 0187      MOVW	R16,R14
     133 D19E      RCALL	mod16s
     134 0178      MOVW	R14,R16
(0153)  data[2]=dat/10+0x30; 
     135 E02A      LDI	R18,0xA
     136 E030      LDI	R19,0
     137 D19E      RCALL	div16s
     138 01C8      MOVW	R24,R16
     139 96C0      ADIW	R24,0x30
     13A 838A      STD	Y+2,R24
(0154)  data[3]=dat%10+0x30; 
     13B E02A      LDI	R18,0xA
     13C E030      LDI	R19,0
     13D 0187      MOVW	R16,R14
     13E D193      RCALL	mod16s
     13F 01C8      MOVW	R24,R16
     140 96C0      ADIW	R24,0x30
     141 838B      STD	Y+3,R24
(0155)  
(0156)  LCD_set_xy(X,Y);
     142 2D2C      MOV	R18,R12
     143 2D0A      MOV	R16,R10
     144 DF55      RCALL	_LCD_set_xy
(0157)  for(i=0;i<4;i++)
     145 2744      CLR	R20
     146 C009      RJMP	0x0150
(0158)   LCD_write_char(0,data[i]);
     147 01CE      MOVW	R24,R28
     148 2FE4      MOV	R30,R20
     149 27FF      CLR	R31
     14A 0FE8      ADD	R30,R24
     14B 1FF9      ADC	R31,R25
     14C 940E 0375 CALL	0x0375
     14E DF61      RCALL	_LCD_write_char
     14F 9543      INC	R20
     150 3044      CPI	R20,4
     151 F3A8      BCS	0x0147
     152 9624      ADIW	R28,4
     153 C1B3      RJMP	pop_xgset30FC
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563.h
(0001) /*******************************************
(0002) *       PCF8563的I2C(TWI)操作函数		   *
(0003) *  文 件 名:pcf8563.h					   *
(0004) *  函数功能:利用CPU的硬件TWI接口操作	   *
(0005) *  设    计:张子凤						       *
(0006) *  修改日期:2008年11月11日				   *
(0007) *  版    本:V1.0						   *
(0008) *  主控芯片:Mega16						   *
(0009) *******************************************/
(0010) //全局变量定义
(0011) unsigned char timer[8];		  				 //时钟数据
(0012) 
(0013) //写入时间函数
(0014) unsigned char write_tim(unsigned char a)
(0015) {   
(0016)   sendbyte(a);				  //发送
_write_tim:
  a                    --> R16
     154 B903      OUT	0x03,R16
     155 E884      LDI	R24,0x84
     156 940E 0352 CALL	0x0352
(0017)   waitack();						  //等待写完成
(0018)   if(chkack()!=MT_SLA_ACK)return I2C_ERR;  //检查是否正确写入
     158 3188      CPI	R24,0x18
     159 F011      BEQ	0x015C
     15A 2700      CLR	R16
     15B C001      RJMP	0x015D
(0019)   else return I2C_CRR;
     15C E001      LDI	R16,1
     15D 9508      RET
(0020) }
(0021) 
(0022) //读出时间函数
(0023) unsigned char read_tim(void)
(0024) {
(0025)  rcvackbyte();					  //接收一字节并返回应答
_read_tim:
     15E EC84      LDI	R24,0xC4
     15F 940E 0352 CALL	0x0352
(0026)  waitack();						  //等待接收完成
(0027)  if(chkack()!=MR_DATA_ACK)return I2C_ERR; 		  //检查是否接收成功
     161 3580      CPI	R24,0x50
     162 F011      BEQ	0x0165
     163 2700      CLR	R16
     164 C001      RJMP	0x0166
(0028)  else
(0029)  return(TWDR);				  //读出时钟数据
     165 B103      IN	R16,0x03
     166 9508      RET
_read_timer:
     167 92AA      ST	R10,-Y
     168 934A      ST	R20,-Y
(0030) }
(0031) 
(0032) /**********************************
(0033) *          读出数据函数			  *
(0034) **********************************/
(0035) unsigned char read_timer(void)
(0036) {
(0037)  start();		 	 	          //启动总线
     169 EA84      LDI	R24,0xA4
     16A 940E 0352 CALL	0x0352
(0038)  waitack();						  //等待启动完成
(0039)  if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
     16C 3088      CPI	R24,0x8
     16D F011      BEQ	0x0170
     16E 2700      CLR	R16
     16F C047      RJMP	0x01B7
(0040)  write_tim(PCF8563_SLA_W);				  //发送写地址
     170 EA02      LDI	R16,0xA2
     171 DFE2      RCALL	_write_tim
(0041)  write_tim(0x02);				  //写数据地址
     172 E002      LDI	R16,2
     173 DFE0      RCALL	_write_tim
(0042) 	
(0043)  start();
     174 EA84      LDI	R24,0xA4
     175 940E 0352 CALL	0x0352
(0044)  waitack();						  //等待启动完成
(0045)  if(chkack()!=RESTART)return I2C_ERR;	  //检查是否启动成功
     177 3180      CPI	R24,0x10
     178 F011      BEQ	0x017B
     179 2700      CLR	R16
     17A C03C      RJMP	0x01B7
(0046)  write_tim(PCF8563_SLA_R);				  //发送读地址
     17B EA03      LDI	R16,0xA3
     17C DFD7      RCALL	_write_tim
(0047) 	
(0048)  timer[0]=read_tim()&0x7F;		  //读出秒数据
     17D DFE0      RCALL	_read_tim
     17E 2F80      MOV	R24,R16
     17F 778F      ANDI	R24,0x7F
     180 9380 0060 STS	timer,R24
(0049)  timer[1]=read_tim()&0x7F;		  //读出分数据
     182 DFDB      RCALL	_read_tim
     183 2F80      MOV	R24,R16
     184 778F      ANDI	R24,0x7F
     185 9380 0061 STS	timer+1,R24
(0050)  timer[2]=read_tim()&0x3F;		  //读出时数据
     187 DFD6      RCALL	_read_tim
     188 2F40      MOV	R20,R16
     189 2F84      MOV	R24,R20
     18A 738F      ANDI	R24,0x3F
     18B 9380 0062 STS	timer+2,R24
(0051)  timer[3]=read_tim()&0x3F;		  //读出日数据
     18D DFD0      RCALL	_read_tim
     18E 2F40      MOV	R20,R16
     18F 2F84      MOV	R24,R20
     190 738F      ANDI	R24,0x3F
     191 9380 0063 STS	timer+3,R24
(0052)  timer[4]=read_tim()&0x07;		  //读出周数据
     193 DFCA      RCALL	_read_tim
     194 2F40      MOV	R20,R16
     195 2F84      MOV	R24,R20
     196 7087      ANDI	R24,7
     197 9380 0064 STS	0x0064,R24
(0053)  if(timer[4]==0)timer[4]=7;
     199 2388      TST	R24
     19A F419      BNE	0x019E
     19B E087      LDI	R24,7
     19C 9380 0064 STS	0x0064,R24
(0054)  timer[5]=read_tim();	  		  //读出月数据
     19E DFBF      RCALL	_read_tim
     19F 2EA0      MOV	R10,R16
     1A0 92A0 0065 STS	0x0065,R10
(0055)  if((timer[5]&0x80)==0)
     1A2 FD07      SBRC	R16,7
     1A3 C004      RJMP	0x01A8
(0056)   timer[7]=0x20;	 		  //世纪位为0,是21世纪
     1A4 E280      LDI	R24,0x20
     1A5 9380 0067 STS	0x0067,R24
     1A7 C003      RJMP	0x01AB
(0057)  else 
(0058)   timer[7]=0x19;			  //世纪位不为0,是20世纪
     1A8 E189      LDI	R24,0x19
     1A9 9380 0067 STS	0x0067,R24
(0059)  timer[5]=timer[5]&0x1F;
     1AB 9180 0065 LDS	R24,0x0065
     1AD 718F      ANDI	R24,0x1F
     1AE 9380 0065 STS	0x0065,R24
(0060)  timer[6]=read_tim();			  //读出年数据
     1B0 DFAD      RCALL	_read_tim
     1B1 2EA0      MOV	R10,R16
     1B2 92A0 0066 STS	0x0066,R10
(0061)  stop();
     1B4 E984      LDI	R24,0x94
     1B5 BF86      OUT	0x36,R24
(0062)  return I2C_CRR;
     1B6 E001      LDI	R16,1
     1B7 9149      LD	R20,Y+
     1B8 90A9      LD	R10,Y+
     1B9 9508      RET
_write_timer:
  dat                  --> R20
     1BA 934A      ST	R20,-Y
     1BB 935A      ST	R21,-Y
     1BC 01A8      MOVW	R20,R16
(0063) }
(0064) 
(0065) /**********************************
(0066) *          写入时钟函数			  *
(0067) **********************************/
(0068) unsigned char write_timer(unsigned char *dat)
(0069) {
(0070)  start();		 	 	          //启动总线
     1BD EA84      LDI	R24,0xA4
     1BE 940E 0352 CALL	0x0352
(0071)  waitack();						  //等待启动完成
(0072)  if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
     1C0 3088      CPI	R24,0x8
     1C1 F011      BEQ	0x01C4
     1C2 2700      CLR	R16
     1C3 C020      RJMP	0x01E4
(0073)  write_tim(PCF8563_SLA_W);				  //发送写地址
     1C4 EA02      LDI	R16,0xA2
     1C5 DF8E      RCALL	_write_tim
(0074)  write_tim(0x00);				  //写数据首地址
     1C6 2700      CLR	R16
     1C7 DF8C      RCALL	_write_tim
(0075)  write_tim(0x20);				  //写控制/状态寄存器1,暂停计时
     1C8 E200      LDI	R16,0x20
     1C9 DF8A      RCALL	_write_tim
(0076)  write_tim(0x00);				  //写控制/状态寄存器2
     1CA 2700      CLR	R16
     1CB DF88      RCALL	_write_tim
(0077)  write_tim(dat[0]);			      //写秒数据0
     1CC 01FA      MOVW	R30,R20
     1CD 8100      LDD	R16,Z+0
     1CE DF85      RCALL	_write_tim
(0078)  write_tim(dat[1]);			  //写分数据
     1CF 01FA      MOVW	R30,R20
     1D0 8101      LDD	R16,Z+1
     1D1 DF82      RCALL	_write_tim
(0079)  write_tim(dat[2]);			  //写时数据
     1D2 01FA      MOVW	R30,R20
     1D3 8102      LDD	R16,Z+2
     1D4 DF7F      RCALL	_write_tim
(0080)  write_tim(dat[3]);			  //写日数据
     1D5 01FA      MOVW	R30,R20
     1D6 8103      LDD	R16,Z+3
     1D7 DF7C      RCALL	_write_tim
(0081)  write_tim(dat[4]);			  //写周数据
     1D8 01FA      MOVW	R30,R20
     1D9 8104      LDD	R16,Z+4
     1DA DF79      RCALL	_write_tim
(0082)  write_tim(dat[5]);			  //写月数据
     1DB 01FA      MOVW	R30,R20
     1DC 8105      LDD	R16,Z+5
     1DD DF76      RCALL	_write_tim
(0083)  write_tim(dat[6]);			  //写年数据
     1DE 01FA      MOVW	R30,R20
     1DF 8106      LDD	R16,Z+6
     1E0 DF73      RCALL	_write_tim
(0084)  stop();
     1E1 E984      LDI	R24,0x94
     1E2 BF86      OUT	0x36,R24
(0085)  return I2C_CRR;
     1E3 E001      LDI	R16,1
     1E4 9159      LD	R21,Y+
     1E5 9149      LD	R20,Y+
     1E6 9508      RET
(0086) }
(0087) 
(0088) /**********************************
(0089) *          启动时钟函数			  *
(0090) **********************************/
(0091) unsigned char start_timer(void)
(0092) {
(0093)   start();		 	 	          //启动总线
_start_timer:
     1E7 EA84      LDI	R24,0xA4
     1E8 940E 0352 CALL	0x0352
(0094)   waitack();						  //等待启动完成
(0095)   if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
     1EA 3088      CPI	R24,0x8
     1EB F011      BEQ	0x01EE
     1EC 2700      CLR	R16
     1ED C009      RJMP	0x01F7
(0096)   write_tim(PCF8563_SLA_W);				  //发送写地址
     1EE EA02      LDI	R16,0xA2
     1EF DF64      RCALL	_write_tim
(0097)   write_tim(0x00);				  //写数据首地址
     1F0 2700      CLR	R16
     1F1 DF62      RCALL	_write_tim
(0098)   write_tim(0x00);				  //写控制/状态寄存器1,暂停计时
     1F2 2700      CLR	R16
     1F3 DF60      RCALL	_write_tim
(0099)   stop();
     1F4 E984      LDI	R24,0x94
     1F5 BF86      OUT	0x36,R24
(0100)   return I2C_CRR;
     1F6 E001      LDI	R16,1
     1F7 9508      RET
(0101) }
(0102) 
(0103) /**********************************
(0104) *   将时钟数据转换后在LCD上显示	  *
(0105) **********************************/ 
(0106) void timer_lcd(void)
(0107) {
(0108)  LCD_set_xy(4,0);			 	 	 //写指令:第1行第4列地址
_timer_lcd:
     1F8 2722      CLR	R18
     1F9 E004      LDI	R16,4
     1FA DE9F      RCALL	_LCD_set_xy
(0109) 
(0110)  LCD_write_char(0,(timer[7]>>4)+0x30);
     1FB 9120 0067 LDS	R18,0x0067
     1FD 940E 033F CALL	<created procedures>
     1FF DEB0      RCALL	_LCD_write_char
(0111)  LCD_write_char(0,(timer[7]&0x0f)+0x30);
     200 9120 0067 LDS	R18,0x0067
     202 2733      CLR	R19
     203 702F      ANDI	R18,0xF
     204 7030      ANDI	R19,0
     205 940E 034D CALL	0x034D
     207 DEA8      RCALL	_LCD_write_char
(0112)  LCD_write_char(0,(timer[6]>>4)+0x30);		 //显示年
     208 9120 0066 LDS	R18,0x0066
     20A 940E 033F CALL	<created procedures>
     20C DEA3      RCALL	_LCD_write_char
(0113)  LCD_write_char(0,(timer[6]&0x0f)+0x30);
     20D 9120 0066 LDS	R18,0x0066
     20F 2733      CLR	R19
     210 702F      ANDI	R18,0xF
     211 7030      ANDI	R19,0
     212 940E 034D CALL	0x034D
     214 DE9B      RCALL	_LCD_write_char
     215 940E 0370 CALL	0x0370
(0114)  LCD_write_char(0,'/');
     217 DE98      RCALL	_LCD_write_char
(0115)  LCD_write_char(0,(timer[5]>>4)+0x30);		 //显示月
     218 9120 0065 LDS	R18,0x0065
     21A 940E 033F CALL	<created procedures>
     21C DE93      RCALL	_LCD_write_char
(0116)  LCD_write_char(0,(timer[5]&0x0f)+0x30);

⌨️ 快捷键说明

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