📄 1602_8563.s
字号:
.module _1602_8563.c
.area text(rom, con, rel)
.dbfile D:\PCF8563\1602_time\timer_io.h
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 28
; /*************************************
; * PCF8563时钟程序 *
; * 文 件 名:1602_8563.c *
; * 建立日期:2007年07月04日 *
; * 设 计:铜河 *
; * 修改日期:2007年07月08日 *
; * 版 本:V22.02 *
; * 主控芯片:Mega16L *
; * 工作频率:7.3728MHz *
; *************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include <stdio.h>
; #include <D:\PCF8563\1602_time\timer_io.h>
; #include <D:\PCF8563\1602_time\delay.h>
; #include <D:\PCF8563\1602_time\lcd1602_4h.h>
; #include <D:\PCF8563\1602_time\TWI_8563.h>
;
; //数据简化宏定义
; #define uchar unsigned char
; #define uint unsigned int
;
; //全局变量定义
; uchar timer[8]; //时钟数据
;
; /**********************************
; * 蜂鸣器发声函数 *
; * 函数功能:蜂鸣器发出声响 *
.dbline 29
; * 入 口:n 声次数 *
ldi R24,255
out 0x1a,R24
.dbline 30
; * i 声时长,i*10ms *
clr R2
out 0x1b,R2
.dbline 31
; * 返 回:无 *
ldi R24,8
out 0x17,R24
.dbline 32
; * 发声频率:固定1KHz 无源 *
out 0x18,R2
.dbline 33
; **********************************/
out 0x14,R2
.dbline 34
; void spk(uchar i,uchar n)
ldi R24,255
out 0x15,R24
.dbline 35
; {
ldi R24,240
out 0x11,R24
.dbline 36
; uint a;
ldi R24,15
out 0x12,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfile D:\PCF8563\1602_time\delay.h
.dbfunc e delay_us _delay_us fV
; i -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 15
xjmp L4
L3:
.dbline 17
.dbline 18
subi R16,1
sbci R17,0
.dbline 19
nop
.dbline 20
nop
.dbline 21
nop
.dbline 22
L4:
.dbline 16
cpi R16,0
cpc R16,R17
brne L3
X0:
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; a -> R20,R21
; i -> R16,R17
.even
_delay_ms::
xcall push_gset1
.dbline -1
.dbline 32
.dbline 34
xjmp L10
L7:
.dbline 35
.dbline 36
ldi R20,1143
ldi R21,4
xjmp L14
L11:
.dbline 37
.dbline 37
.dbline 37
L12:
.dbline 36
subi R20,1
sbci R21,0
L14:
.dbline 36
cpi R20,0
cpc R20,R21
brne L11
X1:
.dbline 38
L8:
.dbline 34
subi R16,1
sbci R17,0
L10:
.dbline 34
cpi R16,0
cpc R16,R17
brne L7
X2:
.dbline -2
L6:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r a 20 i
.dbsym r i 16 i
.dbend
.dbfile D:\PCF8563\1602_time\lcd1602_4h.h
.dbfunc e lcd_da _lcd_da fV
; a -> R20
; data -> R22
.even
_lcd_da::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 33
.dbline 35
sbi 0x1b,2
.dbline 36
sbi 0x1b,3
.dbline 37
; for(;n;n--)
mov R20,R22
ori R20,15
.dbline 38
; {
in R24,0x1b
ori R24,240
and R24,R20
out 0x1b,R24
.dbline 39
; a=i*10; //计算每声响的长度:MS
ldi R16,50
ldi R17,0
xcall _delay_us
.dbline 40
; for(;a;a--)
cbi 0x1b,3
.dbline 41
; {
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 43
; delay_us(500); //响声频率为1KHZ
; SPK_TG;
sbi 0x1b,3
.dbline 44
; delay_us(500);
mov R20,R22
andi R20,#0x0F
swap R20
ori R20,15
.dbline 45
; SPK_TG;
in R24,0x1b
ori R24,240
and R24,R20
out 0x1b,R24
.dbline 46
; }
ldi R16,50
ldi R17,0
xcall _delay_us
.dbline 47
; SPK_OFF; //响完关闭蜂鸣器
cbi 0x1b,3
.dbline 48
; delay_ms(100); //每声响之间隔100MS
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline -2
L15:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r data 22 c
.dbend
.dbfunc e lcd_comm _lcd_comm fV
; a -> R20
; data -> R22
.even
_lcd_comm::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 53
; }
; }
;
; /**********************************
; * 读出数据函数 *
.dbline 55
; **********************************/
; uchar read_timer(void)
cbi 0x1b,2
.dbline 56
; {
sbi 0x1b,3
.dbline 57
; start(); //启动总线
mov R20,R22
ori R20,15
.dbline 58
; waitack(); //等待启动完成
in R24,0x1b
ori R24,240
and R24,R20
out 0x1b,R24
.dbline 59
; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
ldi R16,50
ldi R17,0
xcall _delay_us
.dbline 60
; write_tim(SLA_W); //发送写地址
cbi 0x1b,3
.dbline 61
; write_tim(0x02); //写数据地址
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 63
;
; start();
sbi 0x1b,3
.dbline 64
; waitack(); //等待启动完成
mov R20,R22
andi R20,#0x0F
swap R20
ori R20,15
.dbline 65
; if(chkack()!=RESTART)return I2C_ERR; //检查是否启动成功
in R24,0x1b
ori R24,240
and R24,R20
out 0x1b,R24
.dbline 66
; write_tim(SLA_R); //发送读地址
ldi R16,50
ldi R17,0
xcall _delay_us
.dbline 67
;
cbi 0x1b,3
.dbline 68
; timer[0]=read_tim()&0x7F; //读出秒数据
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline -2
L16:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r data 22 c
.dbend
.dbfunc e lcd_comm_b _lcd_comm_b fV
; a -> R20
; data -> R20
.even
_lcd_comm_b::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 73
; timer[1]=read_tim()&0x7F; //读出分数据
; timer[2]=read_tim()&0x3F; //读出时数据
; timer[3]=read_tim()&0x3F; //读出日数据
; timer[4]=read_tim()&0x07; //读出周数据
; if(timer[4]==0)timer[4]=7;
.dbline 75
; timer[5]=read_tim(); //读出月数据
; if((timer[5]&0x80)==0)
cbi 0x1b,2
.dbline 76
; timer[7]=0x20; //世纪位为0,是21世纪
sbi 0x1b,3
.dbline 77
; else timer[7]=0x19; //世纪位不为0,是20世纪
ori R20,15
.dbline 78
; timer[5]=timer[5]&0x1F;
in R24,0x1b
ori R24,240
and R24,R20
out 0x1b,R24
.dbline 79
; timer[6]=read_tim(); //读出年数据
ldi R16,50
ldi R17,0
xcall _delay_us
.dbline 80
; stop();
cbi 0x1b,3
.dbline 81
; return I2C_CRR;
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r data 20 c
.dbend
.dbfunc e lcd_init _lcd_init fV
.even
_lcd_init::
.dbline -1
.dbline 86
; }
;
; /**********************************
; * 写入时钟函数 *
; **********************************/
.dbline 87
; uchar write_timer(void)
ldi R16,2
ldi R17,0
xcall _delay_ms
.dbline 88
; {
ldi R16,32
xcall _lcd_comm_b
.dbline 89
; start(); //启动总线
ldi R16,400
ldi R17,1
xcall _delay_us
.dbline 90
; waitack(); //等待启动完成
ldi R16,40
xcall _lcd_comm
.dbline 91
; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
ldi R16,200
ldi R17,0
xcall _delay_us
.dbline 92
; write_tim(SLA_W); //发送写地址
ldi R16,12
xcall _lcd_comm
.dbline 93
; write_tim(0x00); //写数据首地址
ldi R16,200
ldi R17,0
xcall _delay_us
.dbline 94
; write_tim(0x20); //写控制/状态寄存器1,暂停计时
ldi R16,6
xcall _lcd_comm
.dbline 95
; write_tim(0x00); //写控制/状态寄存器2
ldi R16,100
ldi R17,0
xcall _delay_us
.dbline 96
; write_tim(0x00); //写秒数据为0
ldi R16,1
xcall _lcd_comm
.dbline 97
; write_tim(timer[1]); //写分数据
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e cls _cls fV
.even
_cls::
.dbline -1
.dbline 102
; write_tim(timer[2]); //写时数据
; write_tim(timer[3]); //写日数据
; write_tim(timer[4]); //写周数据
; write_tim(timer[5]); //写月数据
; write_tim(timer[6]); //写年数据
.dbline 103
; stop();
ldi R16,1
xcall _lcd_comm
.dbline 104
; return I2C_CRR;
ldi R16,5
ldi R17,0
xcall _delay_ms
.dbline -2
L19:
.dbline 0 ; func end
ret
.dbend
.dbfunc e locate _locate fV
; x -> R20
; b -> R22
; a -> R10
.even
_locate::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 109
; }
;
; /**********************************
; * 启动时钟函数 *
; **********************************/
.dbline 111
; uchar start_timer(void)
; {
mov R24,R10
cpi R24,1
brne L21
.dbline 112
; start(); //启动总线
mov R20,R22
subi R20,128 ; addi 128
subi R20,1
L21:
.dbline 113
; waitack(); //等待启动完成
mov R24,R10
cpi R24,2
brne L23
.dbline 114
; if(chkack()!=START)return I2C_ERR; //检查是否启动成功
mov R20,R22
subi R20,64 ; addi 192
subi R20,1
L23:
.dbline 115
; write_tim(SLA_W); //发送写地址
mov R16,R20
xcall _lcd_comm
.dbline 116
; write_tim(0x00); //写数据首地址
ldi R16,5
ldi R17,0
xcall _delay_ms
.dbline -2
L20:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r x 20 c
.dbsym r b 22 c
.dbsym r a 10 c
.dbend
.dbfunc e lcd _lcd fV
; i -> R20
.even
_lcd::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 121
; write_tim(0x00); //写控制/状态寄存器1,暂停计时
; stop();
; return I2C_CRR;
; }
;
.dbline 122
; /**********************************
mov R16,R20
xcall _lcd_da
.dbline -2
L25:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e xs_lcd _xs_lcd fV
; s -> R20,R21
.even
_xs_lcd::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 130
; * 将时钟数据转换后在LCD上显示 *
; **********************************/
; void timer_lcd(void)
; {
; locate(1,4); //写指令:第1行第4列地址
;
; lcd_da((timer[7]>>4)+0x30);
; lcd_da((timer[7]&0x0f)+0x30);
xjmp L28
L27:
.dbline 132
.dbline 133
movw R30,R20
ldd R16,z+0
xcall _lcd
.dbline 134
subi R20,255 ; offset = 1
sbci R21,255
.dbline 135
L28:
.dbline 131
; lcd_da((timer[6]>>4)+0x30); //显示年
movw R30,R20
ldd R2,z+0
tst R2
brne L27
.dbline -2
L26:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbend
.dbfunc e tonghe _tonghe fV
.even
_tonghe::
.dbline -1
.dbline 144
; lcd_da((timer[6]&0x0f)+0x30);
; lcd_da('/');
; lcd_da((timer[5]>>4)+0x30); //显示月
; lcd_da((timer[5]&0x0f)+0x30);
; lcd_da('/');
; lcd_da((timer[3]>>4)+0x30); //显示日
; lcd_da((timer[3]&0x0f)+0x30);
;
; locate(2,2); //写指令:第2行地址
;
; lcd_da((timer[2]>>4)+0x30); //时
; lcd_da((timer[2]&0x0f)+0x30);
; lcd_da(':');
.dbline 145
; lcd_da((timer[1]>>4)+0x30); //分
xcall _cls
.dbline 146
; lcd_da((timer[1]&0x0f)+0x30);
ldi R18,5
ldi R16,1
xcall _locate
.dbline 147
; lcd_da(':');
ldi R16,<L31
ldi R17,>L31
xcall _xs_lcd
.dbline 148
; lcd_da((timer[0]>>4)+0x30); //秒
ldi R18,1
ldi R16,2
xcall _locate
.dbline 149
; lcd_da((timer[0]&0x0f)+0x30);
ldi R16,<L32
ldi R17,>L32
xcall _xs_lcd
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.dbfile D:\PCF8563\1602_time\TWI_8563.h
.dbfunc e Twi_Init _Twi_Init fV
.even
_Twi_Init::
.dbline -1
.dbline 56
.dbline 57
ldi R24,14
out 0x0,R24
.dbline 58
clr R2
out 0x1,R2
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.dbfunc e write_tim _write_tim fc
; a -> R16
.even
_write_tim::
.dbline -1
.dbline 63
.dbline 64
.dbline 64
out 0x3,R16
.dbline 64
ldi R24,132
out 0x36,R24
.dbline 64
.dbline 64
.dbline 65
L35:
.dbline 65
L36:
.dbline 65
in R2,0x36
sbrs R2,7
rjmp L35
.dbline 65
.dbline 65
.dbline 66
in R24,0x1
andi R24,248
cpi R24,24
breq L38
.dbline 66
clr R16
xjmp L34
L38:
.dbline 67
ldi R16,1
.dbline -2
L34:
.dbline 0 ; func end
ret
.dbsym r a 16 c
.dbend
.dbfunc e read_tim _read_tim fc
.even
_read_tim::
.dbline -1
.dbline 71
.dbline 72
ldi R24,196
out 0x36,R24
.dbline 73
L41:
.dbline 73
L42:
.dbline 73
in R2,0x36
sbrs R2,7
rjmp L41
.dbline 73
.dbline 73
.dbline 74
in R24,0x1
andi R24,248
cpi R24,80
breq L44
.dbline 74
clr R16
xjmp L40
L44:
.dbline 77
in R16,0x3
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbend
.dbfile D:\PCF8563\1602_time\1602_8563.c
.dbfunc e spk _spk fV
; a -> R10,R11
; n -> R20
; i -> R22
.even
_spk::
xcall push_gset3
mov R20,R18
mov R22,R16
.dbline -1
.dbline 35
.dbline 37
xjmp L50
L47:
.dbline 38
.dbline 39
ldi R24,10
mul R24,R22
movw R10,R0
.dbline 40
xjmp L54
L51:
.dbline 41
.dbline 42
ldi R16,500
ldi R17,1
xcall _delay_us
.dbline 43
ldi R24,64
in R2,0x12
eor R2,R24
out 0x12,R2
.dbline 44
ldi R16,500
ldi R17,1
xcall _delay_us
.dbline 45
ldi R24,64
in R2,0x12
eor R2,R24
out 0x12,R2
.dbline 46
L52:
.dbline 40
movw R24,R10
sbiw R24,1
movw R10,R24
L54:
.dbline 40
tst R10
brne L51
tst R11
brne L51
X3:
.dbline 47
cbi 0x12,6
.dbline 48
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 49
L48:
.dbline 37
dec R20
L50:
.dbline 37
tst R20
brne L47
.dbline -2
L46:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r a 10 i
.dbsym r n 20 c
.dbsym r i 22 c
.dbend
.dbfunc e read_timer _read_timer fc
.even
_read_timer::
.dbline -1
.dbline 56
.dbline 57
ldi R24,164
out 0x36,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -