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

📄 m128.lst

📁 用SL811做USB主机的源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0004) 								0x00,//分
(0005) 								0x00,//小时
(0006) 								0x01,//日
(0007) 								0x00,//星期
(0008) 								0x01,//月\世纪
(0009) 								0x00,//年
(0010) 								0x80,//分钟报警
(0011) 								0x80,//小时报警
(0012) 								0x81,//日报警
(0013) 								0x80,//星期报警
(0014) 								0x00,//禁止CLKOUT
(0015) 								0x00,//功能禁止,降低功耗.
(0016) 								0x00};
(0017) const unsigned char PCF_cover[16]={	0xa8,0x1f,0x7f,0x7f,0x3f,0x3f,0x07,0x1f,
(0018) 	  		   						0xff,0xff,0xbf,0xbf,0x87,0x83,0x83,0xff};								
(0019) unsigned char bcd_hex(unsigned char x)
(0020) {	return (x/16*10+x%16);
    14A1 E110      LDI	R17,0x10
    14A2 2F04      MOV	R16,R20
    14A3 940E514C  CALL	div8u
    14A5 E08A      LDI	R24,0xA
    14A6 9F80      MUL	R24,R16
    14A7 0110      MOVW	R2,R0
    14A8 E110      LDI	R17,0x10
    14A9 2F04      MOV	R16,R20
    14AA 940E514A  CALL	mod8u
    14AC 2E40      MOV	R4,R16
    14AD 2D02      MOV	R16,R2
    14AE 0D04      ADD	R16,R4
    14AF 940E520D  CALL	pop_gset1
    14B1 9508      RET
_hex_bcd:
  x                    --> R20
    14B2 940E520A  CALL	push_gset1
    14B4 2F40      MOV	R20,R16
(0021) }
(0022) unsigned char hex_bcd(unsigned char x)
(0023) {	return (x/10*16+x%10);
    14B5 E01A      LDI	R17,0xA
    14B6 2F04      MOV	R16,R20
    14B7 940E514C  CALL	div8u
    14B9 E180      LDI	R24,0x10
    14BA 9F80      MUL	R24,R16
    14BB 0110      MOVW	R2,R0
    14BC E01A      LDI	R17,0xA
    14BD 2F04      MOV	R16,R20
    14BE 940E514A  CALL	mod8u
    14C0 2E40      MOV	R4,R16
    14C1 2D02      MOV	R16,R2
    14C2 0D04      ADD	R16,R4
    14C3 940E520D  CALL	pop_gset1
    14C5 9508      RET
(0024) }
(0025) /*
(0026)   Name:	***write_pcf8563***read_pcf8563***
(0027)   Author:zhouxianfa. 
(0028)   Date:2004-7-16.
(0029)   Model_write:start+SLA_W+address+(data0...dataN)+stop.
(0030)   Model_read:start+SLA_W+address+repeat_start+SLA_R+(RECEIVE data0...dataN)+stop.
(0031)   Known:SLA_W=0a2h,address=写入PCF8563数据串的起始地址(读取数据的起始地址).
(0032)   		SLA_W是所选器件的系统地址,SLA_R=SLA_W+1.
(0033) 		ACK在发送数据时不理会,系统自处理.
(0034) 		  write_pcf8563时,ACK信号不必理会.
(0035) 		  read_pcf8563 时,在收到ST的数据后,前n-1个数据发送ACK(TWEA=1),n数据发送NACK(TWEA=0).
(0036) 		  
(0037)   For PCF8563:
(0038)   	  00h:控制/状态寄存器1.		bit7=test,bit5=stop,bit3=testC.
(0039) 	  01h:控制/状态寄存器2. 	bit4=Ti/Tp,bit3=AF,bit2=TF,bit1=Aie,bit0=Tie.
(0040) 	  02h:second.				VL+second_value.
(0041) 	  03h:minute.				(bit6...bit0)=minute_value.
(0042) 	  04h:hour.					(bit6...bit0)=hour_value.
(0043) 	  05h:data.					(bit6...bit0)=data_value.
(0044) 	  06h:day.					(bit2...bit0)=day_value.
(0045) 	  07h:month/century.		bit7=C,(bit4...bit0)=(01~12)BCD
(0046) 	  08h:year.					(bit7...bit0)=year_value.
(0047) 	  09h:warring_minute.		bit7=AE,(bit6...bit0)=warring_value.
(0048) 	  0ah:warring_hour.			bit7=AE,(bit5...bit0)=warring_value.
(0049) 	  0bh:warring_data.			bit7=AE,(bit5...bit0)=warring_value.
(0050) 	  0ch:warring_day.			bit7=AE,bit2...bit0=warring_value.
(0051) 	  0dh:CLKOUT输出寄存器.		bit7=FE,...,bit1=FD1,bit0=FD0.
(0052) 	  0eh:定时器控制寄存器.		bit7=TE,...,bit1=TD1,bit0=TD0.
(0053) 	  0fh:定时器倒数数值寄存器.		定时器倒计数数值(二进制).
(0054) 	  (attention:The values are BCDM.)
(0055) */  
(0056) 
(0057) void start(void)
(0058) {unsigned char temp=0;
_start:
  temp                 --> R16
    14C6 2700      CLR	R16
(0059) 	 temp = (1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
    14C7 EA04      LDI	R16,0xA4
(0060) 	 TWCR = temp;
    14C8 93000074  STS	0x74,R16
(0061) }	  			 
    14CA 9508      RET
(0062) void stop(void)
(0063) {unsigned char temp=0;
_stop:
  temp                 --> R16
    14CB 2700      CLR	R16
(0064) 	 temp = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    14CC E904      LDI	R16,0x94
(0065) 	 TWCR = temp;
    14CD 93000074  STS	0x74,R16
(0066) }	  			 
    14CF 9508      RET
(0067) void write8bit(unsigned char data)
(0068) {
(0069) 	 TWDR=data;
_write8bit:
  data                 --> R16
    14D0 93000073  STS	0x73,R16
(0070) 	 TWCR = (1<<TWINT)|(1<<TWEN);
    14D2 E884      LDI	R24,0x84
    14D3 93800074  STS	0x74,R24
(0071) }
    14D5 9508      RET
(0072) void testAck(void)
(0073) {	 while (!(TWCR&(1<<7))) ;	}
_testAck:
    14D6 90200074  LDS	R2,0x74
    14D8 FE27      SBRS	R2,7
    14D9 CFFC      RJMP	_testAck
    14DA 9508      RET
(0074) void NoAck(void)
(0075) {
(0076) 	 TWCR &= ~(1<<TWEA);
_NoAck:
    14DB 91800074  LDS	R24,0x74
    14DD 7B8F      ANDI	R24,0xBF
    14DE 93800074  STS	0x74,R24
(0077) 	 //TWCR |= (1<<7);
(0078) }
    14E0 9508      RET
(0079) void Ack(void)
(0080) {
(0081) 	 TWCR |= (1<<TWEA);
_Ack:
    14E1 91800074  LDS	R24,0x74
    14E3 6480      ORI	R24,0x40
    14E4 93800074  STS	0x74,R24
(0082) 	 //TWCR |= (1<<7);
(0083) }
    14E6 9508      RET
_read_pcf:
  temp                 --> R20
  address              --> R20
    14E7 940E520A  CALL	push_gset1
    14E9 2F40      MOV	R20,R16
(0084) 
(0085) unsigned char read_pcf(unsigned char address)
(0086) {unsigned char temp;
(0087) 	start();
    14EA DFDB      RCALL	_start
(0088) 	testAck();	
    14EB DFEA      RCALL	_testAck
(0089) 	write8bit(0xa2);
    14EC EA02      LDI	R16,0xA2
    14ED DFE2      RCALL	_write8bit
(0090) 	testAck();	
    14EE DFE7      RCALL	_testAck
(0091) 	write8bit(address);
    14EF 2F04      MOV	R16,R20
    14F0 DFDF      RCALL	_write8bit
(0092) 	testAck();
    14F1 DFE4      RCALL	_testAck
(0093) 	start();
    14F2 DFD3      RCALL	_start
(0094) 	testAck();
    14F3 DFE2      RCALL	_testAck
(0095) 	write8bit(0xa3);//Enter the MR. pass!
    14F4 EA03      LDI	R16,0xA3
    14F5 DFDA      RCALL	_write8bit
(0096) 	testAck();
    14F6 DFDF      RCALL	_testAck
(0097) 	
(0098) 	TWCR |= (1<<7);	
    14F7 91800074  LDS	R24,0x74
    14F9 6880      ORI	R24,0x80
    14FA 93800074  STS	0x74,R24
(0099) 	Ack();
    14FC DFE4      RCALL	_Ack
(0100) 	testAck();//recevied a data.
    14FD DFD8      RCALL	_testAck
(0101) 	
(0102) 	temp=TWDR;
    14FE 91400073  LDS	R20,0x73
(0103) 	NoAck();
    1500 DFDA      RCALL	_NoAck
(0104) 	TWCR |= (1<<7);	
    1501 91800074  LDS	R24,0x74
    1503 6880      ORI	R24,0x80
    1504 93800074  STS	0x74,R24
(0105) 	testAck();
    1506 DFCF      RCALL	_testAck
(0106) 	
(0107) 	stop();
    1507 DFC3      RCALL	_stop
(0108) 	//delayms(1);
(0109) 	return (temp);
    1508 2F04      MOV	R16,R20
    1509 940E520D  CALL	pop_gset1
    150B 9508      RET
_read_pcf16:
  temp                 --> R20
  address              --> R20
    150C 940E520A  CALL	push_gset1
    150E 2F40      MOV	R20,R16
(0110) }
(0111) void read_pcf16(unsigned char address)
(0112) {unsigned char temp;
(0113) 	start();
    150F DFB6      RCALL	_start
(0114) 	testAck();	
    1510 DFC5      RCALL	_testAck
(0115) 	write8bit(0xa2);
    1511 EA02      LDI	R16,0xA2
    1512 DFBD      RCALL	_write8bit
(0116) 	testAck();	
    1513 DFC2      RCALL	_testAck
(0117) 	write8bit(0);
    1514 2700      CLR	R16
    1515 DFBA      RCALL	_write8bit
(0118) 	testAck();
    1516 DFBF      RCALL	_testAck
(0119) 	start();
    1517 DFAE      RCALL	_start
(0120) 	testAck();
    1518 DFBD      RCALL	_testAck
(0121) 	write8bit(0xa3);//Enter the MR. pass!
    1519 EA03      LDI	R16,0xA3
    151A DFB5      RCALL	_write8bit
(0122) 	testAck();
    151B DFBA      RCALL	_testAck
(0123) 	
(0124) 	TWCR |= (1<<7);	
    151C 91800074  LDS	R24,0x74
    151E 6880      ORI	R24,0x80
    151F 93800074  STS	0x74,R24
(0125) 	Ack();
    1521 DFBF      RCALL	_Ack
(0126) 	testAck();//recevied a data.
    1522 DFB3      RCALL	_testAck
(0127) 	
(0128) 	for (temp=0;temp<15;temp++)
    1523 2744      CLR	R20
    1524 C018      RJMP	0x153D
(0129) 		{PCF_register[temp] = TWDR&PCF_cover[temp];
    1525 E58E      LDI	R24,0x5E
    1526 E195      LDI	R25,0x15
    1527 2FE4      MOV	R30,R20
    1528 27FF      CLR	R31
    1529 0FE8      ADD	R30,R24
    152A 1FF9      ADC	R31,R25
    152B 91E4      LPM	R30,0(Z)
    152C 90200073  LDS	R2,0x73
    152E 222E      AND	R2,R30
    152F E280      LDI	R24,0x20
    1530 E194      LDI	R25,0x14
    1531 2FE4      MOV	R30,R20
    1532 27FF      CLR	R31
    1533 0FE8      ADD	R30,R24
    1534 1FF9      ADC	R31,R25
    1535 8220      STD	R2,0+Z
(0130) 		TWCR |= (1<<7);	
    1536 91800074  LDS	R24,0x74
    1538 6880      ORI	R24,0x80
    1539 93800074  STS	0x74,R24
(0131) 		testAck();}
    153B DF9A      RCALL	_testAck
    153C 9543      INC	R20
    153D 304F      CPI	R20,0xF
    153E F330      BCS	0x1525
(0132) 	
(0133) 	PCF_register[temp]=TWDR&PCF_cover[temp];
    153F E58E      LDI	R24,0x5E
    1540 E195      LDI	R25,0x15
    1541 2FE4      MOV	R30,R20
    1542 27FF      CLR	R31
    1543 0FE8      ADD	R30,R24
    1544 1FF9      ADC	R31,R25
    1545 91E4      LPM	R30,0(Z)
    1546 90200073  LDS	R2,0x73
    1548 222E      AND	R2,R30
    1549 E280      LDI	R24,0x20
    154A E194      LDI	R25,0x14
    154B 2FE4      MOV	R30,R20
    154C 27FF      CLR	R31
    154D 0FE8      ADD	R30,R24
    154E 1FF9      ADC	R31,R25
    154F 8220      STD	R2,0+Z
(0134) 	NoAck();
    1550 DF8A      RCALL	_NoAck
(0135) 	TWCR |= (1<<7);	
    1551 91800074  LDS	R24,0x74
    1553 6880      ORI	R24,0x80
    1554 93800074  STS	0x74,R24
(0136) 	testAck();
    1556 DF7F      RCALL	_testAck
(0137) 	
(0138) 	stop();
    1557 DF73      RCALL	_stop
(0139) 	//delayms(1);
(0140) }
    1558 940E520D  CALL	pop_gset1
    155A 9508      RET
_write_pcf:
  data                 --> R20
  address              --> R22
    155B 940E5221  CALL	push_gset2
    155D 2F42      MOV	R20,R18
    155E 2F60      MOV	R22,R16
(0141) 
(0142) void write_pcf(unsigned char address,unsigned char data)//Pass
(0143) {	start();
    155F DF66      RCALL	_start
(0144) 	testAck();
    1560 DF75      RCALL	_testAck
(0145) 	write8bit(0xa2);
    1561 EA02      LDI	R16,0xA2
    1562 DF6D      RCALL	_write8bit
(0146) 	testAck();
    1563 DF72      RCALL	_testAck
(0147) 	write8bit(address);
    1564 2F06      MOV	R16,R22
    1565 DF6A      RCALL	_write8bit
(0148) 	testAck();	
    1566 DF6F      RCALL	_testAck
(0149) 	write8bit(data);
    1567 2F04      MOV	R16,R20
    1568 DF67      RCALL	_write8bit
(0150) 	testAck();	
    1569 DF6C      RCALL	_testAck
(0151) 	stop();
    156A DF60      RCALL	_stop
(0152) 	//delayms(1);
(0153) }
    156B 940E5231  CALL	pop_gset2
    156D 9508      RET
_write_pcf16:
  temp                 --> R20
    156E 940E520A  CALL	push_gset1
(0154) 
(0155) void write_pcf16(void)//Pass
(0156) {unsigned char temp;
(0157) 	start();
    1570 DF55      RCALL	_start
(0158) 	testAck();
    1571 DF64      RCALL	_testAck
(0159) 	write8bit(0xa2);
    1572 EA02      LDI	R16,0xA2
    1573 DF5C      RCALL	_write8bit
(0160) 	testAck();
    1574 DF61      RCALL	_testAck
(0161) 	write8bit(0);
    1575 2700      CLR	R16
    1576 DF59      RCALL	_write8bit
(0162) 	testAck();
    1577 DF5E      RCALL	_testAck
(0163) 	
(0164) 	for (temp=0;temp<16;temp++)
    1578 2744      CLR	R20
    1579 C00A      RJMP	0x1584
(0165) 		{write8bit(PCF_register[temp]);
    157A E280      LDI	R24,0x20
    157B E194      LDI	R25,0x14
    157C 2FE4      MOV	R30,R20
    157D 27FF      CLR	R31
    157E 0FE8      ADD	R30,R24
    157F 1FF9      ADC	R31,R25
    1580 8100      LDD	R16,0+Z
    1581 DF4E      RCALL	_write8bit
(0166) 		testAck();}
    1582 DF53      RCALL	_testAck
    1583 9543      INC	R20
    1584 3140      CPI	R20,0x10
    1585 F3A0      BCS	0x157A
(0167) 	
(0168) 	stop();
    1586 DF44      RCALL	_stop
(0169) 	//delayms(1);
(0170) }
    1587 940E520D  CALL	pop_gset1
    1589 9508      RET
(0171) 
(0172) #define Fscl 400
(0173) //400其实是400Khz
(0174) void twi_init(void)
(0175) {
(0176)  TWCR=0;
_twi_init:
    158A 2422      CLR	R2
  

⌨️ 快捷键说明

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