📄 rtc.lst
字号:
__start:
__text_start:
0021 E5CF LDI R28,0x5F
0022 E0D2 LDI R29,2
0023 BFCD OUT 0x3D,R28
0024 BFDE OUT 0x3E,R29
0025 51C0 SUBI R28,0x10
0026 40D0 SBCI R29,0
0027 EA0A LDI R16,0xAA
0028 8308 STD Y+0,R16
0029 2400 CLR R0
002A E7E0 LDI R30,0x70
002B E0F0 LDI R31,0
002C E010 LDI R17,0
002D 37E2 CPI R30,0x72
002E 07F1 CPC R31,R17
002F F011 BEQ 0x0032
0030 9201 ST R0,Z+
0031 CFFB RJMP 0x002D
0032 8300 STD Z+0,R16
0033 E3E2 LDI R30,0x32
0034 E0F0 LDI R31,0
0035 E6A0 LDI R26,0x60
0036 E0B0 LDI R27,0
0037 E010 LDI R17,0
0038 34E2 CPI R30,0x42
0039 07F1 CPC R31,R17
003A F021 BEQ 0x003F
003B 95C8 LPM
003C 9631 ADIW R30,1
003D 920D ST R0,X+
003E CFF9 RJMP 0x0038
003F D37E RCALL _main
_exit:
0040 CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
0041 D437 RCALL push_gset1
FILE: E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
(0001) //***************************FileName:RTC.C************************//
(0002) //***************************ICCAVR V6.30编译**********************//
(0003)
(0004) #include <io8535v.h> //寄存器定义文件
(0005) #include <macros.h> //使用到宏
(0006) #define uchar unsigned char //数据类型定义
(0007) #define uint unsigned char //数据类型定义
(0008) #define SD2303 0x64 //SD2303器件IIC识别码
(0009)
(0010)
(0011) uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};
(0012) //显示数据表 0 1 2 3 4 5 6 7 8 9 L H
(0013) uchar Data[4]={0,0,0,0}; //DS1722
(0014) uchar Enter_Flag; //确定
(0015) uchar F_Flag; //数据应答标志
(0016)
(0017) void DelayMs(uint i) //延时函数1
(0018) {uchar j;
(0019) for(;i!=0;i--)
0042 C006 RJMP 0x0049
(0020) {for(j=2000;j!=0;j--) {;}}
0043 ED40 LDI R20,0xD0
0044 C001 RJMP 0x0046
0045 954A DEC R20
0046 2344 TST R20
0047 F7E9 BNE 0x0045
0048 950A DEC R16
0049 2300 TST R16
004A F7C1 BNE 0x0043
(0021) }
004B D430 RCALL pop_gset1
004C 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
004D D445 RCALL push_gset3
004E 2EA0 MOV R10,R16
004F 2EB1 MOV R11,R17
(0022)
(0023) void Display(uchar *p) //显示函数
(0024) {uchar i,sel=0x00;
0050 2744 CLR R20
(0025) for(i=0;i<16;i++)
0051 2766 CLR R22
0052 C011 RJMP 0x0064
(0026) {PORTC=sel;
0053 BB45 OUT 0x15,R20
(0027) PORTA=Table[p[i]];
0054 2FE6 MOV R30,R22
0055 27FF CLR R31
0056 0DEA ADD R30,R10
0057 1DFB ADC R31,R11
0058 81E0 LDD R30,Z+0
0059 27FF CLR R31
005A E680 LDI R24,0x60
005B E090 LDI R25,0
005C 0FE8 ADD R30,R24
005D 1FF9 ADC R31,R25
005E 8020 LDD R2,Z+0
005F BA2B OUT 0x1B,R2
(0028) DelayMs(10);
0060 E00A LDI R16,0xA
0061 DFDF RCALL _DelayMs
(0029) sel=sel<<1;
0062 0F44 LSL R20
0063 9563 INC R22
0064 3160 CPI R22,0x10
0065 F368 BCS 0x0053
(0030) }
(0031) }
0066 D40C RCALL pop_gset3
0067 9508 RET
(0032)
(0033)
(0034) void NOPNOP(uchar i) //延时函数2
(0035) {for(;i!=0;i--) NOP();}
_NOPNOP:
i --> R16
0068 C002 RJMP 0x006B
0069 0000 NOP
006A 950A DEC R16
006B 2300 TST R16
006C F7E1 BNE 0x0069
006D 9508 RET
(0036)
(0037) void SetSCL(uchar i) //IIC时钟线SCL设置
(0038) {if(i==1) PORTB=PORTB|0x01;
_SetSCL:
i --> R16
006E 3001 CPI R16,1
006F F411 BNE 0x0072
0070 9AC0 SBI 0x18,0
0071 C003 RJMP 0x0075
(0039) else PORTB=PORTB&0xFE;}
0072 B388 IN R24,0x18
0073 7F8E ANDI R24,0xFE
0074 BB88 OUT 0x18,R24
0075 9508 RET
(0040)
(0041) void SetSDA(uchar i) //IIC数据线SDA设置
(0042) {if(i==1) PORTB=PORTB|0x02;
_SetSDA:
i --> R16
0076 3001 CPI R16,1
0077 F411 BNE 0x007A
0078 9AC1 SBI 0x18,1
0079 C003 RJMP 0x007D
(0043) else PORTB=PORTB&0xFD;}
007A B388 IN R24,0x18
007B 7F8D ANDI R24,0xFD
007C BB88 OUT 0x18,R24
007D 9508 RET
(0044)
(0045) //SCL=PB^0; SD2303时钟线
(0046) //SDA=PB^1; SD2303数据线
(0047) //INTRB=PB^3; SD2303中断线A
(0048) //INTRA=PB^2; SD2303中断线B
(0049)
(0050) void Start() //IIC总线开始信号
(0051) {SetSDA(1);
_Start:
007E E001 LDI R16,1
007F DFF6 RCALL _SetSDA
(0052) SetSCL(1);
0080 E001 LDI R16,1
0081 DFEC RCALL _SetSCL
(0053) NOPNOP(50);
0082 E302 LDI R16,0x32
0083 DFE4 RCALL _NOPNOP
(0054) SetSDA(0);
0084 2700 CLR R16
0085 DFF0 RCALL _SetSDA
(0055) NOPNOP(50);
0086 E302 LDI R16,0x32
0087 DFE0 RCALL _NOPNOP
(0056) SetSCL(0);
0088 2700 CLR R16
(0057) }
0089 CFE4 RJMP _SetSCL
(0058)
(0059) void Stop() //IIC总线停止信号
(0060) {SetSDA(0);
_Stop:
008A 2700 CLR R16
008B DFEA RCALL _SetSDA
(0061) SetSCL(1);
008C E001 LDI R16,1
008D DFE0 RCALL _SetSCL
(0062) NOPNOP(50);
008E E302 LDI R16,0x32
008F DFD8 RCALL _NOPNOP
(0063) SetSDA(1);
0090 E001 LDI R16,1
0091 DFE4 RCALL _SetSDA
(0064) NOPNOP(50);
0092 E302 LDI R16,0x32
0093 DFD4 RCALL _NOPNOP
(0065) SetSCL(0);
0094 2700 CLR R16
(0066) }
0095 CFD8 RJMP _SetSCL
(0067)
(0068) void Ack() //单片机应答信号
(0069) {SetSDA(0);
_Ack:
0096 2700 CLR R16
0097 DFDE RCALL _SetSDA
(0070) SetSCL(1);
0098 E001 LDI R16,1
0099 DFD4 RCALL _SetSCL
(0071) NOPNOP(50);
009A E302 LDI R16,0x32
009B DFCC RCALL _NOPNOP
(0072) SetSCL(0);
009C 2700 CLR R16
009D DFD0 RCALL _SetSCL
(0073) SetSDA(1);
009E E001 LDI R16,1
(0074) }
009F CFD6 RJMP _SetSDA
(0075)
(0076) void Nack() //单片机非应答信号
(0077) {SetSDA(1);
_Nack:
00A0 E001 LDI R16,1
00A1 DFD4 RCALL _SetSDA
(0078) SetSCL(1);
00A2 E001 LDI R16,1
00A3 DFCA RCALL _SetSCL
(0079) NOPNOP(50);
00A4 E302 LDI R16,0x32
00A5 DFC2 RCALL _NOPNOP
(0080) SetSCL(0);
00A6 2700 CLR R16
00A7 DFC6 RCALL _SetSCL
(0081) SetSDA(0);
00A8 2700 CLR R16
(0082) }
00A9 CFCC RJMP _SetSDA
(0083)
(0084) void Check_Ack() //器件应答信号检查
(0085) {SetSDA(1);
_Check_Ack:
00AA E001 LDI R16,1
00AB DFCA RCALL _SetSDA
(0086) SetSCL(1);
00AC E001 LDI R16,1
00AD DFC0 RCALL _SetSCL
(0087) F_Flag=0;
00AE 2422 CLR R2
00AF 92200070 STS _F_Flag,R2
(0088) DDRB=DDRB&0xFD;
00B1 B387 IN R24,0x17
00B2 7F8D ANDI R24,0xFD
00B3 BB87 OUT 0x17,R24
(0089) if((PINB&0x02)==0)
00B4 99B1 SBIC 0x16,1
00B5 C005 RJMP 0x00BB
(0090) {SetSCL(0);
00B6 2700 CLR R16
00B7 DFB6 RCALL _SetSCL
(0091) NOPNOP(50);}
00B8 E302 LDI R16,0x32
00B9 DFAE RCALL _NOPNOP
00BA C007 RJMP 0x00C2
(0092) else
(0093) {F_Flag=1;
00BB E081 LDI R24,1
00BC 93800070 STS _F_Flag,R24
(0094) SetSCL(0);
00BE 2700 CLR R16
00BF DFAE RCALL _SetSCL
(0095) NOPNOP(50);}
00C0 E302 LDI R16,0x32
00C1 DFA6 RCALL _NOPNOP
(0096) DDRB=DDRB|0x02;
00C2 9AB9 SBI 0x17,1
(0097) }
00C3 9508 RET
(0098)
(0099) void Write_Bit0() //向IIC总线写0
(0100) {SetSDA(0);
_Write_Bit0:
00C4 2700 CLR R16
00C5 DFB0 RCALL _SetSDA
(0101) SetSCL(1);
00C6 E001 LDI R16,1
00C7 DFA6 RCALL _SetSCL
(0102) NOPNOP(50);
00C8 E302 LDI R16,0x32
00C9 DF9E RCALL _NOPNOP
(0103) SetSCL(0);
00CA 2700 CLR R16
(0104) }
00CB CFA2 RJMP _SetSCL
(0105)
(0106) void Write_Bit1() //向IIC总线写1
(0107) {SetSDA(1);
_Write_Bit1:
00CC E001 LDI R16,1
00CD DFA8 RCALL _SetSDA
(0108) SetSCL(1);
00CE E001 LDI R16,1
00CF DF9E RCALL _SetSCL
(0109) NOPNOP(50);
00D0 E302 LDI R16,0x32
00D1 DF96 RCALL _NOPNOP
(0110) SetSCL(0);
00D2 2700 CLR R16
00D3 DF9A RCALL _SetSCL
(0111) SetSDA(0);
00D4 2700 CLR R16
(0112) }
00D5 CFA0 RJMP _SetSDA
_Write_Byte:
i --> R20
Data --> R22
00D6 D3B9 RCALL push_gset2
00D7 2F60 MOV R22,R16
(0113)
(0114) void Write_Byte(uchar Data) //向IIC总线写一字节数据
(0115) {uchar i;
(0116) for(i=0;i<8;i++)
00D8 2744 CLR R20
00D9 C00A RJMP 0x00E4
(0117) {if((Data&0x80)>0)
00DA 2422 CLR R2
00DB 2F86 MOV R24,R22
00DC 7880 ANDI R24,0x80
00DD 1628 CP R2,R24
00DE F410 BCC 0x00E1
(0118) Write_Bit1();
00DF DFEC RCALL _Write_Bit1
00E0 C001 RJMP 0x00E2
(0119) else
(0120) Write_Bit0();
00E1 DFE2 RCALL _Write_Bit0
(0121) Data<<=1;
00E2 0F66 LSL R22
00E3 9543 INC R20
00E4 3048 CPI R20,0x8
00E5 F3A0 BCS 0x00DA
(0122) }
(0123) }
00E6 D38A RCALL pop_gset2
00E7 9508 RET
_Read_Byte:
j --> R20
nn --> R22
00E8 D3A7 RCALL push_gset2
(0124)
(0125)
(0126) uchar Read_Byte() //从IIC总线读一字节数据
(0127) {uchar nn=0xff;
00E9 EF6F LDI R22,0xFF
(0128) uchar j;
(0129) for (j=0;j<8;j++)
00EA 2744 CLR R20
00EB C013 RJMP 0x00FF
(0130) {SetSDA(1);
00EC E001 LDI R16,1
00ED DF88 RCALL _SetSDA
(0131) SetSCL(1);
00EE E001 LDI R16,1
00EF DF7E RCALL _SetSCL
(0132) DDRB=DDRB&0xFB;
00F0 B387 IN R24,0x17
00F1 7F8B ANDI R24,0xFB
00F2 BB87 OUT 0x17,R24
(0133)
(0134) if((PINB&0x02)==0)
00F3 99B1 SBIC 0x16,1
00F4 C005 RJMP 0x00FA
(0135) {nn<<=1;
00F5 0F66 LSL R22
(0136) nn=(nn&0xfe);
00F6 7F6E ANDI R22,0xFE
(0137) SetSCL(0);}
00F7 2700 CLR R16
00F8 DF75 RCALL _SetSCL
00F9 C004 RJMP 0x00FE
(0138) else
(0139) {nn<<=1;
00FA 0F66 LSL R22
(0140) nn=(nn|0x01);
00FB 6061 ORI R22,1
(0141) SetSCL(0);}
00FC 2700 CLR R16
00FD DF70 RCALL _SetSCL
00FE 9543 INC R20
00FF 3048 CPI R20,0x8
0100 F358 BCS 0x00EC
(0142) }
(0143) DDRB=DDRB|0x02;
0101 9AB9 SBI 0x17,1
(0144) return(nn);
0102 2F06 MOV R16,R22
0103 D36D RCALL pop_gset2
0104 9508 RET
_Write_Nbyte:
k --> R20
Number --> R22
Array --> R10
Address --> R12
Slave --> R14
0105 D393 RCALL push_gset5
0106 2EC2 MOV R12,R18
0107 2EE0 MOV R14,R16
0108 84AA LDD R10,Y+10
0109 84BB LDD R11,Y+11
010A 856C LDD R22,Y+12
(0145) }
(0146)
(0147) //****************************写N个字节子程序**********************//
(0148) //函数参数说明:
(0149) //Slave:IIC器件地址,如上文定义的SD2303
(0150) //Address:起始地址
(0151) //Array:读数据存放的数组
(0152) //Number:读取的字节数
(0153) void Write_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
(0154) {uchar k;
(0155) writ:do //开始->写IIC器件地址->检查应答位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -