📄 ds12997.s
字号:
.module ds12997.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\ds12997.c
.dbfunc e delay5ms _delay5ms fV
; i -> R16
; j -> R18
.even
_delay5ms::
.dbline -1
.dbline 98
; /******************************************************/
; // AVR 执行时间:8MHZ ->0.125us 4MHZ->0.25us //无串口,模拟总线最简版
; // 2MHZ->0.5us *1MHZ->1us ,每句后延时2句
; //51 执行时间:11.0592MHZ->2.17us
; //
; //
; /****************************************************/
;
; #include <iom16v.h> //2009-2-27-12-44 bf.1MHZ->2us
; #include <macros.h>
;
; #define uchar unsigned char //定义无符号字符为 uchar
; #define uint unsigned int //定义无符号整型
;
; uchar y1,y2,y3,y4,y5,y6;
;
; /**********************接口定义*********************************/
; //GND <-- MOT VCC -->VCC
; // . SQW
; // . .
; //PA_0<-- AD0 .
; //PA_1<-- AD1 .
; //PA_2<-- AD2 IRQ -->PB_0
; //PA_3<-- AD3 REET -->VCC
; //PA_4<-- AD4 DS -->PB_1
; //PA_5<-- AD5 .
; //PA_6<-- AD6 R/W -->PB_2
; //PA_7<-- AD7 AS -->PB_3
; // GND CS -->PB_4
; /*********************引脚说明***********************************/
; //DS12887 16 器件
; //数据线 PA口 数据地址公用总线
; //DS_IRQ PB0 时间中断
; //DS_DS PB1 数据选通
; //DS_RW PB2 读写控制
; //DS_AS PB3 地址选通
; //DS_CS PB4 芯片片选
; //DS_MOT GND 模式选择
;
; /*******************数据地址定义*************************************/
; #define DS12887_Second 0x00 //秒
; #define DS12887_Minute 0x02 //分
; #define DS12887_Hour 0x04 //时
; #define DS12887_Week 0x06 //星期
; #define DS12887_Day 0x07 //日
; #define DS12887_Month 0x08 //月
; #define DS12887_Year 0x09 //年
;
; //引脚电平定义
; #define P_DS_1 PORTB|=BIT(PB1) //DS_DS为1
; #define P_DS_0 PORTB&=~BIT(PB1) //DS_DS为0
; #define D_DS_1 DDRB |=BIT(PB1) //设为输出
;
; #define P_RW_1 PORTB|=BIT(PB2) //DS_RW为1
; #define P_RW_0 PORTB&=~BIT(PB2) //DS_RW为0
; #define D_RW_1 DDRB |=BIT(PB2) //设为输出
;
; #define P_AS_1 PORTB|=BIT(PB3) //DS_AS为1
; #define P_AS_0 PORTB&=~BIT(PB3) //DS_AS为0
; #define D_AS_1 DDRB |=BIT(PB3) //设为输出
;
; #define P_CS_1 PORTB|=BIT(PB4) //DS_CS为1
; #define P_CS_0 PORTB&=~BIT(PB4) //DS_CS为0
; #define D_CS_1 DDRB |=BIT(PB4) //设为输出
;
;
; //数据端口定义
; #define AD_DDR DDRA //AD(地址/数据服用线)的输入/输出控制
; #define AD_PORT PORTA //AD(地址/数据服用线)的输出电平控制
; #define AD_PIN PINA //AD(地址/数据服用线)的输入电平控制
;
; #define s1us_NOP(); _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
; #define s2us_NOP(); s1us_NOP();s1us_NOP(); //延时等待2us
; //定义时间类型,结构体数据类型
; typedef struct _SYSTEMTIME_
; {
; unsigned char Second;
; unsigned char Minute;
; unsigned char Hour;
; unsigned char Week;
; unsigned char Day;
; unsigned char Month;
; unsigned char Year;
; unsigned char DateString[9];
; unsigned char TimeString[9];
; }SYSTEMTIME;
;
; /***********************函数声明*****************************/
; void DS12887_Init(void); //DS12887初始化
; void DS12887_Write( uchar Address, uchar Value); //DS12887指定地址写入数据
; uchar DS12887_Read(uchar Address); //DS12887指定地址中读出数据
; void DS12887_SetTime( uchar Address, uchar Value); //设置时间函数
; void DS12887_GetTime(SYSTEMTIME *Time); //读出时间
; void delay_8nus(uchar n);
;
; /*********************延时5000+0us 函数定义**********/
; void delay5ms(void)
; {
.dbline 100
; uchar i,j;
; for(i=185;i>0;i--)
ldi R16,185
xjmp L5
L2:
.dbline 101
ldi R18,12
xjmp L9
L6:
.dbline 101
L7:
.dbline 101
dec R18
L9:
.dbline 101
clr R2
cp R2,R18
brlo L6
L3:
.dbline 100
dec R16
L5:
.dbline 100
clr R2
cp R2,R16
brlo L2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbsym r j 18 c
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 105
; for(j=12;j>0;j--);
; }
; /*****************延时1秒子函数*******************/
; void delay_1ms(void)
; {
.dbline 107
; uint i;
; for(i=1;i<(8*143-2);i++) //8为晶振频率
ldi R16,1
ldi R17,0
xjmp L14
L11:
.dbline 108
L12:
.dbline 107
subi R16,255 ; offset = 1
sbci R17,255
L14:
.dbline 107
cpi R16,118
ldi R30,4
cpc R17,R30
brlo L11
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 112
; ;
; }
; /****************延时N毫秒子函数****************/
; void delay_nms(uint n)
; {
.dbline 114
; uint i;
; for(i=0;i<n;i++)
clr R20
clr R21
xjmp L19
L16:
.dbline 115
xcall _delay_1ms
L17:
.dbline 114
subi R20,255 ; offset = 1
sbci R21,255
L19:
.dbline 114
cp R20,R22
cpc R21,R23
brlo L16
.dbline -2
L15:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_8nus _delay_8nus fV
; i -> R22,R23
; k -> R20,R21
; n -> R16
.even
_delay_8nus::
xcall push_gset2
.dbline -1
.dbline 119
; delay_1ms();
; }
; /****************精确延时微妙级,8MHZ,0.25us/step***********/
; void delay_8nus(uchar n)
; {
.dbline 121
; uint i,k;
; i=n;
mov R22,R16
clr R23
.dbline 122
; for(k=i;k>0;k--)
movw R20,R22
xjmp L24
L21:
.dbline 123
.dbline 124
nop
.dbline 125
L22:
.dbline 122
subi R20,1
sbci R21,0
L24:
.dbline 122
cpi R20,0
cpc R20,R21
brne L21
X0:
.dbline -2
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 22 i
.dbsym r k 20 i
.dbsym r n 16 c
.dbend
.dbfunc e DS12887_Write _DS12887_Write fV
; Value -> R18
; Address -> R16
.even
_DS12887_Write::
.dbline -1
.dbline 129
; {
; _NOP();
; }
; }
; /*******DS12887指定地址写入数据 ,严格按照INTERL的时序,程序**********/
; void DS12887_Write( uchar Address, uchar Value)
; {
.dbline 131
;
; P_AS_0;
cbi 0x18,3
.dbline 132
; _NOP();
nop
.dbline 133
; _NOP();
nop
.dbline 134
; P_DS_1;
sbi 0x18,1
.dbline 135
; _NOP();
nop
.dbline 136
; _NOP();
nop
.dbline 137
; P_RW_1; //给出读信号
sbi 0x18,2
.dbline 138
; _NOP();
nop
.dbline 139
; _NOP();
nop
.dbline 140
; P_AS_1; //锁存信号高电平
sbi 0x18,3
.dbline 141
; _NOP();
nop
.dbline 142
; _NOP();
nop
.dbline 143
; AD_DDR = 0xFF; //数据口设置为输出
ldi R24,255
out 0x1a,R24
.dbline 144
; _NOP();
nop
.dbline 145
; _NOP();
nop
.dbline 146
; _NOP();
nop
.dbline 147
; _NOP();
nop
.dbline 148
; AD_PORT = Address; //给出地址
out 0x1b,R16
.dbline 149
; _NOP();
nop
.dbline 150
; _NOP();
nop
.dbline 151
; _NOP();
nop
.dbline 152
; _NOP();
nop
.dbline 153
; _NOP();
nop
.dbline 154
; _NOP(); //
nop
.dbline 155
; P_AS_0; //锁存信号低电平
cbi 0x18,3
.dbline 156
; _NOP();
nop
.dbline 157
; _NOP();
nop
.dbline 158
; P_RW_0; //给出写信号
cbi 0x18,2
.dbline 159
; _NOP();
nop
.dbline 160
; _NOP();
nop
.dbline 161
; _NOP();
nop
.dbline 162
; AD_PORT = Value; //写出数据
out 0x1b,R18
.dbline 163
; _NOP();
nop
.dbline 164
; _NOP();
nop
.dbline 165
; _NOP();
nop
.dbline 166
; _NOP();
nop
.dbline 167
; _NOP();
nop
.dbline 168
; _NOP();
nop
.dbline 169
; _NOP();
nop
.dbline 170
; _NOP();
nop
.dbline 171
; P_RW_1; //给出读信号
sbi 0x18,2
.dbline 172
; _NOP();
nop
.dbline 173
; _NOP();
nop
.dbline 174
; _NOP();
nop
.dbline 175
; P_AS_1; //片选信号高电平
sbi 0x18,3
.dbline 176
; _NOP();
nop
.dbline 177
; _NOP();
nop
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbsym r Value 18 c
.dbsym r Address 16 c
.dbend
.dbfunc e DS12887_Read _DS12887_Read fc
; temp -> R20
; Address -> R16
.even
_DS12887_Read::
xcall push_gset1
.dbline -1
.dbline 181
; }
; /*********DS12887指定地址中读出数据,严格按照INTERL的时序!!!!!********/
; uchar DS12887_Read( uchar Address)
; {
.dbline 182
; unsigned char temp = 0;
clr R20
.dbline 183
; P_AS_0; //锁存信号高电平
cbi 0x18,3
.dbline 184
; _NOP();
nop
.dbline 185
; _NOP();
nop
.dbline 186
; P_DS_1;
sbi 0x18,1
.dbline 187
; _NOP();
nop
.dbline 188
; _NOP();
nop
.dbline 189
; P_RW_1; //给出读信号
sbi 0x18,2
.dbline 190
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -