📄 eeprom.lst
字号:
(0067)
(0068) /*从DS1302读出一字节数据*/
(0069) unsigned char ds1302_read_byte(unsigned char addr) {
(0070)
(0071) unsigned char i;
(0072) unsigned char temp;
(0073) RST_SET; /*启动DS1302总线*/
027A 9A1C SBI 0x03,4
(0074)
(0075) /*写入目标地址:addr*/
(0076) IO_OUT;
027B 9A13 SBI 0x02,3
(0077) addr = addr | 0x01;/*最低位置高*/
027C 6001 ORI R16,1
(0078) for (i = 0; i < 8; i ++) {
027D 2766 CLR R22
027E C009 RJMP 0x0288
(0079) if (addr & 0x01) {
027F FF00 SBRS R16,0
0280 C002 RJMP 0x0283
(0080) IO_SET;
0281 9A1B SBI 0x03,3
(0081) }
0282 C001 RJMP 0x0284
(0082) else {
(0083) IO_CLR;
0283 981B CBI 0x03,3
(0084) }
(0085) SCK_SET;
0284 9A1A SBI 0x03,2
(0086) SCK_CLR;
0285 981A CBI 0x03,2
(0087) addr = addr >> 1;
0286 9506 LSR R16
0287 9563 INC R22
0288 3068 CPI R22,0x8
0289 F3A8 BCS 0x027F
(0088) }
(0089)
(0090) /*输出数据:temp*/
(0091) IO_IN;
028A 9813 CBI 0x02,3
(0092) for (i = 0; i < 8; i ++) {
028B 2766 CLR R22
028C C009 RJMP 0x0296
(0093) temp = temp >> 1;
028D 9546 LSR R20
(0094) if (IO_R) {
028E 9B0B SBIS 0x01,3
028F C002 RJMP 0x0292
(0095) temp |= 0x80;
0290 6840 ORI R20,0x80
(0096) }
0291 C001 RJMP 0x0293
(0097) else {
(0098) temp &= 0x7F;
0292 774F ANDI R20,0x7F
(0099) }
(0100) SCK_SET;
0293 9A1A SBI 0x03,2
(0101) SCK_CLR;
0294 981A CBI 0x03,2
0295 9563 INC R22
0296 3068 CPI R22,0x8
0297 F3A8 BCS 0x028D
(0102) }
(0103)
(0104) RST_CLR; /*停止DS1302总线*/
0298 981C CBI 0x03,4
(0105) return temp;
0299 2F04 MOV R16,R20
029A 940E0361 CALL pop_gset2
029C 9508 RET
(0106) }
(0107)
(0108) /*向DS302写入时钟数据*/
(0109) void ds1302_write_time(void) {
(0110)
(0111) ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
_ds1302_write_time:
029D 2722 CLR R18
029E E80E LDI R16,0x8E
029F DFB4 RCALL _ds1302_write_byte
(0112) ds1302_write_byte(ds1302_sec_add,0x80); //暂停
02A0 E820 LDI R18,0x80
02A1 E800 LDI R16,0x80
02A2 DFB1 RCALL _ds1302_write_byte
(0113) //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
(0114) ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
02A3 91200101 LDS R18,time_buf+1
02A5 E80C LDI R16,0x8C
02A6 DFAD RCALL _ds1302_write_byte
(0115) ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
02A7 91200102 LDS R18,time_buf+2
02A9 E808 LDI R16,0x88
02AA DFA9 RCALL _ds1302_write_byte
(0116) ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
02AB 91200103 LDS R18,time_buf+3
02AD E806 LDI R16,0x86
02AE DFA5 RCALL _ds1302_write_byte
(0117) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
02AF 91200107 LDS R18,0x107
02B1 E80A LDI R16,0x8A
02B2 DFA1 RCALL _ds1302_write_byte
(0118) ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
02B3 91200104 LDS R18,0x104
02B5 E804 LDI R16,0x84
02B6 DF9D RCALL _ds1302_write_byte
(0119) ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
02B7 91200105 LDS R18,0x105
02B9 E802 LDI R16,0x82
02BA DF99 RCALL _ds1302_write_byte
(0120) ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
02BB 91200106 LDS R18,0x106
02BD E800 LDI R16,0x80
02BE DF95 RCALL _ds1302_write_byte
(0121) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
02BF 91200107 LDS R18,0x107
02C1 E80A LDI R16,0x8A
02C2 DF91 RCALL _ds1302_write_byte
(0122) ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
02C3 E820 LDI R18,0x80
02C4 E80E LDI R16,0x8E
02C5 DF8E RCALL _ds1302_write_byte
02C6 9508 RET
(0123) }
(0124)
(0125) /*从DS302读出时钟数据*/
(0126) void ds1302_read_time(void) {
(0127)
(0128) time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
_ds1302_read_time:
02C7 E80C LDI R16,0x8C
02C8 DFAF RCALL _ds1302_read_byte
02C9 93000101 STS time_buf+1,R16
(0129) time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
02CB E808 LDI R16,0x88
02CC DFAB RCALL _ds1302_read_byte
02CD 93000102 STS time_buf+2,R16
(0130) time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
02CF E806 LDI R16,0x86
02D0 DFA7 RCALL _ds1302_read_byte
02D1 93000103 STS time_buf+3,R16
(0131) time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
02D3 E804 LDI R16,0x84
02D4 DFA3 RCALL _ds1302_read_byte
02D5 93000104 STS 0x104,R16
(0132) time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
02D7 E802 LDI R16,0x82
02D8 DF9F RCALL _ds1302_read_byte
02D9 93000105 STS 0x105,R16
(0133) time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
02DB E800 LDI R16,0x80
02DC DF9B RCALL _ds1302_read_byte
02DD 2F80 MOV R24,R16
02DE 778F ANDI R24,0x7F
02DF 93800106 STS 0x106,R24
(0134) time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
02E1 E80A LDI R16,0x8A
02E2 DF95 RCALL _ds1302_read_byte
02E3 93000107 STS 0x107,R16
02E5 9508 RET
(0135) }
(0136)
(0137) /*DS302初始化函数*/
(0138) void ds1302_init(void) {
(0139)
(0140) RST_CLR; /*RST脚置低*/
_ds1302_init:
02E6 981C CBI 0x03,4
(0141) SCK_CLR; /*SCK脚置低*/
02E7 981A CBI 0x03,2
(0142) RST_OUT; /*RST脚设置为输出*/
02E8 9A14 SBI 0x02,4
(0143) SCK_OUT; /*SCK脚设置为输出*/
02E9 9A12 SBI 0x02,2
02EA 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
02EB 940E036D CALL push_gset2
FILE: E:\icc\eeprom\eeprom.c
(0001) //ICC-AVR application builder : 2008-10-8 下午 04:03:04
(0002) // Target : M128
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom128v.h>
(0006) #include <macros.h>
(0007) #include "lcd_init.h"
(0008) #include "eeprom_init.h"
(0009) #include "DS1302.h"
(0010) //iccavr
(0011) //extern unsigned char twi_write(unsigned char addr, unsigned char dd);
(0012) //extern unsigned char twi_read(unsigned char addr, unsigned char *dd);
(0013) /*延时函数*/
(0014) void delay_ms(unsigned char i) {
(0015) unsigned char a, b;
(0016) for (a = 1; a < i; a++)
02ED E041 LDI R20,1
02EE C006 RJMP 0x02F5
(0017) {
(0018) for (b = 1; b; b++)
02EF E061 LDI R22,1
02F0 C001 RJMP 0x02F2
02F1 9563 INC R22
02F2 2366 TST R22
02F3 F7E9 BNE 0x02F1
02F4 9543 INC R20
02F5 1740 CP R20,R16
02F6 F3C0 BCS 0x02EF
02F7 940E0361 CALL pop_gset2
02F9 9508 RET
_main:
temp --> Y+0
time_read --> R20
send_flag --> R22
i --> R10
02FA 9721 SBIW R28,1
(0019) {
(0020) ;
(0021) }
(0022) }
(0023) }
(0024) void main(void)
(0025) {
(0026)
(0027) unsigned char temp,i;
(0028) unsigned char send_flag=0,time_read=6;
02FB 2766 CLR R22
02FC E046 LDI R20,6
(0029) PORTA = 0xFF; /*打开上拉*/
02FD EF8F LDI R24,0xFF
02FE BB8B OUT 0x1B,R24
(0030) DDRA = 0x00; /*方向输入*/
02FF 2422 CLR R2
0300 BA2A OUT 0x1A,R2
(0031) PORTB = 0xF0; /*电平设置*/
0301 EF80 LDI R24,0xF0
0302 BB88 OUT 0x18,R24
(0032) DDRB = 0xFF; /*方向输出*/
0303 EF8F LDI R24,0xFF
0304 BB87 OUT 0x17,R24
(0033) PORTC = 0xFF;
0305 BB85 OUT 0x15,R24
(0034) DDRC = 0x00;
0306 BA24 OUT 0x14,R2
(0035) PORTD = 0xFF;
0307 BB82 OUT 0x12,R24
(0036) DDRD = 0x00;
0308 BA21 OUT 0x11,R2
(0037) ds1302_init();//ds1302初始化
0309 DFDC RCALL _ds1302_init
(0038) ds1302_write_time();
030A DF92 RCALL _ds1302_write_time
(0039) disp_init();
030B DE33 RCALL _disp_init
(0040) for (i=0;i<20;i++) //写入20个数据
030C 24AA CLR R10
030D C008 RJMP 0x0316
(0041) {
(0042) twi_write((0x100+i),i);
030E 2D2A MOV R18,R10
030F 2D0A MOV R16,R10
0310 5000 SUBI R16,0
0311 DE69 RCALL _twi_write
(0043) delay(0xfff);
0312 EF0F LDI R16,0xFF
0313 E01F LDI R17,0xF
0314 DD68 RCALL _delay
0315 94A3 INC R10
0316 2D8A MOV R24,R10
0317 3184 CPI R24,0x14
0318 F3A8 BCS 0x030E
(0044) }
(0045)
(0046) //twi_read(0x08, &temp);
(0047) //PORTB = ~temp;
(0048) //temp ++;
(0049) //temp=0;
(0050) //twi_write(0x08, temp);
(0051)
(0052)
(0053) delay(0xffff);
0319 EF0F LDI R16,0xFF
031A EF1F LDI R17,0xFF
031B DD61 RCALL _delay
(0054) disp_word(0x80,"任务:EEPROM");
031C E12F LDI R18,0x1F
031D E031 LDI R19,1
031E E800 LDI R16,0x80
031F DDCB RCALL _disp_word
(0055) disp_word(0x90,"2008年10月09日");
0320 E120 LDI R18,0x10
0321 E031 LDI R19,1
0322 E900 LDI R16,0x90
0323 DDC7 RCALL _disp_word
(0056) disp_word(0x88,"AT24C16");
0324 E028 LDI R18,0x8
0325 E031 LDI R19,1
0326 E808 LDI R16,0x88
0327 DDC3 RCALL _disp_word
(0057) i=0;
0328 24AA CLR R10
0329 C01C RJMP 0x0346
(0058)
(0059) while (1)
(0060) {
(0061) ds1302_read_time();
032A DF9C RCALL _ds1302_read_time
(0062) disp_number16(0x8d,time_buf[6]);
032B 91200106 LDS R18,0x106
032D E80D LDI R16,0x8D
032E DDF0 RCALL _disp_number16
(0063) if(time_buf[6]==0)
032F 90200106 LDS R2,0x106
0331 2022 TST R2
0332 F431 BNE 0x0339
(0064) {
(0065) send_flag=1;
0333 E061 LDI R22,1
(0066) if(time_buf[5]==time_read)
0334 90200105 LDS R2,0x105
0336 1624 CP R2,R20
0337 F409 BNE 0x0339
(0067) send_flag=0;
0338 2766 CLR R22
(0068) }
(0069) if(send_flag==1)
0339 3061 CPI R22,1
033A F459 BNE 0x0346
(0070) {
(0071) twi_read((0x100+i),&temp);
033B 019E MOVW R18,R28
033C 2D0A MOV R16,R10
033D 5000 SUBI R16,0
033E DE95 RCALL _twi_read
(0072) i++;
033F 94A3 INC R10
(0073) send_flag=0;
0340 2766 CLR R22
(0074) time_read=time_buf[5];
0341 91400105 LDS R20,0x105
(0075) disp_number10(0x98,temp);
FILE: <library>
0343 8128 LDD R18,Y+0
0344 E908 LDI R16,0x98
0345 DDB8 RCALL _disp_number10
0346 CFE3 RJMP 0x032A
0347 9621 ADIW R28,1
0348 9508 RET
mod8u:
0349 9468 BSET 6
034A C001 RJMP xdiv8u
div8u:
034B 94E8 BCLR 6
xdiv8u:
034C 932A ST R18,-Y
034D 92FA ST R15,-Y
034E 92EA ST R14,-Y
034F 24FF CLR R15
0350 24EE CLR R14
0351 E120 LDI R18,0x10
0352 0F00 LSL R16
0353 1CFF ROL R15
0354 1CEE ROL R14
0355 16E1 CP R14,R17
0356 F010 BCS 0x0359
0357 1AE1 SUB R14,R17
0358 9503 INC R16
0359 952A DEC R18
035A F7B9 BNE 0x0352
035B F40E BRTC 0x035D
035C 2D0E MOV R16,R14
035D 90E9 LD R14,Y+
035E 90F9 LD R15,Y+
035F 9129 LD R18,Y+
0360 9508 RET
pop_gset2:
0361 E0E2 LDI R30,2
0362 940C0373 JMP pop
pop_gset3:
0364 E0E4 LDI R30,4
0365 940C0373 JMP pop
push_gset5:
0367 92FA ST R15,-Y
0368 92EA ST R14,-Y
push_gset4:
0369 92DA ST R13,-Y
036A 92CA ST R12,-Y
push_gset3:
036B 92BA ST R11,-Y
036C 92AA ST R10,-Y
push_gset2:
036D 937A ST R23,-Y
036E 936A ST R22,-Y
push_gset1:
036F 935A ST R21,-Y
0370 934A ST R20,-Y
0371 9508 RET
pop_gset1:
0372 E0E1 LDI R30,1
pop:
0373 9149 LD R20,Y+
0374 9159 LD R21,Y+
0375 FDE0 SBRC R30,0
0376 9508 RET
0377 9169 LD R22,Y+
0378 9179 LD R23,Y+
0379 FDE1 SBRC R30,1
037A 9508 RET
037B 90A9 LD R10,Y+
037C 90B9 LD R11,Y+
037D FDE2 SBRC R30,2
037E 9508 RET
037F 90C9 LD R12,Y+
0380 90D9 LD R13,Y+
0381 FDE3 SBRC R30,3
0382 9508 RET
0383 90E9 LD R14,Y+
0384 90F9 LD R15,Y+
0385 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -