📄 pcf8563_test.s
字号:
.dbline 115
; LCD_write_char(0,' ');
ldi R18,32
ldi R19,0
clr R16
clr R17
xcall _LCD_write_char
L30:
.dbline 114
inc R20
L32:
.dbline 114
cpi R20,16
brlo L29
X6:
.dbline -2
L24:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r i 20 c
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; s -> R20,R21
; Y -> R12
; X -> R10
.even
_LCD_write_string::
xcall push_xgset303C
mov R12,R18
mov R10,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 123
; }
; /*-------------------------------------------------------------
; 函数: 写字符串
; 参数:列---X=0~15,行---Y=0~1 写地址
; s为所要写的字符串
; ---------------------------------------------------------------*/
; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
; {
.dbline 124
; LCD_set_xy(X,Y);
mov R18,R12
mov R16,R10
xcall _LCD_set_xy
xjmp L35
L34:
.dbline 126
; while(*s)
; {
.dbline 127
; LCD_write_char(0,*s);
movw R30,R20
ldd R18,z+0
clr R19
clr R16
clr R17
xcall _LCD_write_char
.dbline 128
; s++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 129
; }
L35:
.dbline 125
movw R30,R20
ldd R2,z+0
tst R2
brne L34
X7:
.dbline -2
L33:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r s 20 pc
.dbsym r Y 12 c
.dbsym r X 10 c
.dbend
.dbfunc e LCD_write_data _LCD_write_data fV
; data -> y+0
; i -> R20
; dat -> R14,R15
; Y -> R12
; X -> R10
.even
_LCD_write_data::
xcall push_xgset30FC
mov R12,R18
mov R10,R16
sbiw R28,4
ldd R14,y+12
ldd R15,y+13
.dbline -1
.dbline 138
; }
;
; /*-------------------------------------------------------------
; 函数: 写数字
; 参数:列---X=0~15,行---Y=0~1 写地址
; dat为所要写的数字
; ---------------------------------------------------------------*/
; void LCD_write_data(unsigned char X,unsigned char Y,int dat)
; {
.dbline 151
; //unsigned char fuhao;
; unsigned char data[4];
; unsigned char i;
;
; /*if(dat<0)
; {
; fuhao='-';
; dat=0-dat;
; }
; else
; fuhao=' ';
; data[0]=fuhao;*/
; data[0]=dat/1000+0x30; dat%=1000;
ldi R18,1000
ldi R19,3
movw R16,R14
xcall div16s
movw R24,R16
adiw R24,48
std y+0,R24
.dbline 151
ldi R18,1000
ldi R19,3
movw R16,R14
xcall mod16s
movw R14,R16
.dbline 152
; data[1]=dat/100+0x30; dat%=100;
ldi R18,100
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
std y+1,R24
.dbline 152
ldi R18,100
ldi R19,0
movw R16,R14
xcall mod16s
movw R14,R16
.dbline 153
; data[2]=dat/10+0x30;
ldi R18,10
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
std y+2,R24
.dbline 154
; data[3]=dat%10+0x30;
ldi R18,10
ldi R19,0
movw R16,R14
xcall mod16s
movw R24,R16
adiw R24,48
std y+3,R24
.dbline 156
;
; LCD_set_xy(X,Y);
mov R18,R12
mov R16,R10
xcall _LCD_set_xy
.dbline 157
; for(i=0;i<4;i++)
clr R20
xjmp L44
L41:
.dbline 158
; LCD_write_char(0,data[i]);
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
clr R19
clr R16
clr R17
xcall _LCD_write_char
L42:
.dbline 157
inc R20
L44:
.dbline 157
cpi R20,4
brlo L41
X8:
.dbline -2
L37:
.dbline 0 ; func end
adiw R28,4
xjmp pop_xgset30FC
.dbsym l data 0 A[4:4]c
.dbsym r i 20 c
.dbsym r dat 14 I
.dbsym r Y 12 c
.dbsym r X 10 c
.dbend
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\pcf8563\pcf8563.h
.dbfunc e write_tim _write_tim fc
; a -> R16
.even
_write_tim::
.dbline -1
.dbline 15
; /*******************************************
; * PCF8563的I2C(TWI)操作函数 *
; * 文 件 名:pcf8563.h *
; * 函数功能:利用CPU的硬件TWI接口操作 *
; * 设 计:张子凤 *
; * 修改日期:2008年11月11日 *
; * 版 本:V1.0 *
; * 主控芯片:Mega16 *
; *******************************************/
; //全局变量定义
; unsigned char timer[8]; //时钟数据
;
; //写入时间函数
; unsigned char write_tim(unsigned char a)
; {
.dbline 16
; sendbyte(a); //发送
.dbline 16
out 0x3,R16
.dbline 16
ldi R24,132
out 0x36,R24
.dbline 16
.dbline 16
.dbline 17
; waitack(); //等待写完成
L46:
.dbline 17
L47:
.dbline 17
in R2,0x36
sbrs R2,7
rjmp L46
X9:
.dbline 17
.dbline 17
.dbline 18
; if(chkack()!=MT_SLA_ACK)return I2C_ERR; //检查是否正确写入
in R24,0x1
andi R24,248
cpi R24,24
breq L49
X10:
.dbline 18
clr R16
xjmp L45
L49:
.dbline 19
; else return I2C_CRR;
ldi R16,1
.dbline -2
L45:
.dbline 0 ; func end
ret
.dbsym r a 16 c
.dbend
.dbfunc e read_tim _read_tim fc
.even
_read_tim::
.dbline -1
.dbline 24
; }
;
; //读出时间函数
; unsigned char read_tim(void)
; {
.dbline 25
; rcvackbyte(); //接收一字节并返回应答
ldi R24,196
out 0x36,R24
.dbline 26
; waitack(); //等待接收完成
L52:
.dbline 26
L53:
.dbline 26
in R2,0x36
sbrs R2,7
rjmp L52
X11:
.dbline 26
.dbline 26
.dbline 27
; if(chkack()!=MR_DATA_ACK)return I2C_ERR; //检查是否接收成功
in R24,0x1
andi R24,248
cpi R24,80
breq L55
X12:
.dbline 27
clr R16
xjmp L51
L55:
.dbline 29
; else
; return(TWDR); //读出时钟数据
in R16,0x3
.dbline -2
L51:
.dbline 0 ; func end
ret
.dbend
.dbfunc e read_timer _read_timer fc
.even
_read_timer::
st -y,R10
st -y,R20
.dbline -1
.dbline 36
; }
;
; /**********************************
; * 读出数据函数 *
; **********************************/
; unsigned char read_timer(void)
; {
.dbline 37
; start(); //启动总线
ldi R24,164
out 0x36,R24
.dbline 38
; waitack(); //等待启动完成
L58:
.dbline 38
L59:
.dbline 38
in R2,0x36
sbrs R2,7
rjmp L58
X13:
.dbline 38
.dbline 38
.dbline 39
; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
in R24,0x1
andi R24,248
cpi R24,8
breq L61
X14:
.dbline 39
clr R16
xjmp L57
L61:
.dbline 40
; write_tim(PCF8563_SLA_W); //发送写地址
ldi R16,162
xcall _write_tim
.dbline 41
; write_tim(0x02); //写数据地址
ldi R16,2
xcall _write_tim
.dbline 43
;
; start();
ldi R24,164
out 0x36,R24
.dbline 44
; waitack(); //等待启动完成
L63:
.dbline 44
L64:
.dbline 44
in R2,0x36
sbrs R2,7
rjmp L63
X15:
.dbline 44
.dbline 44
.dbline 45
; if(chkack()!=RESTART)return I2C_ERR; //检查是否启动成功
in R24,0x1
andi R24,248
cpi R24,16
breq L66
X16:
.dbline 45
clr R16
xjmp L57
L66:
.dbline 46
; write_tim(PCF8563_SLA_R); //发送读地址
ldi R16,163
xcall _write_tim
.dbline 48
;
; timer[0]=read_tim()&0x7F; //读出秒数据
xcall _read_tim
mov R24,R16
andi R24,127
sts _timer,R24
.dbline 49
; timer[1]=read_tim()&0x7F; //读出分数据
xcall _read_tim
mov R24,R16
andi R24,127
sts _timer+1,R24
.dbline 50
; timer[2]=read_tim()&0x3F; //读出时数据
xcall _read_tim
mov R20,R16
mov R24,R20
andi R24,63
sts _timer+2,R24
.dbline 51
; timer[3]=read_tim()&0x3F; //读出日数据
xcall _read_tim
mov R20,R16
mov R24,R20
andi R24,63
sts _timer+3,R24
.dbline 52
; timer[4]=read_tim()&0x07; //读出周数据
xcall _read_tim
mov R20,R16
mov R24,R20
andi R24,7
sts _timer+4,R24
.dbline 53
; if(timer[4]==0)timer[4]=7;
tst R24
brne L72
X17:
.dbline 53
ldi R24,7
sts _timer+4,R24
L72:
.dbline 54
; timer[5]=read_tim(); //读出月数据
xcall _read_tim
mov R10,R16
sts _timer+5,R10
.dbline 55
; if((timer[5]&0x80)==0)
sbrc R16,7
rjmp L77
X18:
.dbline 56
; timer[7]=0x20; //世纪位为0,是21世纪
ldi R24,32
sts _timer+7,R24
xjmp L78
L77:
.dbline 58
; else
; timer[7]=0x19; //世纪位不为0,是20世纪
ldi R24,25
sts _timer+7,R24
L78:
.dbline 59
; timer[5]=timer[5]&0x1F;
lds R24,_timer+5
andi R24,31
sts _timer+5,R24
.dbline 60
; timer[6]=read_tim(); //读出年数据
xcall _read_tim
mov R10,R16
sts _timer+6,R10
.dbline 61
; stop();
ldi R24,148
out 0x36,R24
.dbline 62
; return I2C_CRR;
ldi R16,1
.dbline -2
L57:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbend
.dbfunc e write_timer _write_timer fc
; dat -> R20,R21
.even
_write_timer::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 69
; }
;
; /**********************************
; * 写入时钟函数 *
; **********************************/
; unsigned char write_timer(unsigned char *dat)
; {
.dbline 70
; start(); //启动总线
ldi R24,164
out 0x36,R24
.dbline 71
; waitack(); //等待启动完成
L86:
.dbline 71
L87:
.dbline 71
in R2,0x36
sbrs R2,7
rjmp L86
X19:
.dbline 71
.dbline 71
.dbline 72
; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
in R24,0x1
andi R24,248
cpi R24,8
breq L89
X20:
.dbline 72
clr R16
xjmp L85
L89:
.dbline 73
; write_tim(PCF8563_SLA_W); //发送写地址
ldi R16,162
xcall _write_tim
.dbline 74
; write_tim(0x00); //写数据首地址
clr R16
xcall _write_tim
.dbline 75
; write_tim(0x20); //写控制/状态寄存器1,暂停计时
ldi R16,32
xcall _write_tim
.dbline 76
; write_tim(0x00); //写控制/状态寄存器2
clr R16
xcall _write_tim
.dbline 77
; write_tim(dat[0]); //写秒数据0
movw R30,R20
ldd R16,z+0
xcall _write_tim
.dbline 78
; write_tim(dat[1]); //写分数据
movw R30,R20
ldd R16,z+1
xcall _write_tim
.dbline 79
; write_tim(dat[2]); //写时数据
movw R30,R20
ldd R16,z+2
xcall _write_tim
.dbline 80
; write_tim(dat[3]); //写日数据
movw R30,R20
ldd R16,z+3
xcall _write_tim
.dbline 81
; write_tim(dat[4]); //写周数据
movw R30,R20
ldd R16,z+4
xcall _write_tim
.dbline 82
; write_tim(dat[5]); //写月数据
movw R30,R20
ldd R16,z+5
xcall _write_tim
.dbline 83
; write_tim(dat[6]); //写年数据
movw R30,R20
ldd R16,z+6
xcall _write_tim
.dbline 84
; stop();
ldi R24,148
out 0x36,R24
.dbline 85
; return I2C_CRR;
ldi R16,1
.dbline -2
L85:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -