?? 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 + -