📄 ds12887.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E6 CPI R30,0x66
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0147 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\ds12997.c
(0001) /******************************************************/
(0002) // AVR 执行时间:8MHZ ->0.125us 4MHZ->0.25us //无串口,模拟总线最简版
(0003) // 2MHZ->0.5us *1MHZ->1us ,每句后延时2句
(0004) //51 执行时间:11.0592MHZ->2.17us
(0005) //
(0006) //
(0007) /****************************************************/
(0008)
(0009) #include <iom16v.h> //2009-2-27-12-44 bf.1MHZ->2us
(0010) #include <macros.h>
(0011)
(0012) #define uchar unsigned char //定义无符号字符为 uchar
(0013) #define uint unsigned int //定义无符号整型
(0014)
(0015) uchar y1,y2,y3,y4,y5,y6;
(0016)
(0017) /**********************接口定义*********************************/
(0018) //GND <-- MOT VCC -->VCC
(0019) // . SQW
(0020) // . .
(0021) //PA_0<-- AD0 .
(0022) //PA_1<-- AD1 .
(0023) //PA_2<-- AD2 IRQ -->PB_0
(0024) //PA_3<-- AD3 REET -->VCC
(0025) //PA_4<-- AD4 DS -->PB_1
(0026) //PA_5<-- AD5 .
(0027) //PA_6<-- AD6 R/W -->PB_2
(0028) //PA_7<-- AD7 AS -->PB_3
(0029) // GND CS -->PB_4
(0030) /*********************引脚说明***********************************/
(0031) //DS12887 16 器件
(0032) //数据线 PA口 数据地址公用总线
(0033) //DS_IRQ PB0 时间中断
(0034) //DS_DS PB1 数据选通
(0035) //DS_RW PB2 读写控制
(0036) //DS_AS PB3 地址选通
(0037) //DS_CS PB4 芯片片选
(0038) //DS_MOT GND 模式选择
(0039)
(0040) /*******************数据地址定义*************************************/
(0041) #define DS12887_Second 0x00 //秒
(0042) #define DS12887_Minute 0x02 //分
(0043) #define DS12887_Hour 0x04 //时
(0044) #define DS12887_Week 0x06 //星期
(0045) #define DS12887_Day 0x07 //日
(0046) #define DS12887_Month 0x08 //月
(0047) #define DS12887_Year 0x09 //年
(0048)
(0049) //引脚电平定义
(0050) #define P_DS_1 PORTB|=BIT(PB1) //DS_DS为1
(0051) #define P_DS_0 PORTB&=~BIT(PB1) //DS_DS为0
(0052) #define D_DS_1 DDRB |=BIT(PB1) //设为输出
(0053)
(0054) #define P_RW_1 PORTB|=BIT(PB2) //DS_RW为1
(0055) #define P_RW_0 PORTB&=~BIT(PB2) //DS_RW为0
(0056) #define D_RW_1 DDRB |=BIT(PB2) //设为输出
(0057)
(0058) #define P_AS_1 PORTB|=BIT(PB3) //DS_AS为1
(0059) #define P_AS_0 PORTB&=~BIT(PB3) //DS_AS为0
(0060) #define D_AS_1 DDRB |=BIT(PB3) //设为输出
(0061)
(0062) #define P_CS_1 PORTB|=BIT(PB4) //DS_CS为1
(0063) #define P_CS_0 PORTB&=~BIT(PB4) //DS_CS为0
(0064) #define D_CS_1 DDRB |=BIT(PB4) //设为输出
(0065)
(0066)
(0067) //数据端口定义
(0068) #define AD_DDR DDRA //AD(地址/数据服用线)的输入/输出控制
(0069) #define AD_PORT PORTA //AD(地址/数据服用线)的输出电平控制
(0070) #define AD_PIN PINA //AD(地址/数据服用线)的输入电平控制
(0071)
(0072) #define s1us_NOP(); _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
(0073) #define s2us_NOP(); s1us_NOP();s1us_NOP(); //延时等待2us
(0074) //定义时间类型,结构体数据类型
(0075) typedef struct _SYSTEMTIME_
(0076) {
(0077) unsigned char Second;
(0078) unsigned char Minute;
(0079) unsigned char Hour;
(0080) unsigned char Week;
(0081) unsigned char Day;
(0082) unsigned char Month;
(0083) unsigned char Year;
(0084) unsigned char DateString[9];
(0085) unsigned char TimeString[9];
(0086) }SYSTEMTIME;
(0087)
(0088) /***********************函数声明*****************************/
(0089) void DS12887_Init(void); //DS12887初始化
(0090) void DS12887_Write( uchar Address, uchar Value); //DS12887指定地址写入数据
(0091) uchar DS12887_Read(uchar Address); //DS12887指定地址中读出数据
(0092) void DS12887_SetTime( uchar Address, uchar Value); //设置时间函数
(0093) void DS12887_GetTime(SYSTEMTIME *Time); //读出时间
(0094) void delay_8nus(uchar n);
(0095)
(0096) /*********************延时5000+0us 函数定义**********/
(0097) void delay5ms(void)
(0098) {
(0099) uchar i,j;
(0100) for(i=185;i>0;i--)
_delay5ms:
i --> R16
j --> R18
004B EB09 LDI R16,0xB9
004C C007 RJMP 0x0054
(0101) for(j=12;j>0;j--);
004D E02C LDI R18,0xC
004E C001 RJMP 0x0050
004F 952A DEC R18
0050 2422 CLR R2
0051 1622 CP R2,R18
0052 F3E0 BCS 0x004F
0053 950A DEC R16
0054 2422 CLR R2
0055 1620 CP R2,R16
0056 F3B0 BCS 0x004D
0057 9508 RET
(0102) }
(0103) /*****************延时1秒子函数*******************/
(0104) void delay_1ms(void)
(0105) {
(0106) uint i;
(0107) for(i=1;i<(8*143-2);i++) //8为晶振频率
_delay_1ms:
i --> R16
0058 E001 LDI R16,1
0059 E010 LDI R17,0
005A C002 RJMP 0x005D
005B 5F0F SUBI R16,0xFF
005C 4F1F SBCI R17,0xFF
005D 3706 CPI R16,0x76
005E E0E4 LDI R30,4
005F 071E CPC R17,R30
0060 F3D0 BCS 0x005B
0061 9508 RET
_delay_nms:
i --> R20
n --> R22
0062 940E016D CALL push_gset2
0064 01B8 MOVW R22,R16
(0108) ;
(0109) }
(0110) /****************延时N毫秒子函数****************/
(0111) void delay_nms(uint n)
(0112) {
(0113) uint i;
(0114) for(i=0;i<n;i++)
0065 2744 CLR R20
0066 2755 CLR R21
0067 C003 RJMP 0x006B
(0115) delay_1ms();
0068 DFEF RCALL _delay_1ms
0069 5F4F SUBI R20,0xFF
006A 4F5F SBCI R21,0xFF
006B 1746 CP R20,R22
006C 0757 CPC R21,R23
006D F3D0 BCS 0x0068
006E 940E0164 CALL pop_gset2
0070 9508 RET
_delay_8nus:
i --> R22
k --> R20
n --> R16
0071 940E016D CALL push_gset2
(0116) }
(0117) /****************精确延时微妙级,8MHZ,0.25us/step***********/
(0118) void delay_8nus(uchar n)
(0119) {
(0120) uint i,k;
(0121) i=n;
0073 2F60 MOV R22,R16
0074 2777 CLR R23
(0122) for(k=i;k>0;k--)
0075 01AB MOVW R20,R22
0076 C003 RJMP 0x007A
(0123) {
(0124) _NOP();
0077 0000 NOP
0078 5041 SUBI R20,1
0079 4050 SBCI R21,0
007A 3040 CPI R20,0
007B 0745 CPC R20,R21
007C F7D1 BNE 0x0077
007D 940E0164 CALL pop_gset2
007F 9508 RET
(0125) }
(0126) }
(0127) /*******DS12887指定地址写入数据 ,严格按照INTERL的时序,程序**********/
(0128) void DS12887_Write( uchar Address, uchar Value)
(0129) {
(0130)
(0131) P_AS_0;
_DS12887_Write:
Value --> R18
Address --> R16
0080 98C3 CBI 0x18,3
(0132) _NOP();
0081 0000 NOP
(0133) _NOP();
0082 0000 NOP
(0134) P_DS_1;
0083 9AC1 SBI 0x18,1
(0135) _NOP();
0084 0000 NOP
(0136) _NOP();
0085 0000 NOP
(0137) P_RW_1; //给出读信号
0086 9AC2 SBI 0x18,2
(0138) _NOP();
0087 0000 NOP
(0139) _NOP();
0088 0000 NOP
(0140) P_AS_1; //锁存信号高电平
0089 9AC3 SBI 0x18,3
(0141) _NOP();
008A 0000 NOP
(0142) _NOP();
008B 0000 NOP
(0143) AD_DDR = 0xFF; //数据口设置为输出
008C EF8F LDI R24,0xFF
008D BB8A OUT 0x1A,R24
(0144) _NOP();
008E 0000 NOP
(0145) _NOP();
008F 0000 NOP
(0146) _NOP();
0090 0000 NOP
(0147) _NOP();
0091 0000 NOP
(0148) AD_PORT = Address; //给出地址
0092 BB0B OUT 0x1B,R16
(0149) _NOP();
0093 0000 NOP
(0150) _NOP();
0094 0000 NOP
(0151) _NOP();
0095 0000 NOP
(0152) _NOP();
0096 0000 NOP
(0153) _NOP();
0097 0000 NOP
(0154) _NOP(); //
0098 0000 NOP
(0155) P_AS_0; //锁存信号低电平
0099 98C3 CBI 0x18,3
(0156) _NOP();
009A 0000 NOP
(0157) _NOP();
009B 0000 NOP
(0158) P_RW_0; //给出写信号
009C 98C2 CBI 0x18,2
(0159) _NOP();
009D 0000 NOP
(0160) _NOP();
009E 0000 NOP
(0161) _NOP();
009F 0000 NOP
(0162) AD_PORT = Value; //写出数据
00A0 BB2B OUT 0x1B,R18
(0163) _NOP();
00A1 0000 NOP
(0164) _NOP();
00A2 0000 NOP
(0165) _NOP();
00A3 0000 NOP
(0166) _NOP();
00A4 0000 NOP
(0167) _NOP();
00A5 0000 NOP
(0168) _NOP();
00A6 0000 NOP
(0169) _NOP();
00A7 0000 NOP
(0170) _NOP();
00A8 0000 NOP
(0171) P_RW_1; //给出读信号
00A9 9AC2 SBI 0x18,2
(0172) _NOP();
00AA 0000 NOP
(0173) _NOP();
00AB 0000 NOP
(0174) _NOP();
00AC 0000 NOP
(0175) P_AS_1; //片选信号高电平
00AD 9AC3 SBI 0x18,3
(0176) _NOP();
00AE 0000 NOP
(0177) _NOP();
00AF 0000 NOP
00B0 9508 RET
_DS12887_Read:
temp --> R20
Address --> R16
00B1 940E016F CALL push_gset1
(0178) }
(0179) /*********DS12887指定地址中读出数据,严格按照INTERL的时序!!!!!********/
(0180) uchar DS12887_Read( uchar Address)
(0181) {
(0182) unsigned char temp = 0;
00B3 2744 CLR R20
(0183) P_AS_0; //锁存信号高电平
00B4 98C3 CBI 0x18,3
(0184) _NOP();
00B5 0000 NOP
(0185) _NOP();
00B6 0000 NOP
(0186) P_DS_1;
00B7 9AC1 SBI 0x18,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -