⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 project.lst

📁 AVR单片机C语言程序设计实例精粹
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -