📄 project.lst
字号:
(0088) //***************************************************************
(0089) INT8U sbGet_Timer_Second(void)
(0090) {
(0091) return(Calendar_Read.Second);
_sbGet_Timer_Second:
00F4 91000063 LDS R16,_Calendar_Read
00F6 9508 RET
(0092) }
(0093)
(0094) //***************************************************************
(0095) // Function : sbGet_Timer_Second
(0096) // Input : None
(0097) // Output : None
(0098) // Description : Interface Function : Get Minute
(0099) //***************************************************************
(0100) INT8U sbGet_Timer_Minute(void)
(0101) {
(0102) return(Calendar_Read.Minute);
_sbGet_Timer_Minute:
00F7 91000064 LDS R16,_Calendar_Read+1
00F9 9508 RET
(0103) }
(0104)
(0105) //***************************************************************
(0106) // Function : sbGet_Timer_Second
(0107) // Input : None
(0108) // Output : None
(0109) // Description : Interface Function : Get Hour
(0110) //***************************************************************
(0111) INT8U sbGet_Timer_Hour(void)
(0112) {
(0113) return(Calendar_Read.Hour);
_sbGet_Timer_Hour:
00FA 91000065 LDS R16,_Calendar_Read+2
00FC 9508 RET
(0114) }
(0115)
(0116) //***************************************************************
(0117) // Function : sbGet_Timer_Second
(0118) // Input : None
(0119) // Output : None
(0120) // Description : Interface Function : Get Day
(0121) //***************************************************************
(0122) INT8U sbGet_Timer_Day(void)
(0123) {
(0124) return(Calendar_Read.Day);
_sbGet_Timer_Day:
00FD 91000066 LDS R16,_Calendar_Read+3
00FF 9508 RET
(0125) }
(0126)
(0127) //***************************************************************
(0128) // Function : sbGet_Timer_Second
(0129) // Input : None
(0130) // Output : None
(0131) // Description : Interface Function : Get Data
(0132) //***************************************************************
(0133) INT8U sbGet_Timer_Date(void)
(0134) {
(0135) return(Calendar_Read.Date);
_sbGet_Timer_Date:
0100 91000067 LDS R16,0x67
0102 9508 RET
(0136) }
(0137)
(0138) //***************************************************************
(0139) // Function : sbGet_Timer_Second
(0140) // Input : None
(0141) // Output : None
(0142) // Description : Interface Function : Get Month
(0143) //***************************************************************
(0144) INT8U sbGet_Timer_Month(void)
(0145) {
(0146) return(Calendar_Read.Month);
_sbGet_Timer_Month:
0103 91000068 LDS R16,0x68
0105 9508 RET
(0147) }
(0148)
(0149) //***************************************************************
(0150) // Function : sbGet_Timer_Second
(0151) // Input : None
(0152) // Output : None
(0153) // Description : Interface Function : Get Year
(0154) //***************************************************************
(0155) INT8U sbGet_Timer_Year(void)
(0156) {
(0157) return(Calendar_Read.Year);
_sbGet_Timer_Year:
0106 91000069 LDS R16,0x69
0108 9508 RET
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\I2C总线应用设计\I2C.C
(0001) //***************************************************************
(0002) // File Name : I2C.C
(0003) // Author : Steaven
(0004) // Created : 2008-06-09
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //***************************************************************
(0008)
(0009) #include "includes.h"
(0010)
(0011) void Delayms(INT16U time)
(0012) {
_Delayms:
time --> R16
0109 C001 RJMP 0x010B
(0013) while(time--) NOP();
010A 0000 NOP
010B 0118 MOVW R2,R16
010C 5001 SUBI R16,1
010D 4010 SBCI R17,0
010E 2022 TST R2
010F F7D1 BNE 0x010A
0110 2033 TST R3
0111 F7C1 BNE 0x010A
(0014) }
0112 9508 RET
(0015)
(0016) //I2C操作状态位,反映操作是否成功
(0017) INT8U bI2C_Ack = 0;
(0018)
(0019) //引脚属性定义,便于移植
(0020) #define DIR_REG_I2C DDRB
(0021) #define PORT_REG_I2C PORTB
(0022) #define PIN_REG_I2C PINB
(0023) #define SCL_BIT_I2C 0
(0024) #define SDA_BIT_I2C 1
(0025)
(0026) //***************************************************************
(0027) // Function : I2C_Set_SDA
(0028) // Input : data - SDA Pin Level
(0029) // Output : none
(0030) // Description : Set SDA Pin Level.
(0031) //***************************************************************
(0032) void I2C_Set_SDA(INT8U data)
(0033) {
(0034) if(data == 0)
_I2C_Set_SDA:
data --> R16
0113 2300 TST R16
0114 F411 BNE 0x0117
(0035) {
(0036) PORT_REG_I2C &= ~(1 << SDA_BIT_I2C);
0115 98C1 CBI 0x18,1
(0037) }
0116 C001 RJMP 0x0118
(0038) else
(0039) {
(0040) PORT_REG_I2C |= (1 << SDA_BIT_I2C);
0117 9AC1 SBI 0x18,1
(0041) }
(0042) }
0118 9508 RET
(0043)
(0044) //***************************************************************
(0045) // Function : I2C_Set_SCL
(0046) // Input : data - SCL Pin Level
(0047) // Output : none
(0048) // Description : Set SCL Pin Level.
(0049) //***************************************************************
(0050) void I2C_Set_SCL(INT8U data)
(0051) {
(0052) if(data == 0)
_I2C_Set_SCL:
data --> R16
0119 2300 TST R16
011A F411 BNE 0x011D
(0053) {
(0054) PORT_REG_I2C &= ~(1 << SCL_BIT_I2C);
011B 98C0 CBI 0x18,0
(0055) }
011C C001 RJMP 0x011E
(0056) else
(0057) {
(0058) PORT_REG_I2C |= (1 << SCL_BIT_I2C);
011D 9AC0 SBI 0x18,0
(0059) }
(0060) }
011E 9508 RET
(0061)
(0062) //***************************************************************
(0063) // Function : I2C_Start_Condition
(0064) // Input : none
(0065) // Output : none
(0066) // Description : Generate a START Condition.
(0067) //***************************************************************
(0068) void I2C_Start_Condition(void)
(0069) {
(0070) I2C_Set_SDA(1);
_I2C_Start_Condition:
011F E001 LDI R16,1
0120 DFF2 RCALL _I2C_Set_SDA
(0071) I2C_Set_SCL(1);
0121 E001 LDI R16,1
0122 DFF6 RCALL _I2C_Set_SCL
(0072) I2C_Set_SDA(0);
0123 2700 CLR R16
0124 DFEE RCALL _I2C_Set_SDA
(0073) I2C_Set_SCL(0);
0125 2700 CLR R16
(0074) }
0126 CFF2 RJMP _I2C_Set_SCL
(0075)
(0076) //***************************************************************
(0077) // Function : I2C_Stop_Condition
(0078) // Input : none
(0079) // Output : none
(0080) // Description : Generate a STOP Condition.
(0081) //***************************************************************
(0082) void I2C_Stop_Condition(void)
(0083) {
(0084) I2C_Set_SDA(0);
_I2C_Stop_Condition:
0127 2700 CLR R16
0128 DFEA RCALL _I2C_Set_SDA
(0085) I2C_Set_SCL(1);
0129 E001 LDI R16,1
012A DFEE RCALL _I2C_Set_SCL
(0086) I2C_Set_SDA(1);
012B E001 LDI R16,1
(0087) }
012C CFE6 RJMP _I2C_Set_SDA
_I2C_Send_Byte:
cnt --> R20
data --> R22
012D 940E0260 CALL push_gset2
012F 2F60 MOV R22,R16
(0088)
(0089) //***************************************************************
(0090) // Function : I2C_Send_Byte
(0091) // Input : data - data to be transmitted
(0092) // Output : none
(0093) // Description : Send a byte on I2C Bus with the MSB first.
(0094) //***************************************************************
(0095) void I2C_Send_Byte(INT8U data)
(0096) {
(0097) INT8U cnt;
(0098) for(cnt = 0;cnt < 8;cnt++)
0130 2744 CLR R20
0131 C011 RJMP 0x0143
(0099) {
(0100) if((data << cnt) & 0x80)
0132 2F06 MOV R16,R22
0133 2F14 MOV R17,R20
0134 940E029E CALL lsl8
0136 2F80 MOV R24,R16
0137 7880 ANDI R24,0x80
0138 F019 BEQ 0x013C
(0101) {
(0102) I2C_Set_SDA(1);
0139 E001 LDI R16,1
013A DFD8 RCALL _I2C_Set_SDA
(0103) }
013B C002 RJMP 0x013E
(0104) else
(0105) {
(0106) I2C_Set_SDA(0);
013C 2700 CLR R16
013D DFD5 RCALL _I2C_Set_SDA
(0107) }
(0108) I2C_Set_SCL(1);
013E E001 LDI R16,1
013F DFD9 RCALL _I2C_Set_SCL
(0109) I2C_Set_SCL(0);
0140 2700 CLR R16
0141 DFD7 RCALL _I2C_Set_SCL
0142 9543 INC R20
0143 3048 CPI R20,0x8
0144 F368 BCS 0x0132
(0110) }
(0111) I2C_Set_SDA(1);
0145 E001 LDI R16,1
0146 DFCC RCALL _I2C_Set_SDA
(0112) I2C_Set_SCL(1);
0147 E001 LDI R16,1
0148 DFD0 RCALL _I2C_Set_SCL
(0113) DIR_REG_I2C &= ~(1 << SDA_BIT_I2C);
0149 98B9 CBI 0x17,1
(0114) if(PIN_REG_I2C & (1 << SDA_BIT_I2C))
014A 9BB1 SBIS 0x16,1
014B C004 RJMP 0x0150
(0115) {
(0116) bI2C_Ack = 0;
014C 2422 CLR R2
014D 92200062 STS 0x62,R2
(0117) }
014F C003 RJMP 0x0153
(0118) else
(0119) {
(0120) bI2C_Ack = 1;
0150 E081 LDI R24,1
0151 93800062 STS 0x62,R24
(0121) }
(0122) I2C_Set_SCL(0);
0153 2700 CLR R16
0154 DFC4 RCALL _I2C_Set_SCL
(0123) DIR_REG_I2C |= (1 << SDA_BIT_I2C);
0155 9AB9 SBI 0x17,1
(0124) Delayms(100);
0156 E604 LDI R16,0x64
0157 E010 LDI R17,0
0158 DFB0 RCALL _Delayms
(0125) }
0159 940E0240 CALL pop_gset2
015B 9508 RET
_I2C_Receive_Byte:
cnt --> R20
data --> R22
015C 940E0260 CALL push_gset2
(0126)
(0127) //***************************************************************
(0128) // Function : I2C_Receive_Byte
(0129) // Input : none
(0130) // Output : Receive a byte from I2C Bus
(0131) // Description : Receive a byte on I2C Bus with the MSB first.
(0132) //***************************************************************
(0133) INT8U I2C_Receive_Byte(void)
(0134) {
(0135) INT8U data = 0;
015E 2766 CLR R22
(0136) INT8U cnt = 0;
015F 2744 CLR R20
(0137) DIR_REG_I2C &= ~(1 << SDA_BIT_I2C);
0160 98B9 CBI 0x17,1
(0138) PORT_REG_I2C |= (1 << SDA_BIT_I2C);
0161 9AC1 SBI 0x18,1
(0139) for(cnt = 0; cnt < 8;cnt++)
0162 C009 RJMP 0x016C
(0140) {
(0141) I2C_Set_SCL(0);
0163 2700 CLR R16
0164 DFB4 RCALL _I2C_Set_SCL
(0142) I2C_Set_SCL(1);
0165 E001 LDI R16,1
0166 DFB2 RCALL _I2C_Set_SCL
(0143) data = data << 1;
0167 0F66 LSL R22
(0144) if(PIN_REG_I2C & (1 << SDA_BIT_I2C))
0168 9BB1 SBIS 0x16,1
0169 C001 RJMP 0x016B
(0145) {
(0146) data |= 0x01;
016A 6061 ORI R22,1
016B 9543 INC R20
016C 3048 CPI R20,0x8
016D F3A8 BCS 0x0163
(0147) }
(0148) }
(0149) I2C_Set_SCL(0);
016E 2700 CLR R16
016F DFA9 RCALL _I2C_Set_SCL
(0150) DIR_REG_I2C |= (1 << SDA_BIT_I2C);
0170 9AB9 SBI 0x17,1
(0151) return(data);
0171 2F06 MOV R16,R22
0172 940E0240 CALL pop_gset2
0174 9508 RET
_I2C_Ack:
ack --> R20
0175 940E0249 CALL push_gset1
0177 2F40 MOV R20,R16
(0152) }
(0153)
(0154) //***************************************************************
(0155) // Function : I2C_Ack
(0156) // Input : ack - Whether to ACK the transmitter
(0157) // Output : none
(0158) // Description : Acknowledge the transmitter with 0 or 1
(0159) //***************************************************************
(0160) void I2C_Ack(INT8U ack)
(0161) {
(0162) if(ack == 0)
0178 2344 TST R20
0179 F419 BNE 0x017D
(0163) {
(0164) I2C_Set_SDA(0);
017A 2700 CLR R16
017B DF97 RCALL _I2C_Set_SDA
(0165) }
017C C002 RJMP 0x017F
(0166) else
(0167) {
(0168) I2C_Set_SDA(1);
017D E001 LDI R16,1
017E DF94 RCALL _I2C_Set_SDA
(0169) }
(0170) I2C_Set_SCL(1);
017F E001 LDI R16,1
0180 DF98 RCALL _I2C_Set_SCL
(0171) I2C_Set_SCL(0);
0181 2700 CLR R16
0182 DF96 RCALL _I2C_Set_SCL
(0172) }
0183 940E024C CALL pop_gset1
0185 9508 RET
_I2C_Send_Data_without_SubAddress:
bData --> R20
bDevice --> R22
0186 940E0260 CALL push_gset2
0188 2F42 MOV R20,R18
0189 2F60 MOV R22,R16
(0173)
(0174) //***************************************************************
(0175) // Function : I2C_Send_Data_without_SubAddress
(0176) // Input : bDevice - Slave Device with a I2C Address,
(0177) // bData - Data to be transmitted
(0178) // Output : I2C Operation Status - Success(1)/Fail(0)
(0179) // Description : Transmit a data to Slave without SubAddress
(0180) //***************************************************************
(0181) INT8U I2C_Send_Data_without_SubAddress(INT8U bDevice,INT8U bData)
(0182) {
(0183) I2C_Start_Condition();
018A DF94 RCALL _I2C_Start_Condition
(0184) I2C_Send_Byte(bDevice);
018B 2F06 MOV R16,R22
018C DFA0 RCALL _I2C_Send_Byte
(0185) if(bI2C_Ack == 0)
018D 90200062 LDS R2,0x62
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -