📄 pcf8563_test.s
字号:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r dat 20 pc
.dbend
.dbfunc e start_timer _start_timer fc
.even
_start_timer::
.dbline -1
.dbline 92
; }
;
; /**********************************
; * 启动时钟函数 *
; **********************************/
; unsigned char start_timer(void)
; {
.dbline 93
; start(); //启动总线
ldi R24,164
out 0x36,R24
.dbline 94
; waitack(); //等待启动完成
L92:
.dbline 94
L93:
.dbline 94
in R2,0x36
sbrs R2,7
rjmp L92
X21:
.dbline 94
.dbline 94
.dbline 95
; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
in R24,0x1
andi R24,248
cpi R24,8
breq L95
X22:
.dbline 95
clr R16
xjmp L91
L95:
.dbline 96
; write_tim(PCF8563_SLA_W); //发送写地址
ldi R16,162
xcall _write_tim
.dbline 97
; write_tim(0x00); //写数据首地址
clr R16
xcall _write_tim
.dbline 98
; write_tim(0x00); //写控制/状态寄存器1,暂停计时
clr R16
xcall _write_tim
.dbline 99
; stop();
ldi R24,148
out 0x36,R24
.dbline 100
; return I2C_CRR;
ldi R16,1
.dbline -2
L91:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer_lcd _timer_lcd fV
.even
_timer_lcd::
.dbline -1
.dbline 107
; }
;
; /**********************************
; * 将时钟数据转换后在LCD上显示 *
; **********************************/
; void timer_lcd(void)
; {
.dbline 108
; LCD_set_xy(4,0); //写指令:第1行第4列地址
clr R18
ldi R16,4
xcall _LCD_set_xy
.dbline 110
;
; LCD_write_char(0,(timer[7]>>4)+0x30);
lds R18,_timer+7
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 111
; LCD_write_char(0,(timer[7]&0x0f)+0x30);
lds R18,_timer+7
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 112
; LCD_write_char(0,(timer[6]>>4)+0x30); //显示年
lds R18,_timer+6
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 113
; LCD_write_char(0,(timer[6]&0x0f)+0x30);
lds R18,_timer+6
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 114
; LCD_write_char(0,'/');
ldi R18,47
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 115
; LCD_write_char(0,(timer[5]>>4)+0x30); //显示月
lds R18,_timer+5
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 116
; LCD_write_char(0,(timer[5]&0x0f)+0x30);
lds R18,_timer+5
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 117
; LCD_write_char(0,'/');
ldi R18,47
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 118
; LCD_write_char(0,(timer[3]>>4)+0x30); //显示日
lds R18,_timer+3
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 119
; LCD_write_char(0,(timer[3]&0x0f)+0x30);
lds R18,_timer+3
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 121
;
; LCD_set_xy(2,1); //写指令:第2行地址
ldi R18,1
ldi R16,2
xcall _LCD_set_xy
.dbline 123
;
; LCD_write_char(0,(timer[2]>>4)+0x30); //时
lds R18,_timer+2
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 124
; LCD_write_char(0,(timer[2]&0x0f)+0x30);
lds R18,_timer+2
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 125
; LCD_write_char(0,':');
ldi R18,58
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 126
; LCD_write_char(0,(timer[1]>>4)+0x30); //分
lds R18,_timer+1
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 127
; LCD_write_char(0,(timer[1]&0x0f)+0x30);
lds R18,_timer+1
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 128
; LCD_write_char(0,':');
ldi R18,58
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 129
; LCD_write_char(0,(timer[0]>>4)+0x30); //秒
lds R18,_timer
clr R19
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
asr R19
ror R18
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 130
; LCD_write_char(0,(timer[0]&0x0f)+0x30);
lds R18,_timer
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline 131
; LCD_write_char(0,' ');
ldi R18,32
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 132
; LCD_write_char(0,'W'); LCD_write_char(0,'e'); //星期的前导字
ldi R18,87
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 132
ldi R18,101
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 133
; LCD_write_char(0,'e'); LCD_write_char(0,'k');
ldi R18,101
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 133
ldi R18,107
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
.dbline 134
; LCD_write_char(0,(timer[4]&0x0f)+0x30); //星期数据
lds R18,_timer+4
clr R19
andi R18,15
andi R19,0
subi R18,208 ; offset = 48
sbci R19,255
clr R16
clr R17
xcall _LCD_write_char
.dbline -2
L97:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 139
; }
;
; //定时器1:每秒从8563中读取4次数据,更新显示
; void timer1_init(void) //定时器1初始化:250毫秒定时,预分频256
; {
.dbline 140
; TCCR1B=0x00; //停止定时器
clr R2
out 0x2e,R2
.dbline 141
; TCNT1H=0x8F; //初值高字节
ldi R24,143
out 0x2d,R24
.dbline 142
; TCNT1L=0x81; //定时初值低字节
ldi R24,129
out 0x2c,R24
.dbline 143
; TCCR1A=0x00;
out 0x2f,R2
.dbline 144
; TCCR1B=0x03; //启动定时器
ldi R24,3
out 0x2e,R24
.dbline -2
L111:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 32
jmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563.h
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
.dbline -1
.dbline 149
; }
;
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void) //定时器1中断入口:250MS中断一次
; {
.dbline 150
; TCNT1H = 0x8F; //重装初值
ldi R24,143
out 0x2d,R24
.dbline 151
; TCNT1L = 0x81;
ldi R24,129
out 0x2c,R24
.dbline 152
; read_timer(); //读出当前时钟
xcall _read_timer
.dbline 153
; timer_lcd(); //显示数据转换
xcall _timer_lcd
.dbline -2
L112:
.dbline 0 ; func end
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbend
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563_test.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 18
; //ICC-AVR application builder : 2008-11-10 11:10:06
; // Target : M16
; // Crystal: 8.0000Mhz
;
; #include <iom16v.h>
; #include <macros.h>
;
;
; #include "delay.h"
; #include "twi.h"
; #include "lcd1602.h"
; #include "pcf8563.h"
;
; /**********************************
; * 端口设置函数 *
; **********************************/
; void port_init(void)
; {
.dbline 19
; DDRC=0x00;
clr R2
out 0x14,R2
.dbline 20
; PORTC=0xFF;
ldi R24,255
out 0x15,R24
.dbline -2
L113:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 25
; }
;
;
; void main(void)
; {
.dbline 26
; port_init();
xcall _port_init
.dbline 27
; LCD_init();
xcall _LCD_init
.dbline 28
; delay_ms(50);
ldi R16,50
ldi R17,0
xcall _delay_ms
.dbline 29
; Twi_Init();
xcall _Twi_Init
.dbline 30
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 31
; CLI();
cli
.dbline 32
; timer1_init(); //定时器1初始化
xcall _timer1_init
.dbline 33
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 34
; GICR = 0x00;
out 0x3b,R2
.dbline 35
; TIMSK = 0x04; //开放定时器1中断和比较中断
ldi R24,4
out 0x39,R24
.dbline 36
; SEI(); //开总中断
sei
L115:
.dbline 38
; while(1)
; {
.dbline 39
; }
L116:
.dbline 37
xjmp L115
X23:
.dbline -2
L114:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563_test.c
_timer::
.blkb 8
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563.h
.dbsym e timer _timer A[8:8]c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -