📄 m128.lst
字号:
(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 + -