📄 ds1302.s
字号:
.module ds1302.c
.area text(rom, con, rel)
.dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302/YJ1602.C
.dbfunc e LCD1602_portini _LCD1602_portini fV
.even
_LCD1602_portini::
.dbline -1
.dbline 50
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #define uchar unsigned char
; #define uint unsigned int
;
; #define TRUE 1
; #define FALSE 0
; #include "YJ1602.C" //包含1602液晶函数文件
;
; /******************RTC常量******************/
; #define RTC_CLK PB7
; #define RTC_DATA PB5
; #define RTC_CS PC7
; //命令
; #define RD 0x01
; #define WR 0x00
; #define C_SEC 0x80 //秒
; #define C_MIN 0x82 //分
; #define C_HR 0x84 //时
; #define C_DAY 0x86 //日
; #define C_MTH 0x88 //月
; #define C_WK 0x8A //星期 DATE
; #define C_YR 0x8C //年
; #define C_WP 0x8E //控制(写保护)
; #define C_CHARGE 0x90 //涓流充电
; #define C_BURST 0xBE //时钟多字节
; //配置
; #define CLK_HALT 0x80 //停止时钟控制位 SECOND bit7
; #define CLK_START 0x00 //启动时钟
; #define M12_24 0x80 //12/24小时值选择位 HOUR bit7
; #define PROTECT 0x80 //写保护控制位 CONTROL bit7
; #define UPROTECT 0x00 //写保护控制位 CONTROL bit7
; //涓流充电控制常量
; #define TC_D1R2 0xA5 //high 1 Diode +2K Resistors
; #define TC_D2R8 0xAB //low 2 Diodes+8K Resistors
; #define TC_DISABLED 0x00 //Disabled(TCS<>1010 or DS=00 or RS=00)
; //RAM 命令
; #define C_RAMBASE 0xC0 //RAM0~RAM30<<1 地址需左移一位
;
; void Delayus(uint US)
; {
; uint i;
; US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
; for( i=0;i<US;i++);
; }
; void Delayms(uint MS)
; {
; uint i,j;
; for( i=0;i<MS;i++)
; for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
.dbline 51
; }
in R24,0x11
ori R24,112
out 0x11,R24
.dbline 52
;
in R24,0x17
ori R24,255
out 0x17,R24
.dbline -2
.dbline 53
;
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
; dByte -> R20
; DatCmd -> R20
.even
_LCD1602_readbyte::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 61
;
; /*******************************************
; 函数名称: DS1302_init
; 功 能: 初始化DS1302的数据接口
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void DS1302_portinit(void)
.dbline 63
; {
; DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
tst R20
brne L3
.dbline 64
; }
cbi 0x12,4
xjmp L4
L3:
.dbline 66
; /*******************************************
; 函数名称: DS1302_writeB
sbi 0x12,4
L4:
.dbline 68
; 功 能: 向DS1302写入一个字节数据(没有RST操作)
; 参 数: byte--要写入的数据
sbi 0x12,5
.dbline 69
; 返回值 : 无
sbi 0x12,6
.dbline 70
; /********************************************/
clr R2
out 0x17,R2
.dbline 71
; void DS1302_writeB(uchar byte)
in R20,0x16
.dbline 72
; {
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 73
; uchar i;
cbi 0x12,6
.dbline 74
; for(i=0;i<8;i++) //8位数据计数
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 75
; {
mov R16,R20
.dbline -2
L2:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dByte 20 c
.dbsym r DatCmd 20 c
.dbend
.dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
; dByte -> R20
; DatCmd -> R22
.even
_LCD1602_sendbyte::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 85
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
; if(byte&0x01) //当前位是否是1
; {
; PORTB|=BIT(RTC_DATA); //当前位是1,拉高数据端
; }
; else
; {
; PORTB&=~BIT(RTC_DATA); //当前位是0,拉低数据端
; }
; Delayus(10); //调整时钟和脉冲宽度
.dbline 86
; PORTB|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
tst R22
brne L6
.dbline 87
; byte>>=1; //数据右移1位,为送出新数据位做准备
cbi 0x12,4
xjmp L7
L6:
.dbline 89
; }
; }
sbi 0x12,4
L7:
.dbline 91
; /*******************************************
; 函数名称: DS1302_readB
cbi 0x12,5
.dbline 92
; 功 能: 从DS1302读出一个字节数据(没有RST操作)
sbi 0x12,6
.dbline 93
; 参 数: 无
out 0x18,R20
.dbline 94
; 返回值 : byte--读出的数据
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 95
; /********************************************/
cbi 0x12,6
.dbline -2
.dbline 96
; uchar DS1302_readB(void)
L5:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r dByte 20 c
.dbsym r DatCmd 22 c
.dbend
.dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
; ptString -> R20,R21
.even
_LCD1602_sendstr::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 104
; {
; uchar i,byte=0;
; DDRB&=~BIT(RTC_DATA); //将数据端口设置为输入
; PORTB&=~BIT(RTC_DATA); //无上拉电阻
; for(i=0;i<8;i++) //8位数据计数
; {
; byte>>=1; //保存读入的数据位
; PORTB|=BIT(RTC_CLK); //时钟上升沿
xjmp L10
L9:
.dbline 106
.dbline 107
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,1
xcall _LCD1602_sendbyte
.dbline 108
L10:
.dbline 105
; Delayus(10); //延时,调整时钟脉冲宽度
movw R30,R20
ldd R2,z+0
tst R2
brne L9
.dbline -2
.dbline 109
; PORTB&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
; Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
; if(PINB&BIT(RTC_DATA)) //当前位是否是高电平
; {
L8:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ptString 20 pc
.dbend
.dbfunc e LCD1602_clear _LCD1602_clear fV
.even
_LCD1602_clear::
.dbline -1
.dbline 117
; byte|=BIT(PB7); //是高电平就将返回数据的当前位置1
; }
; else
; {
; byte&=~BIT(PB7); //是低电平就将返回数据的当前位置0
; }
; }
; DDRB|=BIT(RTC_DATA); //最后将数据端口设置为输出
.dbline 118
; return byte; //返回读出的数据
ldi R18,1
clr R16
xcall _LCD1602_sendbyte
.dbline 119
; }
ldi R16,2
ldi R17,0
.dbline -2
.dbline 120
; /*******************************************
L12:
.dbline 0 ; func end
xjmp _Delayms
.dbend
.dbfunc e LCD1602_readBF _LCD1602_readBF fc
; busy -> R20
.even
_LCD1602_readBF::
xcall push_gset1
.dbline -1
.dbline 128
; 函数名称: DS1302_writeD
; 功 能: 向DS1302的某个地址写入一个字节数据
; 参 数: addr--地址值(寄存器或RAM)
; data--要写入的地址
; 返回值 : 无
; /********************************************/
; void DS1302_writeD(uchar addr,uchar data)
; {
.dbline 130
; PORTC&=~BIT(RTC_CS); //拉低片选端
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
clr R16
xcall _LCD1602_readbyte
mov R20,R16
.dbline 131
; Delayus(10);
sbrs R16,7
rjmp L14
.dbline 132
; PORTC|=BIT(RTC_CS); //拉高片选端
ldi R20,1
xjmp L15
L14:
.dbline 134
; Delayus(10); //调整片选脉冲
; DS1302_writeB(addr); //写入操作命令(地址)
clr R20
L15:
.dbline 135
; Delayus(10);
mov R16,R20
.dbline -2
L13:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r busy 20 c
.dbend
.dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
; Col -> R20
; Row -> R22
.even
_LCD1602_gotoXY::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 145
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
; Delayus(10);
; DS1302_writeB(data); //写入数据
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
; Delayus(10); //调整片选脉冲
; PORTC&=~BIT(RTC_CS); //拉低片选端
; }
; /*******************************************
; 函数名称: DS1302_readD
; 功 能: 从DS1302的某个地址读出一个字节数据
.dbline 146
; 参 数: addr--地址值(寄存器或RAM)
clr R23
cpi R22,2
ldi R30,0
cpc R23,R30
breq L20
xjmp L17
X0:
.dbline 147
; 返回值 : data--读出的数据
L20:
.dbline 149
; /********************************************/
; uchar DS1302_readD(uchar addr)
mov R18,R20
subi R18,64 ; addi 192
clr R16
xcall _LCD1602_sendbyte
.dbline 149
xjmp L18
L17:
.dbline 151
mov R18,R20
subi R18,128 ; addi 128
clr R16
xcall _LCD1602_sendbyte
.dbline 151
L18:
.dbline -2
.dbline 153
; {
; uchar data;
; PORTC&=~BIT(RTC_CS); //拉低片选端
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
L16:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Col 20 c
.dbsym r Row 22 c
.dbend
.dbfunc e LCD1602_initial _LCD1602_initial fV
.even
_LCD1602_initial::
.dbline -1
.dbline 161
; Delayus(10);
; PORTC|=BIT(RTC_CS); //拉高片选端
; Delayus(10); //调整片选脉冲
; DS1302_writeB(addr); //写入操作命令(地址)
; Delayus(10);
; data=DS1302_readB(); //读出数据
; Delayus(10);
; PORTB&=~BIT(RTC_CLK); //拉低时钟端
.dbline 162
; PORTC&=~BIT(RTC_CS); //拉低片选端
ldi R16,100
ldi R17,0
xcall _Delayms
.dbline 163
; return data; //返回读出的数据
xcall _LCD1602_portini
.dbline 165
; }
; /*******************************************
ldi R18,56
clr R16
xcall _LCD1602_sendbyte
L22:
.dbline 166
L23:
.dbline 166
; 函数名称: DS1302_setT
xcall _LCD1602_readBF
tst R16
brne L22
.dbline 167
; 功 能: 设置DS1302的时间
ldi R18,12
clr R16
xcall _LCD1602_sendbyte
L25:
.dbline 168
L26:
.dbline 168
; 参 数: ptTimeD--设置时间数组指针
xcall _LCD1602_readBF
tst R16
brne L25
.dbline 169
; 返回值 : 无
xcall _LCD1602_clear
L28:
.dbline 170
L29:
.dbline 170
; /********************************************/
xcall _LCD1602_readBF
tst R16
brne L28
.dbline 171
; void DS1302_setT(uchar ptTimeD[])
ldi R18,6
clr R16
.dbline -2
.dbline 172
; {
L21:
.dbline 0 ; func end
xjmp _LCD1602_sendbyte
.dbend
.dbfile I:\AVR视频教程\视频教程\lesson11\ds1302\ds1302\ds1302.c
.dbfunc e Delayus _Delayus fV
; i -> R20,R21
; US -> R22,R23
.even
_Delayus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 41
.dbline 43
ldi R16,5
ldi R17,0
movw R18,R22
xcall empy16s
movw R22,R16
lsr R23
ror R22
lsr R23
ror R22
.dbline 44
clr R20
clr R21
xjmp L35
L32:
.dbline 44
L33:
.dbline 44
subi R20,255 ; offset = 1
sbci R21,255
L35:
.dbline 44
cp R20,R22
cpc R21,R23
brlo L32
.dbline -2
.dbline 45
L31:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r US 22 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
xcall push_gset2
.dbline -1
.dbline 47
.dbline 49
clr R20
clr R21
xjmp L40
L37:
.dbline 50
clr R22
clr R23
xjmp L44
L41:
.dbline 50
L42:
.dbline 50
subi R22,255 ; offset = 1
sbci R23,255
L44:
.dbline 50
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L41
L38:
.dbline 49
subi R20,255 ; offset = 1
sbci R21,255
L40:
.dbline 49
cp R20,R16
cpc R21,R17
brlo L37
.dbline -2
.dbline 51
L36:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e DS1302_portinit _DS1302_portinit fV
.even
_DS1302_portinit::
.dbline -1
.dbline 62
.dbline 63
in R24,0x17
ori R24,160
out 0x17,R24
.dbline -2
.dbline 64
L45:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DS1302_writeB _DS1302_writeB fV
; i -> R20
; byte -> R22
.even
_DS1302_writeB::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 72
.dbline 74
clr R20
xjmp L50
L47:
.dbline 75
.dbline 76
cbi 0x18,7
.dbline 77
sbrs R22,0
rjmp L51
.dbline 78
.dbline 79
sbi 0x18,5
.dbline 80
xjmp L52
L51:
.dbline 82
.dbline 83
cbi 0x18,5
.dbline 84
L52:
.dbline 85
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 86
sbi 0x18,7
.dbline 87
lsr R22
.dbline 88
L48:
.dbline 74
inc R20
L50:
.dbline 74
cpi R20,8
brlo L47
.dbline -2
.dbline 89
L46:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r byte 22 c
.dbend
.dbfunc e DS1302_readB _DS1302_readB fc
; i -> R20
; byte -> R22
.even
_DS1302_readB::
xcall push_gset2
.dbline -1
.dbline 97
.dbline 98
clr R22
.dbline 99
cbi 0x17,5
.dbline 100
cbi 0x18,5
.dbline 101
clr R20
xjmp L57
L54:
.dbline 102
.dbline 103
lsr R22
.dbline 104
sbi 0x18,7
.dbline 105
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 106
cbi 0x18,7
.dbline 107
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 108
sbis 0x16,5
rjmp L58
.dbline 109
.dbline 110
ori R22,128
.dbline 111
xjmp L59
L58:
.dbline 113
.dbline 114
andi R22,127
.dbline 115
L59:
.dbline 116
L55:
.dbline 101
inc R20
L57:
.dbline 101
cpi R20,8
brlo L54
.dbline 117
sbi 0x17,5
.dbline 118
mov R16,R22
.dbline -2
L53:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r byte 22 c
.dbend
.dbfunc e DS1302_writeD _DS1302_writeD fV
; data -> R20
; addr -> R22
.even
_DS1302_writeD::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 128
.dbline 129
cbi 0x15,7
.dbline 130
cbi 0x18,7
.dbline 131
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 132
sbi 0x15,7
.dbline 133
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 134
mov R16,R22
xcall _DS1302_writeB
.dbline 135
ldi R16,10
ldi R17,0
xcall _Delayus
.dbline 136
cbi 0x18,7
.dbline 137
ldi R16,10
ldi R17,0
xcall _Delayus
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -