📄 pcf8563_test.lis
字号:
02C0 ; waitack(); //等待启动完成
02C0 L63:
02C0 .dbline 44
02C0 L64:
02C0 .dbline 44
02C0 26B6 in R2,0x36
02C2 27FE sbrs R2,7
02C4 FDCF rjmp L63
02C6 X15:
02C6 .dbline 44
02C6 .dbline 44
02C6 .dbline 45
02C6 ; if(chkack()!=RESTART)return I2C_ERR; //检查是否启动成功
02C6 81B1 in R24,0x1
02C8 887F andi R24,248
02CA 8031 cpi R24,16
02CC 11F0 breq L66
02CE X16:
02CE .dbline 45
02CE 0027 clr R16
02D0 3CC0 xjmp L57
02D2 L66:
02D2 .dbline 46
02D2 ; write_tim(PCF8563_SLA_R); //发送读地址
02D2 03EA ldi R16,163
02D4 C7DF xcall _write_tim
02D6 .dbline 48
02D6 ;
02D6 ; timer[0]=read_tim()&0x7F; //读出秒数据
02D6 D4DF xcall _read_tim
02D8 802F mov R24,R16
02DA 8F77 andi R24,127
02DC 80930000 sts _timer,R24
02E0 .dbline 49
02E0 ; timer[1]=read_tim()&0x7F; //读出分数据
02E0 CFDF xcall _read_tim
02E2 802F mov R24,R16
02E4 8F77 andi R24,127
02E6 80930100 sts _timer+1,R24
02EA .dbline 50
02EA ; timer[2]=read_tim()&0x3F; //读出时数据
02EA CADF xcall _read_tim
02EC 402F mov R20,R16
02EE 842F mov R24,R20
02F0 8F73 andi R24,63
02F2 80930200 sts _timer+2,R24
02F6 .dbline 51
02F6 ; timer[3]=read_tim()&0x3F; //读出日数据
02F6 C4DF xcall _read_tim
02F8 402F mov R20,R16
02FA 842F mov R24,R20
02FC 8F73 andi R24,63
02FE 80930300 sts _timer+3,R24
0302 .dbline 52
0302 ; timer[4]=read_tim()&0x07; //读出周数据
0302 BEDF xcall _read_tim
0304 402F mov R20,R16
0306 842F mov R24,R20
0308 8770 andi R24,7
030A 80930400 sts _timer+4,R24
030E .dbline 53
030E ; if(timer[4]==0)timer[4]=7;
030E 8823 tst R24
0310 19F4 brne L72
0312 X17:
0312 .dbline 53
0312 87E0 ldi R24,7
0314 80930400 sts _timer+4,R24
0318 L72:
0318 .dbline 54
0318 ; timer[5]=read_tim(); //读出月数据
0318 B3DF xcall _read_tim
031A A02E mov R10,R16
031C A0920500 sts _timer+5,R10
0320 .dbline 55
0320 ; if((timer[5]&0x80)==0)
0320 07FD sbrc R16,7
0322 04C0 rjmp L77
0324 X18:
0324 .dbline 56
0324 ; timer[7]=0x20; //世纪位为0,是21世纪
0324 80E2 ldi R24,32
0326 80930700 sts _timer+7,R24
032A 03C0 xjmp L78
032C L77:
032C .dbline 58
032C ; else
032C ; timer[7]=0x19; //世纪位不为0,是20世纪
032C 89E1 ldi R24,25
032E 80930700 sts _timer+7,R24
0332 L78:
0332 .dbline 59
0332 ; timer[5]=timer[5]&0x1F;
0332 80910500 lds R24,_timer+5
0336 8F71 andi R24,31
0338 80930500 sts _timer+5,R24
033C .dbline 60
033C ; timer[6]=read_tim(); //读出年数据
033C A1DF xcall _read_tim
033E A02E mov R10,R16
0340 A0920600 sts _timer+6,R10
0344 .dbline 61
0344 ; stop();
0344 84E9 ldi R24,148
0346 86BF out 0x36,R24
0348 .dbline 62
0348 ; return I2C_CRR;
0348 01E0 ldi R16,1
034A .dbline -2
034A L57:
034A .dbline 0 ; func end
034A 4991 ld R20,y+
034C A990 ld R10,y+
034E 0895 ret
0350 .dbend
0350 .dbfunc e write_timer _write_timer fc
0350 ; dat -> R20,R21
.even
0350 _write_timer::
0350 4A93 st -y,R20
0352 5A93 st -y,R21
0354 A801 movw R20,R16
0356 .dbline -1
0356 .dbline 69
0356 ; }
0356 ;
0356 ; /**********************************
0356 ; * 写入时钟函数 *
0356 ; **********************************/
0356 ; unsigned char write_timer(unsigned char *dat)
0356 ; {
0356 .dbline 70
0356 ; start(); //启动总线
0356 84EA ldi R24,164
0358 86BF out 0x36,R24
035A .dbline 71
035A ; waitack(); //等待启动完成
035A L86:
035A .dbline 71
035A L87:
035A .dbline 71
035A 26B6 in R2,0x36
035C 27FE sbrs R2,7
035E FDCF rjmp L86
0360 X19:
0360 .dbline 71
0360 .dbline 71
0360 .dbline 72
0360 ; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
0360 81B1 in R24,0x1
0362 887F andi R24,248
0364 8830 cpi R24,8
0366 11F0 breq L89
0368 X20:
0368 .dbline 72
0368 0027 clr R16
036A 20C0 xjmp L85
036C L89:
036C .dbline 73
036C ; write_tim(PCF8563_SLA_W); //发送写地址
036C 02EA ldi R16,162
036E 7ADF xcall _write_tim
0370 .dbline 74
0370 ; write_tim(0x00); //写数据首地址
0370 0027 clr R16
0372 78DF xcall _write_tim
0374 .dbline 75
0374 ; write_tim(0x20); //写控制/状态寄存器1,暂停计时
0374 00E2 ldi R16,32
0376 76DF xcall _write_tim
0378 .dbline 76
0378 ; write_tim(0x00); //写控制/状态寄存器2
0378 0027 clr R16
037A 74DF xcall _write_tim
037C .dbline 77
037C ; write_tim(dat[0]); //写秒数据0
037C FA01 movw R30,R20
037E 0081 ldd R16,z+0
0380 71DF xcall _write_tim
0382 .dbline 78
0382 ; write_tim(dat[1]); //写分数据
0382 FA01 movw R30,R20
0384 0181 ldd R16,z+1
0386 6EDF xcall _write_tim
0388 .dbline 79
0388 ; write_tim(dat[2]); //写时数据
0388 FA01 movw R30,R20
038A 0281 ldd R16,z+2
038C 6BDF xcall _write_tim
038E .dbline 80
038E ; write_tim(dat[3]); //写日数据
038E FA01 movw R30,R20
0390 0381 ldd R16,z+3
0392 68DF xcall _write_tim
0394 .dbline 81
0394 ; write_tim(dat[4]); //写周数据
0394 FA01 movw R30,R20
0396 0481 ldd R16,z+4
0398 65DF xcall _write_tim
039A .dbline 82
039A ; write_tim(dat[5]); //写月数据
039A FA01 movw R30,R20
039C 0581 ldd R16,z+5
039E 62DF xcall _write_tim
03A0 .dbline 83
03A0 ; write_tim(dat[6]); //写年数据
03A0 FA01 movw R30,R20
03A2 0681 ldd R16,z+6
03A4 5FDF xcall _write_tim
03A6 .dbline 84
03A6 ; stop();
03A6 84E9 ldi R24,148
03A8 86BF out 0x36,R24
03AA .dbline 85
03AA ; return I2C_CRR;
03AA 01E0 ldi R16,1
03AC .dbline -2
03AC L85:
03AC .dbline 0 ; func end
03AC 5991 ld R21,y+
03AE 4991 ld R20,y+
03B0 0895 ret
03B2 .dbsym r dat 20 pc
03B2 .dbend
03B2 .dbfunc e start_timer _start_timer fc
.even
03B2 _start_timer::
03B2 .dbline -1
03B2 .dbline 92
03B2 ; }
03B2 ;
03B2 ; /**********************************
03B2 ; * 启动时钟函数 *
03B2 ; **********************************/
03B2 ; unsigned char start_timer(void)
03B2 ; {
03B2 .dbline 93
03B2 ; start(); //启动总线
03B2 84EA ldi R24,164
03B4 86BF out 0x36,R24
03B6 .dbline 94
03B6 ; waitack(); //等待启动完成
03B6 L92:
03B6 .dbline 94
03B6 L93:
03B6 .dbline 94
03B6 26B6 in R2,0x36
03B8 27FE sbrs R2,7
03BA FDCF rjmp L92
03BC X21:
03BC .dbline 94
03BC .dbline 94
03BC .dbline 95
03BC ; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
03BC 81B1 in R24,0x1
03BE 887F andi R24,248
03C0 8830 cpi R24,8
03C2 11F0 breq L95
03C4 X22:
03C4 .dbline 95
03C4 0027 clr R16
03C6 09C0 xjmp L91
03C8 L95:
03C8 .dbline 96
03C8 ; write_tim(PCF8563_SLA_W); //发送写地址
03C8 02EA ldi R16,162
03CA 4CDF xcall _write_tim
03CC .dbline 97
03CC ; write_tim(0x00); //写数据首地址
03CC 0027 clr R16
03CE 4ADF xcall _write_tim
03D0 .dbline 98
03D0 ; write_tim(0x00); //写控制/状态寄存器1,暂停计时
03D0 0027 clr R16
03D2 48DF xcall _write_tim
03D4 .dbline 99
03D4 ; stop();
03D4 84E9 ldi R24,148
03D6 86BF out 0x36,R24
03D8 .dbline 100
03D8 ; return I2C_CRR;
03D8 01E0 ldi R16,1
03DA .dbline -2
03DA L91:
03DA .dbline 0 ; func end
03DA 0895 ret
03DC .dbend
03DC .dbfunc e timer_lcd _timer_lcd fV
.even
03DC _timer_lcd::
03DC .dbline -1
03DC .dbline 107
03DC ; }
03DC ;
03DC ; /**********************************
03DC ; * 将时钟数据转换后在LCD上显示 *
03DC ; **********************************/
03DC ; void timer_lcd(void)
03DC ; {
03DC .dbline 108
03DC ; LCD_set_xy(4,0); //写指令:第1行第4列地址
03DC 2227 clr R18
03DE 04E0 ldi R16,4
03E0 5DDE xcall _LCD_set_xy
03E2 .dbline 110
03E2 ;
03E2 ; LCD_write_char(0,(timer[7]>>4)+0x30);
03E2 20910700 lds R18,_timer+7
03E6 3327 clr R19
03E8 3595 asr R19
03EA 2795 ror R18
03EC 3595 asr R19
03EE 2795 ror R18
03F0 3595 asr R19
03F2 2795 ror R18
03F4 3595 asr R19
03F6 2795 ror R18
03F8 205D subi R18,208 ; offset = 48
03FA 3F4F sbci R19,255
03FC 0027 clr R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -