📄 ds12997.lis
字号:
.module ds12997.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\ds12997.c
0000 .dbfunc e delay5ms _delay5ms fV
0000 ; i -> R16
0000 ; j -> R18
.even
0000 _delay5ms::
0000 .dbline -1
0000 .dbline 98
0000 ; /******************************************************/
0000 ; // AVR 执行时间:8MHZ ->0.125us 4MHZ->0.25us //无串口,模拟总线最简版
0000 ; // 2MHZ->0.5us *1MHZ->1us ,每句后延时2句
0000 ; //51 执行时间:11.0592MHZ->2.17us
0000 ; //
0000 ; //
0000 ; /****************************************************/
0000 ;
0000 ; #include <iom16v.h> //2009-2-27-12-44 bf.1MHZ->2us
0000 ; #include <macros.h>
0000 ;
0000 ; #define uchar unsigned char //定义无符号字符为 uchar
0000 ; #define uint unsigned int //定义无符号整型
0000 ;
0000 ; uchar y1,y2,y3,y4,y5,y6;
0000 ;
0000 ; /**********************接口定义*********************************/
0000 ; //GND <-- MOT VCC -->VCC
0000 ; // . SQW
0000 ; // . .
0000 ; //PA_0<-- AD0 .
0000 ; //PA_1<-- AD1 .
0000 ; //PA_2<-- AD2 IRQ -->PB_0
0000 ; //PA_3<-- AD3 REET -->VCC
0000 ; //PA_4<-- AD4 DS -->PB_1
0000 ; //PA_5<-- AD5 .
0000 ; //PA_6<-- AD6 R/W -->PB_2
0000 ; //PA_7<-- AD7 AS -->PB_3
0000 ; // GND CS -->PB_4
0000 ; /*********************引脚说明***********************************/
0000 ; //DS12887 16 器件
0000 ; //数据线 PA口 数据地址公用总线
0000 ; //DS_IRQ PB0 时间中断
0000 ; //DS_DS PB1 数据选通
0000 ; //DS_RW PB2 读写控制
0000 ; //DS_AS PB3 地址选通
0000 ; //DS_CS PB4 芯片片选
0000 ; //DS_MOT GND 模式选择
0000 ;
0000 ; /*******************数据地址定义*************************************/
0000 ; #define DS12887_Second 0x00 //秒
0000 ; #define DS12887_Minute 0x02 //分
0000 ; #define DS12887_Hour 0x04 //时
0000 ; #define DS12887_Week 0x06 //星期
0000 ; #define DS12887_Day 0x07 //日
0000 ; #define DS12887_Month 0x08 //月
0000 ; #define DS12887_Year 0x09 //年
0000 ;
0000 ; //引脚电平定义
0000 ; #define P_DS_1 PORTB|=BIT(PB1) //DS_DS为1
0000 ; #define P_DS_0 PORTB&=~BIT(PB1) //DS_DS为0
0000 ; #define D_DS_1 DDRB |=BIT(PB1) //设为输出
0000 ;
0000 ; #define P_RW_1 PORTB|=BIT(PB2) //DS_RW为1
0000 ; #define P_RW_0 PORTB&=~BIT(PB2) //DS_RW为0
0000 ; #define D_RW_1 DDRB |=BIT(PB2) //设为输出
0000 ;
0000 ; #define P_AS_1 PORTB|=BIT(PB3) //DS_AS为1
0000 ; #define P_AS_0 PORTB&=~BIT(PB3) //DS_AS为0
0000 ; #define D_AS_1 DDRB |=BIT(PB3) //设为输出
0000 ;
0000 ; #define P_CS_1 PORTB|=BIT(PB4) //DS_CS为1
0000 ; #define P_CS_0 PORTB&=~BIT(PB4) //DS_CS为0
0000 ; #define D_CS_1 DDRB |=BIT(PB4) //设为输出
0000 ;
0000 ;
0000 ; //数据端口定义
0000 ; #define AD_DDR DDRA //AD(地址/数据服用线)的输入/输出控制
0000 ; #define AD_PORT PORTA //AD(地址/数据服用线)的输出电平控制
0000 ; #define AD_PIN PINA //AD(地址/数据服用线)的输入电平控制
0000 ;
0000 ; #define s1us_NOP(); _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
0000 ; #define s2us_NOP(); s1us_NOP();s1us_NOP(); //延时等待2us
0000 ; //定义时间类型,结构体数据类型
0000 ; typedef struct _SYSTEMTIME_
0000 ; {
0000 ; unsigned char Second;
0000 ; unsigned char Minute;
0000 ; unsigned char Hour;
0000 ; unsigned char Week;
0000 ; unsigned char Day;
0000 ; unsigned char Month;
0000 ; unsigned char Year;
0000 ; unsigned char DateString[9];
0000 ; unsigned char TimeString[9];
0000 ; }SYSTEMTIME;
0000 ;
0000 ; /***********************函数声明*****************************/
0000 ; void DS12887_Init(void); //DS12887初始化
0000 ; void DS12887_Write( uchar Address, uchar Value); //DS12887指定地址写入数据
0000 ; uchar DS12887_Read(uchar Address); //DS12887指定地址中读出数据
0000 ; void DS12887_SetTime( uchar Address, uchar Value); //设置时间函数
0000 ; void DS12887_GetTime(SYSTEMTIME *Time); //读出时间
0000 ; void delay_8nus(uchar n);
0000 ;
0000 ; /*********************延时5000+0us 函数定义**********/
0000 ; void delay5ms(void)
0000 ; {
0000 .dbline 100
0000 ; uchar i,j;
0000 ; for(i=185;i>0;i--)
0000 09EB ldi R16,185
0002 07C0 xjmp L5
0004 L2:
0004 .dbline 101
0004 2CE0 ldi R18,12
0006 01C0 xjmp L9
0008 L6:
0008 .dbline 101
0008 L7:
0008 .dbline 101
0008 2A95 dec R18
000A L9:
000A .dbline 101
000A 2224 clr R2
000C 2216 cp R2,R18
000E E0F3 brlo L6
0010 L3:
0010 .dbline 100
0010 0A95 dec R16
0012 L5:
0012 .dbline 100
0012 2224 clr R2
0014 2016 cp R2,R16
0016 B0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbsym r i 16 c
001A .dbsym r j 18 c
001A .dbend
001A .dbfunc e delay_1ms _delay_1ms fV
001A ; i -> R16,R17
.even
001A _delay_1ms::
001A .dbline -1
001A .dbline 105
001A ; for(j=12;j>0;j--);
001A ; }
001A ; /*****************延时1秒子函数*******************/
001A ; void delay_1ms(void)
001A ; {
001A .dbline 107
001A ; uint i;
001A ; for(i=1;i<(8*143-2);i++) //8为晶振频率
001A 01E0 ldi R16,1
001C 10E0 ldi R17,0
001E 02C0 xjmp L14
0020 L11:
0020 .dbline 108
0020 L12:
0020 .dbline 107
0020 0F5F subi R16,255 ; offset = 1
0022 1F4F sbci R17,255
0024 L14:
0024 .dbline 107
0024 0637 cpi R16,118
0026 E4E0 ldi R30,4
0028 1E07 cpc R17,R30
002A D0F3 brlo L11
002C .dbline -2
002C L10:
002C .dbline 0 ; func end
002C 0895 ret
002E .dbsym r i 16 i
002E .dbend
002E .dbfunc e delay_nms _delay_nms fV
002E ; i -> R20,R21
002E ; n -> R22,R23
.even
002E _delay_nms::
002E 0E940000 xcall push_gset2
0032 B801 movw R22,R16
0034 .dbline -1
0034 .dbline 112
0034 ; ;
0034 ; }
0034 ; /****************延时N毫秒子函数****************/
0034 ; void delay_nms(uint n)
0034 ; {
0034 .dbline 114
0034 ; uint i;
0034 ; for(i=0;i<n;i++)
0034 4427 clr R20
0036 5527 clr R21
0038 03C0 xjmp L19
003A L16:
003A .dbline 115
003A EFDF xcall _delay_1ms
003C L17:
003C .dbline 114
003C 4F5F subi R20,255 ; offset = 1
003E 5F4F sbci R21,255
0040 L19:
0040 .dbline 114
0040 4617 cp R20,R22
0042 5707 cpc R21,R23
0044 D0F3 brlo L16
0046 .dbline -2
0046 L15:
0046 0E940000 xcall pop_gset2
004A .dbline 0 ; func end
004A 0895 ret
004C .dbsym r i 20 i
004C .dbsym r n 22 i
004C .dbend
004C .dbfunc e delay_8nus _delay_8nus fV
004C ; i -> R22,R23
004C ; k -> R20,R21
004C ; n -> R16
.even
004C _delay_8nus::
004C 0E940000 xcall push_gset2
0050 .dbline -1
0050 .dbline 119
0050 ; delay_1ms();
0050 ; }
0050 ; /****************精确延时微妙级,8MHZ,0.25us/step***********/
0050 ; void delay_8nus(uchar n)
0050 ; {
0050 .dbline 121
0050 ; uint i,k;
0050 ; i=n;
0050 602F mov R22,R16
0052 7727 clr R23
0054 .dbline 122
0054 ; for(k=i;k>0;k--)
0054 AB01 movw R20,R22
0056 03C0 xjmp L24
0058 L21:
0058 .dbline 123
0058 .dbline 124
0058 0000 nop
005A .dbline 125
005A L22:
005A .dbline 122
005A 4150 subi R20,1
005C 5040 sbci R21,0
005E L24:
005E .dbline 122
005E 4030 cpi R20,0
0060 4507 cpc R20,R21
0062 D1F7 brne L21
0064 X0:
0064 .dbline -2
0064 L20:
0064 0E940000 xcall pop_gset2
0068 .dbline 0 ; func end
0068 0895 ret
006A .dbsym r i 22 i
006A .dbsym r k 20 i
006A .dbsym r n 16 c
006A .dbend
006A .dbfunc e DS12887_Write _DS12887_Write fV
006A ; Value -> R18
006A ; Address -> R16
.even
006A _DS12887_Write::
006A .dbline -1
006A .dbline 129
006A ; {
006A ; _NOP();
006A ; }
006A ; }
006A ; /*******DS12887指定地址写入数据 ,严格按照INTERL的时序,程序**********/
006A ; void DS12887_Write( uchar Address, uchar Value)
006A ; {
006A .dbline 131
006A ;
006A ; P_AS_0;
006A C398 cbi 0x18,3
006C .dbline 132
006C ; _NOP();
006C 0000 nop
006E .dbline 133
006E ; _NOP();
006E 0000 nop
0070 .dbline 134
0070 ; P_DS_1;
0070 C19A sbi 0x18,1
0072 .dbline 135
0072 ; _NOP();
0072 0000 nop
0074 .dbline 136
0074 ; _NOP();
0074 0000 nop
0076 .dbline 137
0076 ; P_RW_1; //给出读信号
0076 C29A sbi 0x18,2
0078 .dbline 138
0078 ; _NOP();
0078 0000 nop
007A .dbline 139
007A ; _NOP();
007A 0000 nop
007C .dbline 140
007C ; P_AS_1; //锁存信号高电平
007C C39A sbi 0x18,3
007E .dbline 141
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -