📄 ds12887.lst
字号:
__text_start:
__start:
0046 E5CF LDI R28,0x5F
0047 E0D4 LDI R29,4
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E9E8 LDI R30,0x98
0050 E0F0 LDI R31,0
0051 E010 LDI R17,0
0052 39EE CPI R30,0x9E
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E5E4 LDI R30,0x54
0059 E0F0 LDI R31,0
005A E6A0 LDI R26,0x60
005B E0B0 LDI R27,0
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E0257 CALL _main
_exit:
0066 CFFF RJMP _exit
FILE: C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\ds12997.c
(0001) /******************************************************/
(0002) //Title:ATMAGE16 & DS12887加上串口通信显示时钟程序-查询方式
(0003) //ICC-AVR : 2009-3-4 17:04:40
(0004) // Target : M16
(0005) // Crystal: 1.0000Mhz ~8.0000Mhz都好使
(0006) //Author :borlittle
(0007) //Function:usart+DS12887 RTC test
(0008) //备注 :本程序经调试好使,如果程序不好使,请注意检查硬件连线,内部时钟
(0009) //记得要校验准,串口才能发送正确,
(0010) // AVR 执行时间:8MHZ ->0.125us 4MHZ->0.25us //有串口,模拟总线最简版
(0011) // 2MHZ->0.5us *1MHZ->1us ,每句后延时2句
(0012) // at89s52 执行时间:11.0592MHZ->2.17us
(0013) //
(0014) //
(0015) /****************************************************/
(0016)
(0017) #include <iom16v.h>
(0018) #include <macros.h>
(0019)
(0020) #define uchar unsigned char //定义无符号字符为 uchar
(0021) #define uint unsigned int //定义无符号整型
(0022) #define Crystal 8000000 //晶振8MHZ
(0023) #define Baud 9600 //波特率
(0024)
(0025) uchar y1,y2,y3,y4,y5,y6; //用于调试用,在JTAG仿真器与AVR Studio 中查看是否读取正确
(0026) uchar y[19]={0,0,'.',0,0,'.',0,0,' ',0,0,':',0,0,':',0,0,' ',' '}; //09.3.4 17:06:50
(0027) //上位机接收到得时间数据格式
(0028) /**********************接口定义*********************************/
(0029) //GND <-- MOT VCC -->VCC
(0030) // . SQW
(0031) // . .
(0032) //PA_0<-- AD0 .
(0033) //PA_1<-- AD1 .
(0034) //PA_2<-- AD2 IRQ -->PB_0
(0035) //PA_3<-- AD3 REET -->VCC
(0036) //PA_4<-- AD4 DS -->PB_1
(0037) //PA_5<-- AD5 .
(0038) //PA_6<-- AD6 R/W -->PB_2
(0039) //PA_7<-- AD7 AS -->PB_3
(0040) // GND CS -->GND--可以用端口控制以省电降功耗
(0041) /*********************引脚说明***********************************/
(0042) //DS12887 16 器件
(0043) //数据线 PA口 数据地址公用总线
(0044) //DS_IRQ PB0 时间中断
(0045) //DS_DS PB1 数据选通
(0046) //DS_RW PB2 读写控制
(0047) //DS_AS PB3 地址选通
(0048) //DS_CS PB4 芯片片选
(0049) //DS_MOT GND 模式选择
(0050)
(0051) /*******************数据地址定义*************************************/
(0052) #define DS12887_Second 0x00 //秒
(0053) #define DS12887_Minute 0x02 //分
(0054) #define DS12887_Hour 0x04 //时
(0055) #define DS12887_Week 0x06 //星期
(0056) #define DS12887_Day 0x07 //日
(0057) #define DS12887_Month 0x08 //月
(0058) #define DS12887_Year 0x09 //年
(0059)
(0060) //引脚电平定义
(0061) #define P_DS_1 PORTB|=BIT(PB1) //DS_DS为1
(0062) #define P_DS_0 PORTB&=~BIT(PB1) //DS_DS为0
(0063) #define D_DS_1 DDRB |=BIT(PB1) //设为输出
(0064)
(0065) #define P_RW_1 PORTB|=BIT(PB2) //DS_RW为1
(0066) #define P_RW_0 PORTB&=~BIT(PB2) //DS_RW为0
(0067) #define D_RW_1 DDRB |=BIT(PB2) //设为输出
(0068)
(0069) #define P_AS_1 PORTB|=BIT(PB3) //DS_AS为1
(0070) #define P_AS_0 PORTB&=~BIT(PB3) //DS_AS为0
(0071) #define D_AS_1 DDRB |=BIT(PB3) //设为输出
(0072)
(0073) #define P_CS_1 PORTB|=BIT(PB4) //DS_CS为1
(0074) #define P_CS_0 PORTB&=~BIT(PB4) //DS_CS为0
(0075) #define D_CS_1 DDRB |=BIT(PB4) //设为输出
(0076)
(0077)
(0078) //数据端口定义
(0079) #define AD_DDR DDRA //AD(地址/数据服用线)的输入/输出控制
(0080) #define AD_PORT PORTA //AD(地址/数据服用线)的输出电平控制
(0081) #define AD_PIN PINA //AD(地址/数据服用线)的输入电平控制
(0082)
(0083) //定义时间类型,结构体数据类型
(0084) typedef struct _SYSTEMTIME_
(0085) {
(0086) unsigned char Second;
(0087) unsigned char Minute;
(0088) unsigned char Hour;
(0089) unsigned char Week;
(0090) unsigned char Day;
(0091) unsigned char Month;
(0092) unsigned char Year;
(0093) unsigned char DateString[9];
(0094) unsigned char TimeString[9];
(0095) }SYSTEMTIME;
(0096)
(0097) /***********************函数声明*****************************/
(0098) void DS12887_Init(void); //DS12887初始化
(0099) void DS12887_Write( uchar Address, uchar Value); //DS12887指定地址写入数据
(0100) uchar DS12887_Read(uchar Address); //DS12887指定地址中读出数据
(0101) void DS12887_SetTime( uchar Address, uchar Value); //设置时间函数
(0102) void DS12887_GetTime(SYSTEMTIME *Time); //读出时间
(0103) void delay_8nus(uchar n);
(0104) void port_init(void);
(0105) void usart0_init(void);
(0106) void init_devices(void);
(0107)
(0108) void usart_char_send(uchar i);
(0109) void usart_str_send(char *s);
(0110) uchar usart_char_receive(void);
(0111)
(0112) /*****************串口初始化*********************************/
(0113) void usart_init(void)
(0114) {
(0115) UCSRB = 0x00; //禁止发送和接收
_usart_init:
0067 2422 CLR R2
0068 B82A OUT 0x0A,R2
(0116) UCSRA = 0x02; //倍速异步模式USX=1
0069 E082 LDI R24,2
006A B98B OUT 0x0B,R24
(0117) UCSRC = 0x06; //0000 0110,UCSZ1=1,UCSZ0=1;8位字符,1位停止位
006B E086 LDI R24,6
006C BD80 OUT 0x20,R24
(0118) UBRRL=(Crystal/8/(Baud+1))%256; //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256
006D E688 LDI R24,0x68
006E B989 OUT 0x09,R24
(0119) UBRRH=(Crystal/8/(Baud+1))/256; //参见ATMAGE16使用手册
006F BC20 OUT 0x20,R2
(0120) UCSRB = 0x18; //允许发送和接收
0070 E188 LDI R24,0x18
0071 B98A OUT 0x0A,R24
0072 9508 RET
(0121) }
(0122) /******************端口初始化*******************************/
(0123) void port_init(void)
(0124) {
(0125) DDRB = 0xFF;
_port_init:
0073 EF8F LDI R24,0xFF
0074 BB87 OUT 0x17,R24
(0126) PORTB = 0xFF; //设为输出高电平
0075 BB88 OUT 0x18,R24
(0127)
(0128) DDRA = 0x00;
0076 2422 CLR R2
0077 BA2A OUT 0x1A,R2
(0129) PORTA = 0x00; //设为高阻态
0078 BA2B OUT 0x1B,R2
(0130)
(0131) PORTD = 0xFF; //设置RXD0和TXD0
0079 BB82 OUT 0x12,R24
(0132) DDRD = 0x02;
007A E082 LDI R24,2
007B BB81 OUT 0x11,R24
007C 9508 RET
(0133)
(0134) }
(0135)
(0136) //****************发送一个字符******************************
(0137) void usart_char_send(uchar i)
(0138) {
(0139) while(!(UCSRA&(1<<UDRE)));
_usart_char_send:
i --> R16
007D 9B5D SBIS 0x0B,5
007E CFFE RJMP _usart_char_send
(0140) UDR=i;
007F B90C OUT 0x0C,R16
0080 9508 RET
_usart_str_send:
s --> R20
0081 940E02A9 CALL push_gset1
0083 01A8 MOVW R20,R16
(0141) }
(0142) /******************发送一个字符串*************************/
(0143) void usart_str_send(char *s)
(0144) {
0084 C005 RJMP 0x008A
(0145) while(*s)
(0146) {
(0147) usart_char_send(*s);
0085 01FA MOVW R30,R20
0086 8100 LDD R16,Z+0
0087 DFF5 RCALL _usart_char_send
(0148) s++;
0088 5F4F SUBI R20,0xFF
0089 4F5F SBCI R21,0xFF
008A 01FA MOVW R30,R20
008B 8020 LDD R2,Z+0
008C 2022 TST R2
008D F7B9 BNE 0x0085
008E 940E02AC CALL pop_gset1
0090 9508 RET
_usart_send_arry:
i --> R20
0091 940E02A9 CALL push_gset1
(0149) }
(0150) }
(0151) /*****************发送数组数据**************************************/
(0152) void usart_send_arry(void)
(0153) {
(0154) uchar i;
(0155) for(i=0;i<19;i++)
0093 2744 CLR R20
0094 C009 RJMP 0x009E
(0156) usart_char_send(y[i]);
0095 E680 LDI R24,0x60
0096 E090 LDI R25,0
0097 2FE4 MOV R30,R20
0098 27FF CLR R31
0099 0FE8 ADD R30,R24
009A 1FF9 ADC R31,R25
009B 8100 LDD R16,Z+0
009C DFE0 RCALL _usart_char_send
009D 9543 INC R20
009E 3143 CPI R20,0x13
009F F3A8 BCS 0x0095
00A0 940E02AC CALL pop_gset1
00A2 9508 RET
(0157) }
(0158) /*****************接收一个字符****************************/
(0159) uchar usart_char_receive(void)
(0160) {
(0161) while(!(UCSRA&(1<<RXC)));
_usart_char_receive:
00A3 9B5F SBIS 0x0B,7
00A4 CFFE RJMP _usart_char_receive
(0162) return UDR;
00A5 B10C IN R16,0x0C
00A6 9508 RET
(0163) }
(0164)
(0165)
(0166) /*********************延时5000+0us 函数定义**********/
(0167) void delay5ms(void)
(0168) {
(0169) uchar i,j;
(0170) for(i=185;i>0;i--)
_delay5ms:
i --> R16
j --> R18
00A7 EB09 LDI R16,0xB9
00A8 C007 RJMP 0x00B0
(0171) for(j=12;j>0;j--);
00A9 E02C LDI R18,0xC
00AA C001 RJMP 0x00AC
00AB 952A DEC R18
00AC 2422 CLR R2
00AD 1622 CP R2,R18
00AE F3E0 BCS 0x00AB
00AF 950A DEC R16
00B0 2422 CLR R2
00B1 1620 CP R2,R16
00B2 F3B0 BCS 0x00A9
00B3 9508 RET
(0172) }
(0173) /*****************延时1秒子函数*******************/
(0174) void delay_1ms(void)
(0175) {
(0176) uint i;
(0177) for(i=1;i<(8*143-2);i++) //8为晶振频率
_delay_1ms:
i --> R16
00B4 E001 LDI R16,1
00B5 E010 LDI R17,0
00B6 C002 RJMP 0x00B9
00B7 5F0F SUBI R16,0xFF
00B8 4F1F SBCI R17,0xFF
00B9 3706 CPI R16,0x76
00BA E0E4 LDI R30,4
00BB 071E CPC R17,R30
00BC F3D0 BCS 0x00B7
00BD 9508 RET
_delay_nms:
i --> R20
n --> R22
00BE 940E02A7 CALL push_gset2
00C0 01B8 MOVW R22,R16
(0178) ;
(0179) }
(0180) /****************延时N毫秒子函数****************/
(0181) void delay_nms(uint n)
(0182) {
(0183) uint i;
(0184) for(i=0;i<n;i++)
00C1 2744 CLR R20
00C2 2755 CLR R21
00C3 C003 RJMP 0x00C7
(0185) delay_1ms();
00C4 DFEF RCALL _delay_1ms
00C5 5F4F SUBI R20,0xFF
00C6 4F5F SBCI R21,0xFF
00C7 1746 CP R20,R22
00C8 0757 CPC R21,R23
00C9 F3D0 BCS 0x00C4
00CA 940E029E CALL pop_gset2
00CC 9508 RET
_delay_8nus:
i --> R22
k --> R20
n --> R16
00CD 940E02A7 CALL push_gset2
(0186) }
(0187) /****************精确延时微妙级,8MHZ,0.25us/step***********/
(0188) void delay_8nus(uchar n)
(0189) {
(0190) uint i,k;
(0191) i=n;
00CF 2F60 MOV R22,R16
00D0 2777 CLR R23
(0192) for(k=i;k>0;k--)
00D1 01AB MOVW R20,R22
00D2 C003 RJMP 0x00D6
(0193) {
(0194) _NOP();
00D3 0000 NOP
00D4 5041 SUBI R20,1
00D5 4050 SBCI R21,0
00D6 3040 CPI R20,0
00D7 0745 CPC R20,R21
00D8 F7D1 BNE 0x00D3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -