?? eeprom.lst
字號:
0158 1784 CP R24,R20
0159 0795 CPC R25,R21
015A F02C BLT 0x0160
015B 3240 CPI R20,0x20
015C E0E0 LDI R30,0
015D 075E CPC R21,R30
015E F071 BEQ 0x016D
015F C018 RJMP 0x0178
0160 3348 CPI R20,0x38
0161 E0E0 LDI R30,0
0162 075E CPC R21,R30
0163 F0A1 BEQ 0x0178
0164 3348 CPI R20,0x38
0165 E0E0 LDI R30,0
0166 075E CPC R21,R30
0167 F084 BLT 0x0178
0168 3448 CPI R20,0x48
0169 E0E0 LDI R30,0
016A 075E CPC R21,R30
016B F049 BEQ 0x0175
016C C00B RJMP 0x0178
(0018) {
(0019) case 0x20: /*址址寫失敗*/
(0020) /*stop 停止*/
(0021) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
016D E984 LDI R24,0x94
016E 93800074 STS 0x74,R24
(0022) break;
0170 C007 RJMP 0x0178
(0023) case 0x30: /*數據寫失敗*/
(0024) /*stop 停止*/
(0025) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
0171 E984 LDI R24,0x94
0172 93800074 STS 0x74,R24
(0026) break;
0174 C003 RJMP 0x0178
(0027) case 0x38: /*仲裁失敗*/
(0028) break;
(0029) case 0x48: /*址址讀失敗*/
(0030) /*stop 停止*/
(0031) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
0175 E984 LDI R24,0x94
0176 93800074 STS 0x74,R24
(0032) break;
0178 940E0372 CALL pop_gset1
017A 9508 RET
_twi_write:
dd --> R20
addr --> R22
017B 940E036D CALL push_gset2
017D 2F42 MOV R20,R18
017E 2F60 MOV R22,R16
(0033) }
(0034) }
(0035) /*I2C總線單字節寫入*/
(0036) unsigned char twi_write(unsigned char addr, unsigned char dd)
(0037) {
(0038) TWBR = 2;
017F E082 LDI R24,2
0180 93800070 STS 0x70,R24
(0039) /*start 啟動*/
(0040) TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); //發送START信號
0182 EA84 LDI R24,0xA4
0183 93800074 STS 0x74,R24
(0041) while (!(TWCR & (1 << TWINT))); //等待TWINT置位,TWINT置位表示START信號已發出
0185 90200074 LDS R2,0x74
0187 FE27 SBRS R2,7
0188 CFFC RJMP 0x0185
(0042) if ((TWSR & 0xF8) != 0x08) {
0189 91800071 LDS R24,0x71
018B 7F88 ANDI R24,0xF8
018C 3088 CPI R24,0x8
018D F029 BEQ 0x0193
(0043) error(TWSR);
018E 91000071 LDS R16,0x71
0190 DFBB RCALL _error
(0044) return 0;
0191 2700 CLR R16
0192 C03E RJMP 0x01D1
(0045) }
(0046) /*SLA_W 芯片地址*/
(0047) TWDR = 0xA0;
0193 EA80 LDI R24,0xA0
0194 93800073 STS 0x73,R24
(0048) TWCR = (1 << TWINT) | (1 << TWEN); //TWINT位清零,啟動發送地址
0196 E884 LDI R24,0x84
0197 93800074 STS 0x74,R24
(0049) while (!(TWCR & (1 << TWINT)));
0199 90200074 LDS R2,0x74
019B FE27 SBRS R2,7
019C CFFC RJMP 0x0199
(0050) if ((TWSR & 0xF8) != 0x18) {
019D 91800071 LDS R24,0x71
019F 7F88 ANDI R24,0xF8
01A0 3188 CPI R24,0x18
01A1 F029 BEQ 0x01A7
(0051) error(TWSR);
01A2 91000071 LDS R16,0x71
01A4 DFA7 RCALL _error
(0052) return 0;
01A5 2700 CLR R16
01A6 C02A RJMP 0x01D1
(0053) }
(0054) /*addr 操作地址*/
(0055) TWDR = addr;
01A7 93600073 STS 0x73,R22
(0056) TWCR = (1 << TWINT) | (1 << TWEN);
01A9 E884 LDI R24,0x84
01AA 93800074 STS 0x74,R24
(0057) while (!(TWCR & (1 << TWINT)));
01AC 90200074 LDS R2,0x74
01AE FE27 SBRS R2,7
01AF CFFC RJMP 0x01AC
(0058) if ((TWSR & 0xF8) != 0x28) {
01B0 91800071 LDS R24,0x71
01B2 7F88 ANDI R24,0xF8
01B3 3288 CPI R24,0x28
01B4 F029 BEQ 0x01BA
(0059) error(TWSR);
01B5 91000071 LDS R16,0x71
01B7 DF94 RCALL _error
(0060) return 0;
01B8 2700 CLR R16
01B9 C017 RJMP 0x01D1
(0061) }
(0062)
(0063) /*dd 寫入數據*/
(0064) TWDR = dd;
01BA 93400073 STS 0x73,R20
(0065) TWCR = (1 << TWINT) | (1 << TWEN);
01BC E884 LDI R24,0x84
01BD 93800074 STS 0x74,R24
(0066) while (!(TWCR & (1 << TWINT)));
01BF 90200074 LDS R2,0x74
01C1 FE27 SBRS R2,7
01C2 CFFC RJMP 0x01BF
(0067) if ((TWSR & 0xF8) != 0x28) {
01C3 91800071 LDS R24,0x71
01C5 7F88 ANDI R24,0xF8
01C6 3288 CPI R24,0x28
01C7 F029 BEQ 0x01CD
(0068) error(TWSR);
01C8 91000071 LDS R16,0x71
01CA DF81 RCALL _error
(0069) return 0;
01CB 2700 CLR R16
01CC C004 RJMP 0x01D1
(0070) }
(0071)
(0072) /*stop 停止*/
(0073) TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
01CD E984 LDI R24,0x94
01CE 93800074 STS 0x74,R24
(0074) return 1;
01D0 E001 LDI R16,1
01D1 940E0361 CALL pop_gset2
01D3 9508 RET
_twi_read:
dd --> R20
addr --> R22
01D4 940E036D CALL push_gset2
01D6 01A9 MOVW R20,R18
01D7 2F60 MOV R22,R16
(0075) }
(0076) /*I2C總線單字節讀取*/
(0077) unsigned char twi_read(unsigned char addr, unsigned char *dd)
(0078) {
(0079) TWBR = 2;
01D8 E082 LDI R24,2
01D9 93800070 STS 0x70,R24
(0080) /*start 啟動*/
(0081) TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
01DB EA84 LDI R24,0xA4
01DC 93800074 STS 0x74,R24
(0082) while(!(TWCR&(1<<TWINT)));
01DE 90200074 LDS R2,0x74
01E0 FE27 SBRS R2,7
01E1 CFFC RJMP 0x01DE
(0083) if ((TWSR & 0xF8) != 0x08) {
01E2 91800071 LDS R24,0x71
01E4 7F88 ANDI R24,0xF8
01E5 3088 CPI R24,0x8
01E6 F029 BEQ 0x01EC
(0084) error(TWSR);
01E7 91000071 LDS R16,0x71
01E9 DF62 RCALL _error
(0085) return 0;
01EA 2700 CLR R16
01EB C065 RJMP 0x0251
(0086) }
(0087) /*SLA_W 芯片地址*/
(0088) TWDR = 0xA0;
01EC EA80 LDI R24,0xA0
01ED 93800073 STS 0x73,R24
(0089) TWCR = (1 << TWINT) | (1 << TWEN);
01EF E884 LDI R24,0x84
01F0 93800074 STS 0x74,R24
(0090) while (!(TWCR & (1 << TWINT)));
01F2 90200074 LDS R2,0x74
01F4 FE27 SBRS R2,7
01F5 CFFC RJMP 0x01F2
(0091) if ((TWSR & 0xF8) != 0x18) {
01F6 91800071 LDS R24,0x71
01F8 7F88 ANDI R24,0xF8
01F9 3188 CPI R24,0x18
01FA F029 BEQ 0x0200
(0092) error(TWSR);
01FB 91000071 LDS R16,0x71
01FD DF4E RCALL _error
(0093) return 0;
01FE 2700 CLR R16
01FF C051 RJMP 0x0251
(0094) }
(0095) /*addr 操作地址*/
(0096) TWDR = addr;
0200 93600073 STS 0x73,R22
(0097) TWCR = (1 << TWINT) | (1 << TWEN);
0202 E884 LDI R24,0x84
0203 93800074 STS 0x74,R24
(0098) while (!(TWCR & (1 << TWINT)));
0205 90200074 LDS R2,0x74
0207 FE27 SBRS R2,7
0208 CFFC RJMP 0x0205
(0099) if ((TWSR & 0xF8) != 0x28) {
0209 91800071 LDS R24,0x71
020B 7F88 ANDI R24,0xF8
020C 3288 CPI R24,0x28
020D F029 BEQ 0x0213
(0100) error(TWSR);
020E 91000071 LDS R16,0x71
0210 DF3B RCALL _error
(0101) return 0;
0211 2700 CLR R16
0212 C03E RJMP 0x0251
(0102) }
(0103)
(0104) /*start 啟動*/
(0105) TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
0213 EA84 LDI R24,0xA4
0214 93800074 STS 0x74,R24
(0106) while (!(TWCR & (1 << TWINT)));
0216 90200074 LDS R2,0x74
0218 FE27 SBRS R2,7
0219 CFFC RJMP 0x0216
(0107) if ((TWSR & 0xF8) != 0x10) {
021A 91800071 LDS R24,0x71
021C 7F88 ANDI R24,0xF8
021D 3180 CPI R24,0x10
021E F029 BEQ 0x0224
(0108) error(TWSR);
021F 91000071 LDS R16,0x71
0221 DF2A RCALL _error
(0109) return 0;
0222 2700 CLR R16
0223 C02D RJMP 0x0251
(0110) }
(0111)
(0112) /*SLA_R 芯片地址*/
(0113) TWDR = 0xA1;
0224 EA81 LDI R24,0xA1
0225 93800073 STS 0x73,R24
(0114) TWCR = (1 << TWINT) | (1 << TWEN);
0227 E884 LDI R24,0x84
0228 93800074 STS 0x74,R24
(0115) while (!(TWCR & (1 << TWINT)));
022A 90200074 LDS R2,0x74
022C FE27 SBRS R2,7
022D CFFC RJMP 0x022A
(0116) if ((TWSR & 0xF8) != 0x40) {
022E 91800071 LDS R24,0x71
0230 7F88 ANDI R24,0xF8
0231 3480 CPI R24,0x40
0232 F029 BEQ 0x0238
(0117) error(TWSR);
0233 91000071 LDS R16,0x71
0235 DF16 RCALL _error
(0118) return 0;
0236 2700 CLR R16
0237 C019 RJMP 0x0251
(0119) }
(0120) /*讀取數據*/
(0121) TWCR = (1 << TWINT) | (1 << TWEN);
0238 E884 LDI R24,0x84
0239 93800074 STS 0x74,R24
(0122) while (!(TWCR & (1 << TWINT)));
023B 90200074 LDS R2,0x74
023D FE27 SBRS R2,7
023E CFFC RJMP 0x023B
(0123) if ((TWSR & 0xF8) != 0x58) {
023F 91800071 LDS R24,0x71
0241 7F88 ANDI R24,0xF8
0242 3588 CPI R24,0x58
0243 F029 BEQ 0x0249
(0124) error(TWSR);
0244 91000071 LDS R16,0x71
0246 DF05 RCALL _error
(0125) return 0;
0247 2700 CLR R16
0248 C008 RJMP 0x0251
(0126) }
(0127) *dd = TWDR;
0249 90200073 LDS R2,0x73
024B 01FA MOVW R30,R20
024C 8220 STD Z+0,R2
(0128)
(0129) /*stop 停止*/
(0130) TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
024D E984 LDI R24,0x94
024E 93800074 STS 0x74,R24
(0131) return 1;
0250 E001 LDI R16,1
0251 940E0361 CALL pop_gset2
0253 9508 RET
_ds1302_write_byte:
i --> R20
d --> R18
addr --> R16
0254 940E036F CALL push_gset1
FILE: E:\icc\eeprom\DS1302.h
(0001) //#include <iom16v.h>
(0002) //復位腳
(0003) #define RST_CLR PORTE&=~(1<<PE4)
(0004) #define RST_SET PORTE|=(1<<PE4)
(0005) #define RST_IN DDRE&=~(1<<PE4)
(0006) #define RST_OUT DDRE|=(1<<PE4)
(0007) //雙向數據
(0008)
(0009) #define IO_CLR PORTE&=~(1<<PE3)
(0010) #define IO_SET PORTE|=(1<<PE3)
(0011) #define IO_R PINE&(1<<PE3)
(0012) #define IO_IN DDRE&=~(1<<PE3)
(0013) #define IO_OUT DDRE|=(1<<PE3)
(0014) //時鐘信號
(0015) #define SCK_CLR PORTE&=~(1<<PE2)
(0016) #define SCK_SET PORTE|=(1<<PE2)
(0017) #define SCK_IN DDRE&=~(1<<PE2)
(0018) #define SCK_OUT DDRE|=(1<<PE2)
(0019) #define ds1302_sec_add 0x80 //秒數據地址
(0020) #define ds1302_min_add 0x82 //分數據地址
(0021) #define ds1302_hr_add 0x84 //時數據地址
(0022) #define ds1302_date_add 0x86 //日數據地址
(0023) #define ds1302_month_add 0x88 //月數據地址
(0024) #define ds1302_day_add 0x8a //星期數據地址
(0025) #define ds1302_year_add 0x8c //年數據地址
(0026) #define ds1302_control_add 0x8e //控制數據地址
(0027) #define ds1302_charger_add 0x90
(0028) #define ds1302_clkburst_add 0xbe
(0029) unsigned char time_buf[8] = {0x20,0x08,0x03,0x21,0x20,0x20,0x50,0x02};
(0030) /*向DS1302寫入一字節數據*/
(0031) void ds1302_write_byte(unsigned char addr, unsigned char d)
(0032) {
(0033)
(0034) unsigned char i;
(0035) RST_SET; /*啟動DS1302總線*/
0256 9A1C SBI 0x03,4
(0036)
(0037) /*寫入目標地址:addr*/
(0038) IO_OUT;
0257 9A13 SBI 0x02,3
(0039) addr = addr & 0xFE;/*最低位置零*/
0258 7F0E ANDI R16,0xFE
(0040) for (i = 0; i < 8; i ++) {
0259 2744 CLR R20
025A C009 RJMP 0x0264
(0041) if (addr & 0x01) {
025B FF00 SBRS R16,0
025C C002 RJMP 0x025F
(0042) IO_SET;
025D 9A1B SBI 0x03,3
(0043) }
025E C001 RJMP 0x0260
(0044) else {
(0045) IO_CLR;
025F 981B CBI 0x03,3
(0046) }
(0047) SCK_SET;
0260 9A1A SBI 0x03,2
(0048) SCK_CLR;
0261 981A CBI 0x03,2
(0049) addr = addr >> 1;
0262 9506 LSR R16
0263 9543 INC R20
0264 3048 CPI R20,0x8
0265 F3A8 BCS 0x025B
(0050) }
(0051)
(0052) /*寫入數據:d*/
(0053) IO_OUT;
0266 9A13 SBI 0x02,3
(0054) for (i = 0; i < 8; i ++) {
0267 2744 CLR R20
0268 C009 RJMP 0x0272
(0055) if (d & 0x01) {
0269 FF20 SBRS R18,0
026A C002 RJMP 0x026D
(0056) IO_SET;
026B 9A1B SBI 0x03,3
(0057) }
026C C001 RJMP 0x026E
(0058) else {
(0059) IO_CLR;
026D 981B CBI 0x03,3
(0060) }
(0061) SCK_SET;
026E 9A1A SBI 0x03,2
(0062) SCK_CLR;
026F 981A CBI 0x03,2
(0063) d = d >> 1;
0270 9526 LSR R18
0271 9543 INC R20
0272 3048 CPI R20,0x8
0273 F3A8 BCS 0x0269
(0064) }
(0065) RST_CLR; /*停止DS1302總線*/
0274 981C CBI 0x03,4
0275 940E0372 CALL pop_gset1
0277 9508 RET
_ds1302_read_byte:
temp --> R20
i --> R22
addr --> R16
0278 940E036D CALL push_gset2
(0066) }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -