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

📄 lcd1602pbpd.lis

📁 一些LCD库 分享给大家了 哈哈~
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 00B4           ; #define I2C_STATUS_MASK	(_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3))
 00B4           ; #define I2C_STATUS		(TWSR & I2C_STATUS_MASK)
 00B4           ; 
 00B4           ; /*
 00B4           ;  * R/~W bit in SLA+R/W address field.
 00B4           ;  */
 00B4           ; #define I2C_READ		1
 00B4           ; #define I2C_WRITE		0
 00B4           ; 
 00B4           ; #define I2CStart()    	(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
 00B4           ; #define I2CStop()     	(TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
 00B4           ; #define I2CWaitAck()	{while(!(TWCR&(1<<TWINT)));}
 00B4           ; #define I2CChkAck() 	(TWSR&0xf8)					//check ack
 00B4           ; #define I2CSendAck()	(TWCR|=(1<<TWEA))
 00B4           ; #define I2CSendNoAck()	(TWCR&=~(1<<TWEA))
 00B4           ; #define I2CSendByte(x)	{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 
 00B4           ; #define I2CRcvNckByte()	(TWCR=(1<<TWINT)|(1<<TWEN))
 00B4           ; #define I2CRcvAckByte()	(TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
 00B4           ; 
 00B4           ; /* For Program */
 00B4           ; #define I2C_Stop()		I2CStop()
 00B4           ; #define I2C_SendAck()	I2CSendAck()
 00B4           ; #define I2C_SendNoAck() I2CSendNoAck()
 00B4           ; #define I2C_WaitAck()	I2CWaitAck()
 00B4           ; 
 00B4           ; /* I2C Config */
 00B4           ; #define I2C_ERR			0
 00B4           ; #define I2C_CRR			1
 00B4           ; 
 00B4           ; /*--------------------------------------------------------------------
 00B4           ; 函数名称:I2C Start
 00B4           ; 函数功能:
 00B4           ; 注意事项:
 00B4           ; 提示说明:
 00B4           ; 输    入:
 00B4           ; 返    回:
 00B4           ; --------------------------------------------------------------------*/
 00B4           ; bool I2C_Start()					
 00B4           ; {
 00B4           ; 	I2CStart();						
 00B4 84EA              ldi R24,164
 00B6 86BF              out 0x36,R24
 00B8           ;       I2CWaitAck();
 00B8           L7:
 00B8           L8:
 00B8 26B6              in R2,0x36
 00BA 27FE              sbrs R2,7
 00BC FDCF              rjmp L7
 00BE           X2:
 00BE           ; 	if( I2CChkAck()!=I2C_START ) 
 00BE 81B1              in R24,0x1
 00C0 887F              andi R24,248
 00C2 8830              cpi R24,8
 00C4 11F0              breq L10
 00C6           X3:
 00C6           ; 		return I2C_ERR;
 00C6 0027              clr R16
 00C8 01C0              xjmp L6
 00CA           L10:
 00CA           ; 	return I2C_CRR;
 00CA 01E0              ldi R16,1
 00CC           L6:
 00CC                   .dbline 0 ; func end
 00CC 0895              ret
                        .even
 00CE           _I2C_Restart::
 00CE           ; }
 00CE           ; /*--------------------------------------------------------------------
 00CE           ; 函数名称:I2C ReStart
 00CE           ; 函数功能:
 00CE           ; 注意事项:
 00CE           ; 提示说明:
 00CE           ; 输    入:
 00CE           ; 返    回:
 00CE           ; --------------------------------------------------------------------*/
 00CE           ; bool I2C_Restart()					
 00CE           ; {
 00CE           ; 	I2CStart();						
 00CE 84EA              ldi R24,164
 00D0 86BF              out 0x36,R24
 00D2           ;       I2CWaitAck();
 00D2           L13:
 00D2           L14:
 00D2 26B6              in R2,0x36
 00D4 27FE              sbrs R2,7
 00D6 FDCF              rjmp L13
 00D8           X4:
 00D8           ; 	if( I2CChkAck()!=I2C_RESTART ) 
 00D8 81B1              in R24,0x1
 00DA 887F              andi R24,248
 00DC 8031              cpi R24,16
 00DE 11F0              breq L16
 00E0           X5:
 00E0           ; 		return I2C_ERR;
 00E0 0027              clr R16
 00E2 01C0              xjmp L12
 00E4           L16:
 00E4           ; 	return I2C_CRR;
 00E4 01E0              ldi R16,1
 00E6           L12:
 00E6                   .dbline 0 ; func end
 00E6 0895              ret
 00E8           ;         wrDAdr -> R16
                        .even
 00E8           _I2C_SendWrDAdr::
 00E8           ; }
 00E8           ; /*--------------------------------------------------------------------
 00E8           ; 函数名称:发送 7位 器件写地址: XXXX XXX0
 00E8           ; 函数功能:
 00E8           ; 注意事项:
 00E8           ; 提示说明:
 00E8           ; 输    入:
 00E8           ; 返    回:
 00E8           ; --------------------------------------------------------------------*/
 00E8           ; bool I2C_SendWrDAdr(uint8 wrDAdr)	
 00E8           ; {
 00E8           ; 	I2CSendByte(wrDAdr);			//设置 器件写地址
 00E8 03B9              out 0x3,R16
 00EA 84E8              ldi R24,132
 00EC 86BF              out 0x36,R24
 00EE           ;       I2CWaitAck();
 00EE           L19:
 00EE           L20:
 00EE 26B6              in R2,0x36
 00F0 27FE              sbrs R2,7
 00F2 FDCF              rjmp L19
 00F4           X6:
 00F4           ; 	if( I2CChkAck()!=I2C_MT_SLA_ACK )  
 00F4 81B1              in R24,0x1
 00F6 887F              andi R24,248
 00F8 8831              cpi R24,24
 00FA 11F0              breq L22
 00FC           X7:
 00FC           ; 		return I2C_ERR;
 00FC 0027              clr R16
 00FE 01C0              xjmp L18
 0100           L22:
 0100           ; 	return I2C_CRR;		
 0100 01E0              ldi R16,1
 0102           L18:
 0102                   .dbline 0 ; func end
 0102 0895              ret
 0104           ;         wrDAdr -> R10,R11
                        .even
 0104           _I2C_SendWrDAdr_::
 0104 AA92              st -y,R10
 0106 BA92              st -y,R11
 0108 5801              movw R10,R16
 010A           ; }
 010A           ; /*--------------------------------------------------------------------
 010A           ; 函数名称:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
 010A           ; 函数功能:
 010A           ; 注意事项:
 010A           ; 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
 010A           ; 输    入:
 010A           ; 返    回:
 010A           ; --------------------------------------------------------------------*/
 010A           ; bool I2C_SendWrDAdr_(uint16 wrDAdr)   
 010A           ; {
 010A           ;       if( wrDAdr&0xF000 == 0xF000 )   //判断是否为 10位 器件地址
 010A A0FE              sbrs R10,0
 010C 0EC0              rjmp L25
 010E           X8:
 010E           ; 		if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR )	//设置 (高位)器件写地址
 010E 0A2D              mov R16,R10
 0110 0695              lsr R16
 0112 0695              lsr R16
 0114 0695              lsr R16
 0116 0695              lsr R16
 0118 0695              lsr R16
 011A 0695              lsr R16
 011C 0695              lsr R16
 011E 0695              lsr R16
 0120 E3DF              xcall _I2C_SendWrDAdr
 0122 0023              tst R16
 0124 11F4              brne L27
 0126           X9:
 0126           ; 			return I2C_ERR;
 0126 0027              clr R16
 0128 07C0              xjmp L24
 012A           L27:
 012A           L25:
 012A           ; 	if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR )	//设置 (低位)器件写地址
 012A 0A2D              mov R16,R10
 012C DDDF              xcall _I2C_SendWrDAdr
 012E 0023              tst R16
 0130 11F4              brne L29
 0132           X10:
 0132           ; 		return I2C_ERR;
 0132 0027              clr R16
 0134 01C0              xjmp L24
 0136           L29:
 0136           ; 	return I2C_CRR;
 0136 01E0              ldi R16,1
 0138           L24:
 0138                   .dbline 0 ; func end
 0138 B990              ld R11,y+
 013A A990              ld R10,y+
 013C 0895              ret
 013E           ;         rdDAdr -> R16
                        .even
 013E           _I2C_SendRdDAdr::
 013E           ; }
 013E           ; /*--------------------------------------------------------------------
 013E           ; 函数名称:发送 7位 器件读地址: XXXX XXX1
 013E           ; 函数功能:
 013E           ; 注意事项:
 013E           ; 提示说明:
 013E           ; 输    入:
 013E           ; 返    回:
 013E           ; --------------------------------------------------------------------*/
 013E           ; bool I2C_SendRdDAdr(uint8 rdDAdr)	
 013E           ; {
 013E           ; 	I2CSendByte(rdDAdr);			//设置 器件读地址
 013E 03B9              out 0x3,R16
 0140 84E8              ldi R24,132
 0142 86BF              out 0x36,R24
 0144           ;       I2CWaitAck();
 0144           L32:
 0144           L33:
 0144 26B6              in R2,0x36
 0146 27FE              sbrs R2,7
 0148 FDCF              rjmp L32
 014A           X11:
 014A           ; 	if( I2CChkAck()!=I2C_MR_SLA_ACK )  
 014A 81B1              in R24,0x1
 014C 887F              andi R24,248
 014E 8034              cpi R24,64
 0150 11F0              breq L35
 0152           X12:
 0152           ; 		return I2C_ERR;
 0152 0027              clr R16
 0154 01C0              xjmp L31
 0156           L35:
 0156           ; 	return I2C_CRR;	
 0156 01E0              ldi R16,1
 0158           L31:
 0158                   .dbline 0 ; func end
 0158 0895              ret
 015A           ;         rdDAdr -> R10
                        .even
 015A           _I2C_SendRdDAdr_::
 015A AA92              st -y,R10
 015C A02E              mov R10,R16
 015E           ; }
 015E           ; /*--------------------------------------------------------------------
 015E           ; 函数名称:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
 015E           ; 函数功能:
 015E           ; 注意事项:
 015E           ; 提示说明:
 015E           ; 输    入:
 015E           ; 返    回:
 015E           ; --------------------------------------------------------------------*/
 015E           ; bool I2C_SendRdDAdr_(uint8 rdDAdr)    
 015E           ; {
 015E           ;       if( rdDAdr&0xF000 == 0xF000 )   //判断是否为 10位 器件地址
 015E A0FE              sbrs R10,0
 0160 0EC0              rjmp L38
 0162           X13:
 0162           ; 		if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR )	//设置 (高位)器件读地址
 0162 0A2D              mov R16,R10
 0164 0695              lsr R16
 0166 0695              lsr R16
 0168 0695              lsr R16
 016A 0695              lsr R16
 016C 0695              lsr R16
 016E 0695              lsr R16
 0170 0695              lsr R16
 0172 0695              lsr R16
 0174 B9DF              xcall _I2C_SendWrDAdr
 0176 0023              tst R16
 0178 11F4              brne L40
 017A           X14:
 017A           ; 			return I2C_ERR;
 017A 0027              clr R16
 017C 07C0              xjmp L37
 017E           L40:
 017E           L38:
 017E           ; 	if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR )	//设置 (低位)器件读地址
 017E 0A2D              mov R16,R10
 0180 B3DF              xcall _I2C_SendWrDAdr
 0182 0023              tst R16
 0184 11F4              brne L42
 0186           X15:
 0186           ; 		return I2C_ERR;
 0186 0027              clr R16
 0188 01C0              xjmp L37
 018A           L42:
 018A           ; 	return I2C_CRR;
 018A 01E0              ldi R16,1
 018C           L37:
 018C                   .dbline 0 ; func end
 018C A990              ld R10,y+
 018E 0895              ret
 0190           ;      configDat -> R16
                        .even
 0190           _I2C_SendDat::
 0190           ; }
 0190           ; /*--------------------------------------------------------------------
 0190           ; 函数名称:I2C发送数据
 0190           ; 函数功能:
 0190           ; 注意事项:
 0190           ; 提示说明:
 0190           ; 输    入:
 0190           ; 返    回:
 0190           ; --------------------------------------------------------------------*/
 0190           ; bool I2C_SendDat(uint8 configDat)	
 0190           ; {
 0190           ; 	I2CSendByte(configDat);			
 0190 03B9              out 0x3,R16
 0192 84E8              ldi R24,132
 0194 86BF              out 0x36,R24
 0196           ;       I2CWaitAck();
 0196           L45:
 0196           L46:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -