?? lcd12864_st7920.lst
字號:
00BF 7F88 ANDI R24,0xF8
00C0 3088 CPI R24,0x8
00C1 F011 BEQ 0x00C4
(0132) return I2C_ERR;
00C2 2700 CLR R16
00C3 C001 RJMP 0x00C5
(0133) return I2C_CRR;
00C4 E001 LDI R16,1
00C5 9508 RET
(0134) }
(0135) /*--------------------------------------------------------------------
(0136) 函數(shù)名稱:I2C ReStart
(0137) 函數(shù)功能:
(0138) 注意事項:
(0139) 提示說明:
(0140) 輸 入:
(0141) 返 回:
(0142) --------------------------------------------------------------------*/
(0143) bool I2C_Restart()
(0144) {
(0145) I2CStart();
_I2C_Restart:
00C6 EA84 LDI R24,0xA4
00C7 BF86 OUT 0x36,R24
(0146) I2CWaitAck();
00C8 B626 IN R2,0x36
00C9 FE27 SBRS R2,7
00CA CFFD RJMP 0x00C8
(0147) if( I2CChkAck()!=I2C_RESTART )
00CB B181 IN R24,0x01
00CC 7F88 ANDI R24,0xF8
00CD 3180 CPI R24,0x10
00CE F011 BEQ 0x00D1
(0148) return I2C_ERR;
00CF 2700 CLR R16
00D0 C001 RJMP 0x00D2
(0149) return I2C_CRR;
00D1 E001 LDI R16,1
00D2 9508 RET
(0150) }
(0151) /*--------------------------------------------------------------------
(0152) 函數(shù)名稱:發(fā)送 7位 器件寫地址: XXXX XXX0
(0153) 函數(shù)功能:
(0154) 注意事項:
(0155) 提示說明:
(0156) 輸 入:
(0157) 返 回:
(0158) --------------------------------------------------------------------*/
(0159) bool I2C_SendWrDAdr(uint8 wrDAdr)
(0160) {
(0161) I2CSendByte(wrDAdr); //設(shè)置 器件寫地址
_I2C_SendWrDAdr:
wrDAdr --> R16
00D3 B903 OUT 0x03,R16
00D4 E884 LDI R24,0x84
00D5 BF86 OUT 0x36,R24
(0162) I2CWaitAck();
00D6 B626 IN R2,0x36
00D7 FE27 SBRS R2,7
00D8 CFFD RJMP 0x00D6
(0163) if( I2CChkAck()!=I2C_MT_SLA_ACK )
00D9 B181 IN R24,0x01
00DA 7F88 ANDI R24,0xF8
00DB 3188 CPI R24,0x18
00DC F011 BEQ 0x00DF
(0164) return I2C_ERR;
00DD 2700 CLR R16
00DE C001 RJMP 0x00E0
(0165) return I2C_CRR;
00DF E001 LDI R16,1
00E0 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
00E1 940E048E CALL push_gset1
00E3 01A8 MOVW R20,R16
(0166) }
(0167) /*--------------------------------------------------------------------
(0168) 函數(shù)名稱:發(fā)送 10位 器件寫地址: 1111 0XX0, XXXX XXXX
(0169) 函數(shù)功能:
(0170) 注意事項:
(0171) 提示說明:兼容 發(fā)送 7位 器件寫地址: XXXX XXX0
(0172) 輸 入:
(0173) 返 回:
(0174) --------------------------------------------------------------------*/
(0175) bool I2C_SendWrDAdr_(uint16 wrDAdr)
(0176) {
(0177) if( wrDAdr&0xF000 == 0xF000 ) //判斷是否為 10位 器件地址
00E4 FF40 SBRS R20,0
00E5 C00B RJMP 0x00F1
(0178) if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //設(shè)置 (高位)器件寫地址
00E6 2F04 MOV R16,R20
00E7 2711 CLR R17
00E8 2F01 MOV R16,R17
00E9 2711 CLR R17
00EA FD07 SBRC R16,7
00EB 9510 COM R17
00EC DFE6 RCALL _I2C_SendWrDAdr
00ED 2300 TST R16
00EE F411 BNE 0x00F1
(0179) return I2C_ERR;
00EF 2700 CLR R16
00F0 C007 RJMP 0x00F8
(0180) if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //設(shè)置 (低位)器件寫地址
00F1 2F04 MOV R16,R20
00F2 DFE0 RCALL _I2C_SendWrDAdr
00F3 2300 TST R16
00F4 F411 BNE 0x00F7
(0181) return I2C_ERR;
00F5 2700 CLR R16
00F6 C001 RJMP 0x00F8
(0182) return I2C_CRR;
00F7 E001 LDI R16,1
00F8 940E0491 CALL pop_gset1
00FA 9508 RET
(0183) }
(0184) /*--------------------------------------------------------------------
(0185) 函數(shù)名稱:發(fā)送 7位 器件讀地址: XXXX XXX1
(0186) 函數(shù)功能:
(0187) 注意事項:
(0188) 提示說明:
(0189) 輸 入:
(0190) 返 回:
(0191) --------------------------------------------------------------------*/
(0192) bool I2C_SendRdDAdr(uint8 rdDAdr)
(0193) {
(0194) I2CSendByte(rdDAdr); //設(shè)置 器件讀地址
_I2C_SendRdDAdr:
rdDAdr --> R16
00FB B903 OUT 0x03,R16
00FC E884 LDI R24,0x84
00FD BF86 OUT 0x36,R24
(0195) I2CWaitAck();
00FE B626 IN R2,0x36
00FF FE27 SBRS R2,7
0100 CFFD RJMP 0x00FE
(0196) if( I2CChkAck()!=I2C_MR_SLA_ACK )
0101 B181 IN R24,0x01
0102 7F88 ANDI R24,0xF8
0103 3480 CPI R24,0x40
0104 F011 BEQ 0x0107
(0197) return I2C_ERR;
0105 2700 CLR R16
0106 C001 RJMP 0x0108
(0198) return I2C_CRR;
0107 E001 LDI R16,1
0108 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
0109 940E048E CALL push_gset1
010B 2F40 MOV R20,R16
(0199) }
(0200) /*--------------------------------------------------------------------
(0201) 函數(shù)名稱:發(fā)送 10位 器件讀地址: 1111 0XX0, XXXX XXXX
(0202) 函數(shù)功能:
(0203) 注意事項:
(0204) 提示說明:
(0205) 輸 入:
(0206) 返 回:
(0207) --------------------------------------------------------------------*/
(0208) bool I2C_SendRdDAdr_(uint8 rdDAdr)
(0209) {
(0210) if( rdDAdr&0xF000 == 0xF000 ) //判斷是否為 10位 器件地址
010C FF40 SBRS R20,0
010D C00B RJMP 0x0119
(0211) if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //設(shè)置 (高位)器件讀地址
010E 2F04 MOV R16,R20
010F 2711 CLR R17
0110 2F01 MOV R16,R17
0111 2711 CLR R17
0112 FD07 SBRC R16,7
0113 9510 COM R17
0114 DFBE RCALL _I2C_SendWrDAdr
0115 2300 TST R16
0116 F411 BNE 0x0119
(0212) return I2C_ERR;
0117 2700 CLR R16
0118 C007 RJMP 0x0120
(0213) if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //設(shè)置 (低位)器件讀地址
0119 2F04 MOV R16,R20
011A DFB8 RCALL _I2C_SendWrDAdr
011B 2300 TST R16
011C F411 BNE 0x011F
(0214) return I2C_ERR;
011D 2700 CLR R16
011E C001 RJMP 0x0120
(0215) return I2C_CRR;
011F E001 LDI R16,1
0120 940E0491 CALL pop_gset1
0122 9508 RET
(0216) }
(0217) /*--------------------------------------------------------------------
(0218) 函數(shù)名稱:I2C發(fā)送數(shù)據(jù)
(0219) 函數(shù)功能:
(0220) 注意事項:
(0221) 提示說明:
(0222) 輸 入:
(0223) 返 回:
(0224) --------------------------------------------------------------------*/
(0225) bool I2C_SendDat(uint8 configDat)
(0226) {
(0227) I2CSendByte(configDat);
_I2C_SendDat:
configDat --> R16
0123 B903 OUT 0x03,R16
0124 E884 LDI R24,0x84
0125 BF86 OUT 0x36,R24
(0228) I2CWaitAck();
0126 B626 IN R2,0x36
0127 FE27 SBRS R2,7
0128 CFFD RJMP 0x0126
(0229) if( I2CChkAck()!=I2C_MT_DATA_ACK )
0129 B181 IN R24,0x01
012A 7F88 ANDI R24,0xF8
012B 3288 CPI R24,0x28
012C F011 BEQ 0x012F
(0230) return I2C_ERR;
012D 2700 CLR R16
012E C001 RJMP 0x0130
(0231) return I2C_CRR;
012F E001 LDI R16,1
0130 9508 RET
(0232) }
(0233) /*--------------------------------------------------------------------
(0234) 函數(shù)名稱:I2C接收數(shù)據(jù)且不產(chǎn)生應(yīng)答
(0235) 函數(shù)功能:
(0236) 注意事項:
(0237) 提示說明:
(0238) 輸 入:
(0239) 返 回:
(0240) --------------------------------------------------------------------*/
(0241) bool I2C_RcvNAckDat(uint8 *pRdDat)
(0242) {
(0243) I2CRcvNckByte();
_I2C_RcvNAckDat:
pRdDat --> R16
0131 E884 LDI R24,0x84
0132 BF86 OUT 0x36,R24
(0244) I2CWaitAck();
0133 B626 IN R2,0x36
0134 FE27 SBRS R2,7
0135 CFFD RJMP 0x0133
(0245) if( I2CChkAck()!=I2C_MR_DATA_NACK )
0136 B181 IN R24,0x01
0137 7F88 ANDI R24,0xF8
0138 3588 CPI R24,0x58
0139 F011 BEQ 0x013C
(0246) return I2C_ERR;
013A 2700 CLR R16
013B C004 RJMP 0x0140
(0247) *pRdDat=TWDR;
013C B023 IN R2,0x03
013D 01F8 MOVW R30,R16
013E 8220 STD Z+0,R2
(0248) return I2C_CRR;
013F E001 LDI R16,1
0140 9508 RET
(0249) }
(0250) /*--------------------------------------------------------------------
(0251) 函數(shù)名稱:I2C接收數(shù)據(jù)且產(chǎn)生應(yīng)答
(0252) 函數(shù)功能:
(0253) 注意事項:
(0254) 提示說明:
(0255) 輸 入:
(0256) 返 回:
(0257) --------------------------------------------------------------------*/
(0258) bool I2C_RcvAckDat(uint8 *pRdDat)
(0259) {
(0260) I2CRcvAckByte();
_I2C_RcvAckDat:
pRdDat --> R16
0141 EC84 LDI R24,0xC4
0142 BF86 OUT 0x36,R24
(0261) I2CWaitAck();
0143 B626 IN R2,0x36
0144 FE27 SBRS R2,7
0145 CFFD RJMP 0x0143
(0262) if( I2CChkAck()!=I2C_MR_DATA_ACK )
0146 B181 IN R24,0x01
0147 7F88 ANDI R24,0xF8
0148 3580 CPI R24,0x50
0149 F011 BEQ 0x014C
(0263) return I2C_ERR;
014A 2700 CLR R16
014B C004 RJMP 0x0150
(0264) *pRdDat=TWDR;
014C B023 IN R2,0x03
014D 01F8 MOVW R30,R16
014E 8220 STD Z+0,R2
(0265) return I2C_CRR;
014F E001 LDI R16,1
0150 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
0151 940E048C CALL push_gset2
0153 2F42 MOV R20,R18
0154 01B8 MOVW R22,R16
(0266) }
(0267) /*--------------------------------------------------------------------
(0268) 函數(shù)名稱:I2C寫器件,寫一個數(shù)據(jù)
(0269) 函數(shù)功能:
(0270) 注意事項:
(0271) 提示說明:
(0272) 輸 入:wrDAdr: write device-address 寫器件地址
(0273) wordAdr: word address 字地址
(0274) dat: data 數(shù)據(jù)
(0275) 返 回:
(0276) --------------------------------------------------------------------*/
(0277) bool I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
(0278) {
(0279) if( I2C_Start()==I2C_ERR )
0155 DF63 RCALL _I2C_Start
0156 2300 TST R16
0157 F411 BNE 0x015A
(0280) return I2C_ERR;
0158 2700 CLR R16
0159 C015 RJMP 0x016F
(0281)
(0282) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
015A 018B MOVW R16,R22
015B DF85 RCALL _I2C_SendWrDAdr_
015C 2300 TST R16
015D F411 BNE 0x0160
(0283) return I2C_ERR;
015E 2700 CLR R16
015F C00F RJMP 0x016F
(0284)
(0285) if( I2C_SendDat(wordAdr)==I2C_ERR )
0160 2F04 MOV R16,R20
0161 DFC1 RCALL _I2C_SendDat
0162 2300 TST R16
0163 F411 BNE 0x0166
(0286) return I2C_ERR;
0164 2700 CLR R16
0165 C009 RJMP 0x016F
(0287)
(0288) if( I2C_SendDat(dat)==I2C_ERR )
0166 810C LDD R16,Y+4
0167 DFBB RCALL _I2C_SendDat
0168 2300 TST R16
0169 F411 BNE 0x016C
(0289) return I2C_ERR;
016A 2700 CLR R16
016B C003 RJMP 0x016F
(0290)
(0291) I2C_Stop();
016C E984 LDI R24,0x94
016D BF86 OUT 0x36,R24
(0292)
(0293) return I2C_CRR;
016E E001 LDI R16,1
016F 940E047A CALL pop_gset2
0171 9508 RET
_I2C_Read:
pRdDat --> Y+6
rdDAdr --> Y+4
wordAdr --> R20
wrDAdr --> R22
0172 940E048C CALL push_gset2
0174 2F42 MOV R20,R18
0175 01B8 MOVW R22,R16
(0294) }
(0295) /*--------------------------------------------------------------------
(0296) 函數(shù)名稱:I2C寫器件,寫N個數(shù)據(jù)
(0297) 函數(shù)功能:
(0298) 注意事項:
(0299) 提示說明:
(0300) 輸 入:wrDAdr: write device-address 寫器件地址
(0301) wordAdr: word address 字地址
(0302) *pWrDat: p->write data 寫入數(shù)據(jù)指針
(0303) num: number 寫入數(shù)據(jù)個數(shù)
(0304) 返 回:
(0305) --------------------------------------------------------------------*/
(0306) //bool I2C_Write_(uint16 wrDAdr,uint8 wordAdr,
(0307) // uint8 *pWrDat,uint8 num)
(0308) //{
(0309) //
(0310) //}
(0311) /*--------------------------------------------------------------------
(0312) 函數(shù)名稱:I2C讀器件,讀一個數(shù)據(jù)
(0313) 函數(shù)功能:
(0314) 注意事項:
(0315) 提示說明:
(0316) 輸 入:wrDAdr: write device-address 寫器件地址
(0317) wordAdr: word address 字地址
(0318) rdDAdr: read device-address 讀器件地址
(0319) *pRdDat: p->read data 讀取數(shù)據(jù)指針
(0320) 返 回:
(0321) --------------------------------------------------------------------*/
(0322) bool I2C_Read(uint16 wrDAdr,uint8 wordAdr,
(0323) uint8 rdDAdr,uint8 *pRdDat)
(0324) {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -