📄 icc_gmj.lst
字号:
__text_start:
__start:
0144 E5CF LDI R28,0x5F
0145 E0D4 LDI R29,4
0146 BFCD OUT 0x3D,R28
0147 BFDE OUT 0x3E,R29
0148 51C0 SUBI R28,0x10
0149 40D0 SBCI R29,0
014A EA0A LDI R16,0xAA
014B 8308 STD Y+0,R16
014C 2400 CLR R0
014D EDEC LDI R30,0xDC
014E E0F0 LDI R31,0
014F E011 LDI R17,1
0150 32EC CPI R30,0x2C
0151 07F1 CPC R31,R17
0152 F011 BEQ 0x0155
0153 9201 ST R0,Z+
0154 CFFB RJMP 0x0150
0155 8300 STD Z+0,R16
0156 E0EB LDI R30,0xB
0157 E0F2 LDI R31,2
0158 E6A0 LDI R26,0x60
0159 E0B0 LDI R27,0
015A E012 LDI R17,2
015B 38E7 CPI R30,0x87
015C 07F1 CPC R31,R17
015D F021 BEQ 0x0162
015E 95C8 LPM
015F 9631 ADIW R30,1
0160 920D ST R0,X+
0161 CFF9 RJMP 0x015B
0162 940E0A55 CALL _main
_exit:
0164 CFFF RJMP _exit
_ISendStr:
i --> R20
no --> R22
s --> R10
suba --> R18
sla --> R16
0165 940E0FB7 CALL push_gset3
0167 80AE LDD R10,Y+6
0168 80BF LDD R11,Y+7
0169 8568 LDD R22,Y+8
FILE: C:\icc\include\h_iic.c
(0001) #include <iom16v.h>
(0002) //TWI状态定义
(0003) //MT 主方式传输 MR 主方式接收
(0004) #define START 0x08
(0005) #define RE_START 0x10
(0006) #define MT_SLA_ACK 0x18
(0007) #define MT_SLA_NOACK 0x20
(0008) #define MT_DATA_ACK 0x28
(0009) #define MT_DATA_NOACK 0x30
(0010) #define MR_SLA_ACK 0x40
(0011) #define MR_SLA_NOACK 0x48
(0012) #define MR_DATA_ACK 0x50
(0013) #define MR_DATA_NOACK 0x58
(0014) //hardware IIC
(0015) #define TWINT 7
(0016) #define TWEA 6
(0017) #define TWSTA 5
(0018) #define TWSTO 4
(0019) #define TWEN 2
(0020)
(0021) //常用TWI操作(主模式写和主模式读)
(0022) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0023) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0024) #define Wait() {while(!(TWCR&(1<<TWINT)));}
(0025) #define TestAck() (TWSR&0xf8)
(0026) #define SetAck() (TWCR|=(1<<TWEA))
(0027) #define SetNoAck() (TWCR&=~(1<<TWEA))
(0028) #define TWI() (TWCR=(1<<TWINT)|(1<<TWEN))
(0029) #define TWE() (TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN))
(0030) #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
(0031)
(0032) #define zlg7290 0x70
(0033)
(0034) /******************************************
(0035) I2C总线写字符串
(0036) 返回0:写成功
(0037) 返回非0:写失败
(0038) *******************************************/
(0039)
(0040) unsigned char ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
(0041) { unsigned char i;
(0042) //CLI();
(0043) Start();//I2C启动
016A EA84 LDI R24,0xA4
016B BF86 OUT 0x36,R24
(0044) Wait();
016C B626 IN R2,0x36
016D FE27 SBRS R2,7
016E CFFD RJMP 0x016C
(0045) if(TestAck()!=START){Stop(); return 1;} //ACK
016F B181 IN R24,0x01
0170 7F88 ANDI R24,0xF8
0171 3088 CPI R24,0x8
0172 F021 BEQ 0x0177
0173 E984 LDI R24,0x94
0174 BF86 OUT 0x36,R24
0175 E001 LDI R16,1
0176 C037 RJMP 0x01AE
(0046) Write8Bit(sla);//写I2C从器件地址和写方式
0177 B903 OUT 0x03,R16
0178 E884 LDI R24,0x84
0179 BF86 OUT 0x36,R24
(0047) Wait();
017A B626 IN R2,0x36
017B FE27 SBRS R2,7
017C CFFD RJMP 0x017A
(0048) if(TestAck()!=MT_SLA_ACK){Stop(); return 1;} //ACK
017D B181 IN R24,0x01
017E 7F88 ANDI R24,0xF8
017F 3188 CPI R24,0x18
0180 F021 BEQ 0x0185
0181 E984 LDI R24,0x94
0182 BF86 OUT 0x36,R24
0183 E001 LDI R16,1
0184 C029 RJMP 0x01AE
(0049) Write8Bit(suba);//写地址
0185 B923 OUT 0x03,R18
0186 E884 LDI R24,0x84
0187 BF86 OUT 0x36,R24
(0050) for(i=0;i<no;i++)
0188 2744 CLR R20
0189 C014 RJMP 0x019E
(0051) { Wait();
018A B626 IN R2,0x36
018B FE27 SBRS R2,7
018C CFFD RJMP 0x018A
(0052) if(TestAck()!=MT_DATA_ACK){Stop(); return 1;}//ACK
018D B181 IN R24,0x01
018E 7F88 ANDI R24,0xF8
018F 3288 CPI R24,0x28
0190 F021 BEQ 0x0195
0191 E984 LDI R24,0x94
0192 BF86 OUT 0x36,R24
0193 E001 LDI R16,1
0194 C019 RJMP 0x01AE
(0053) Write8Bit(*s);//写数据
0195 01F5 MOVW R30,R10
0196 8020 LDD R2,Z+0
0197 B823 OUT 0x03,R2
0198 E884 LDI R24,0x84
0199 BF86 OUT 0x36,R24
(0054) s++;
019A 01CF MOVW R24,R30
019B 9601 ADIW R24,1
019C 015C MOVW R10,R24
019D 9543 INC R20
019E 1746 CP R20,R22
019F F350 BCS 0x018A
(0055) }
(0056) Wait();
01A0 B626 IN R2,0x36
01A1 FE27 SBRS R2,7
01A2 CFFD RJMP 0x01A0
(0057) if(TestAck()!=MT_DATA_ACK){Stop(); return 1;} //ACK
01A3 B181 IN R24,0x01
01A4 7F88 ANDI R24,0xF8
01A5 3288 CPI R24,0x28
01A6 F021 BEQ 0x01AB
01A7 E984 LDI R24,0x94
01A8 BF86 OUT 0x36,R24
01A9 E001 LDI R16,1
01AA C003 RJMP 0x01AE
(0058) Stop();//I2C停止
01AB E984 LDI R24,0x94
01AC BF86 OUT 0x36,R24
(0059) // asm("sei");
(0060) return 0;
01AD 2700 CLR R16
01AE 940E0FAA CALL pop_gset3
01B0 9508 RET
_IRcvStr:
i --> R22
no --> R10
s --> R20
suba --> R18
sla --> R16
01B1 940E0FB7 CALL push_gset3
01B3 814E LDD R20,Y+6
01B4 815F LDD R21,Y+7
01B5 84A8 LDD R10,Y+8
(0061) }
(0062)
(0063) /******************************************
(0064) I2C总线读字符串
(0065) 如果读失败也返回0,正确返回1;
(0066) *******************************************/
(0067) unsigned char IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
(0068) {
(0069) unsigned char i;
(0070) //asm("cli");
(0071) Start();//I2C启动
01B6 EA84 LDI R24,0xA4
01B7 BF86 OUT 0x36,R24
(0072) Wait();
01B8 B626 IN R2,0x36
01B9 FE27 SBRS R2,7
01BA CFFD RJMP 0x01B8
(0073) if (TestAck()!=START) {Stop(); return 0;}//ACK
01BB B181 IN R24,0x01
01BC 7F88 ANDI R24,0xF8
01BD 3088 CPI R24,0x8
01BE F021 BEQ 0x01C3
01BF E984 LDI R24,0x94
01C0 BF86 OUT 0x36,R24
01C1 2700 CLR R16
01C2 C065 RJMP 0x0228
(0074) Write8Bit(sla);//写I2C从器件地址和写方式
01C3 B903 OUT 0x03,R16
01C4 E884 LDI R24,0x84
01C5 BF86 OUT 0x36,R24
(0075) Wait();
01C6 B626 IN R2,0x36
01C7 FE27 SBRS R2,7
01C8 CFFD RJMP 0x01C6
(0076) if (TestAck()!=MT_SLA_ACK) {Stop(); return 0;}//ACK
01C9 B181 IN R24,0x01
01CA 7F88 ANDI R24,0xF8
01CB 3188 CPI R24,0x18
01CC F021 BEQ 0x01D1
01CD E984 LDI R24,0x94
01CE BF86 OUT 0x36,R24
01CF 2700 CLR R16
01D0 C057 RJMP 0x0228
(0077) Write8Bit(suba);//写地址
01D1 B923 OUT 0x03,R18
01D2 E884 LDI R24,0x84
01D3 BF86 OUT 0x36,R24
(0078) Wait();
01D4 B626 IN R2,0x36
01D5 FE27 SBRS R2,7
01D6 CFFD RJMP 0x01D4
(0079) if (TestAck()!=MT_DATA_ACK) {Stop(); return 0;}
01D7 B181 IN R24,0x01
01D8 7F88 ANDI R24,0xF8
01D9 3288 CPI R24,0x28
01DA F021 BEQ 0x01DF
01DB E984 LDI R24,0x94
01DC BF86 OUT 0x36,R24
01DD 2700 CLR R16
01DE C049 RJMP 0x0228
(0080) Start();//I2C重新启动
01DF EA84 LDI R24,0xA4
01E0 BF86 OUT 0x36,R24
(0081) Wait();
01E1 B626 IN R2,0x36
01E2 FE27 SBRS R2,7
01E3 CFFD RJMP 0x01E1
(0082) if (TestAck()!=RE_START) {Stop(); return 0;}
01E4 B181 IN R24,0x01
01E5 7F88 ANDI R24,0xF8
01E6 3180 CPI R24,0x10
01E7 F021 BEQ 0x01EC
01E8 E984 LDI R24,0x94
01E9 BF86 OUT 0x36,R24
01EA 2700 CLR R16
01EB C03C RJMP 0x0228
(0083) Write8Bit(sla+1);//写I2C从器件地址和读方式
01EC 2F80 MOV R24,R16
01ED 5F8F SUBI R24,0xFF
01EE B983 OUT 0x03,R24
01EF E884 LDI R24,0x84
01F0 BF86 OUT 0x36,R24
(0084) Wait();
01F1 B626 IN R2,0x36
01F2 FE27 SBRS R2,7
01F3 CFFD RJMP 0x01F1
(0085) if(TestAck()!=MR_SLA_ACK) {Stop(); return 0;}//ACK
01F4 B181 IN R24,0x01
01F5 7F88 ANDI R24,0xF8
01F6 3480 CPI R24,0x40
01F7 F021 BEQ 0x01FC
01F8 E984 LDI R24,0x94
01F9 BF86 OUT 0x36,R24
01FA 2700 CLR R16
01FB C02C RJMP 0x0228
(0086) for(i=0;i<no-1;i++)
01FC 2766 CLR R22
01FD C013 RJMP 0x0211
(0087) { TWE();//启动主I2C读方式
01FE EC84 LDI R24,0xC4
01FF BF86 OUT 0x36,R24
(0088) Wait();
0200 B626 IN R2,0x36
0201 FE27 SBRS R2,7
0202 CFFD RJMP 0x0200
(0089) if(TestAck()!=MR_DATA_ACK) {Stop(); return 0;};//ACK
0203 B181 IN R24,0x01
0204 7F88 ANDI R24,0xF8
0205 3580 CPI R24,0x50
0206 F021 BEQ 0x020B
0207 E984 LDI R24,0x94
0208 BF86 OUT 0x36,R24
0209 2700 CLR R16
020A C01D RJMP 0x0228
(0090) *s=TWDR;//读取I2C接收数据
020B B023 IN R2,0x03
020C 01FA MOVW R30,R20
020D 8220 STD Z+0,R2
(0091) s++;
020E 5F4F SUBI R20,0xFF
020F 4F5F SBCI R21,0xFF
0210 9563 INC R22
0211 2D8A MOV R24,R10
0212 5081 SUBI R24,1
0213 1768 CP R22,R24
0214 F348 BCS 0x01FE
(0092) }
(0093) TWI();//启动主I2C读方式
0215 E884 LDI R24,0x84
0216 BF86 OUT 0x36,R24
(0094) Wait();
0217 B626 IN R2,0x36
0218 FE27 SBRS R2,7
0219 CFFD RJMP 0x0217
(0095) if(TestAck()!=MR_DATA_NOACK) {Stop(); return 0;}//ACK
021A B181 IN R24,0x01
021B 7F88 ANDI R24,0xF8
021C 3588 CPI R24,0x58
021D F021 BEQ 0x0222
021E E984 LDI R24,0x94
021F BF86 OUT 0x36,R24
0220 2700 CLR R16
0221 C006 RJMP 0x0228
(0096) *s=TWDR;//读取I2C接收数据
0222 B023 IN R2,0x03
0223 01FA MOVW R30,R20
0224 8220 STD Z+0,R2
(0097) Stop();//I2C停止
0225 E984 LDI R24,0x94
0226 BF86 OUT 0x36,R24
(0098) // asm("sei");
(0099) return 1;
0227 E001 LDI R16,1
0228 940E0FAA CALL pop_gset3
022A 9508 RET
_ZLG7290_SendData:
Data --> Y+5
SubAdd --> R20
022B 933A ST R19,-Y
022C 932A ST R18,-Y
022D 940E0FBB CALL push_gset1
022F 2F40 MOV R20,R16
0230 9723 SBIW R28,3
(0100) }
(0101) unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
(0102) {
(0103) if(SubAdd>0x17)
0231 E187 LDI R24,0x17
0232 1784 CP R24,R20
0233 F410 BCC 0x0236
(0104) return 0;
0234 2700 CLR R16
0235 C00A RJMP 0x0240
(0105) ISendStr(zlg7290,SubAdd,&Data,1);
0236 E081 LDI R24,1
0237 838A STD Y+2,R24
0238 01CE MOVW R24,R28
0239 9605 ADIW R24,5
023A 8399 STD Y+1,R25
023B 8388 STD Y+0,R24
023C 2F24 MOV R18,R20
023D E700 LDI R16,0x70
023E DF26 RCALL _ISendStr
(0106) // delay_ms(10);
(0107) return 1;
023F E001 LDI R16,1
0240 9623 ADIW R28,3
0241 940E0FBE CALL pop_gset1
0243 9622 ADIW R28,2
0244 9508 RET
_ZLG7290_SendCmd:
Data --> Y+3
Data2 --> R20
Data1 --> R22
0245 940E0FB9 CALL push_gset2
0247 2F42 MOV R20,R18
0248 2F60 MOV R22,R16
0249 9725 SBIW R28,5
(0108) }
(0109) //向zlg7290命令缓冲区发送命令(2个字节)
(0110) unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
(0111) {
(0112) unsigned char Data[2];
(0113) Data[0]=Data1;
024A 836B STD Y+3,R22
(0114) Data[1]=Data2;
024B 834C STD Y+4,R20
(0115) ISendStr(zlg7290,0x07,Data,2);
024C E082 LDI R24,2
024D 838A STD Y+2,R24
024E 01CE MOVW R24,R28
024F 9603 ADIW R24,3
0250 8399 STD Y+1,R25
0251 8388 STD Y+0,R24
0252 E027 LDI R18,7
0253 E700 LDI R16,0x70
0254 DF10 RCALL _ISendStr
(0116) // delay_ms(10);
(0117) return 1;
0255 E001 LDI R16,1
0256 9625 ADIW R28,5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -