?? lcd1602pbpd.lis
字號:
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 + -