📄 ac15-3.lst
字号:
(0184) Twi();
0144 E884 LDI R24,0x84
0145 BF86 OUT 0x36,R24
(0185) Wait();
0146 B626 IN R2,0x36
0147 FE27 SBRS R2,7
0148 CFFD RJMP 0x0146
(0186) if(TestAck()!=MR_DATA_NOACK) return 0;
0149 B181 IN R24,0x01
014A 7F88 ANDI R24,0xF8
014B 3588 CPI R24,0x58
014C F011 BEQ 0x014F
014D 2700 CLR R16
014E C004 RJMP 0x0153
(0187) temp=TWDR;
014F B143 IN R20,0x03
(0188) Stop();
0150 E984 LDI R24,0x94
0151 BF86 OUT 0x36,R24
(0189) return temp;
0152 2F04 MOV R16,R20
0153 940E029F CALL pop_gset1
0155 9508 RET
_i2c_Write:
Wdata --> R20
RomAddress --> R22
0156 940E029A CALL push_gset2
0158 2F42 MOV R20,R18
0159 2F60 MOV R22,R16
(0190) }
(0191)
(0192) /******************************************
(0193) I2C总线写一个字节
(0194) 返回0:写成功
(0195) 返回非0:写失败
(0196) *******************************************/
(0197) unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
(0198) {
(0199) Start();
015A EA84 LDI R24,0xA4
015B BF86 OUT 0x36,R24
(0200) Wait();
015C B626 IN R2,0x36
015D FE27 SBRS R2,7
015E CFFD RJMP 0x015C
(0201) if(TestAck()!=START) return 1;
015F B181 IN R24,0x01
0160 7F88 ANDI R24,0xF8
0161 3088 CPI R24,0x8
0162 F011 BEQ 0x0165
0163 E001 LDI R16,1
0164 C02B RJMP 0x0190
(0202) Write8Bit(wr_device_add);
0165 EA80 LDI R24,0xA0
0166 B983 OUT 0x03,R24
0167 E884 LDI R24,0x84
0168 BF86 OUT 0x36,R24
(0203) Wait();
0169 B626 IN R2,0x36
016A FE27 SBRS R2,7
016B CFFD RJMP 0x0169
(0204) if(TestAck()!=MT_SLA_ACK) return 1;
016C B181 IN R24,0x01
016D 7F88 ANDI R24,0xF8
016E 3188 CPI R24,0x18
016F F011 BEQ 0x0172
0170 E001 LDI R16,1
0171 C01E RJMP 0x0190
(0205) Write8Bit(RomAddress);
0172 B963 OUT 0x03,R22
0173 E884 LDI R24,0x84
0174 BF86 OUT 0x36,R24
(0206) Wait();
0175 B626 IN R2,0x36
0176 FE27 SBRS R2,7
0177 CFFD RJMP 0x0175
(0207) if(TestAck()!=MT_DATA_ACK) return 1;
0178 B181 IN R24,0x01
0179 7F88 ANDI R24,0xF8
017A 3288 CPI R24,0x28
017B F011 BEQ 0x017E
017C E001 LDI R16,1
017D C012 RJMP 0x0190
(0208) Write8Bit(Wdata);
017E B943 OUT 0x03,R20
017F E884 LDI R24,0x84
0180 BF86 OUT 0x36,R24
(0209) Wait();
0181 B626 IN R2,0x36
0182 FE27 SBRS R2,7
0183 CFFD RJMP 0x0181
(0210) if(TestAck()!=MT_DATA_ACK) return 1;
0184 B181 IN R24,0x01
0185 7F88 ANDI R24,0xF8
0186 3288 CPI R24,0x28
0187 F011 BEQ 0x018A
0188 E001 LDI R16,1
0189 C006 RJMP 0x0190
(0211) Stop();
018A E984 LDI R24,0x94
018B BF86 OUT 0x36,R24
(0212) delay_ms(10);
018C E00A LDI R16,0xA
018D E010 LDI R17,0
018E D0CD RCALL _delay_ms
(0213) return 0;
018F 2700 CLR R16
0190 940E028B CALL pop_gset2
0192 9508 RET
_main:
key_val --> R10
rd_val --> R22
wr_val --> R20
0193 9722 SBIW R28,2
(0214) }
(0215)
(0216) //******************************************
(0217) void main(void)
(0218) {
(0219) uchar key_val,wr_val=0,rd_val=0;
0194 2744 CLR R20
0195 2766 CLR R22
(0220) port_init();
0196 DF60 RCALL _port_init
(0221) delay_ms(400);
0197 E900 LDI R16,0x90
0198 E011 LDI R17,1
0199 D0C2 RCALL _delay_ms
(0222) InitLcd();
019A DF04 RCALL _InitLcd
(0223) LcdWriteCommand(0x01,1);
019B E021 LDI R18,1
019C E001 LDI R16,1
019D DF23 RCALL _LcdWriteCommand
(0224) LcdWriteCommand(0x0c,1);
019E E021 LDI R18,1
019F E00C LDI R16,0xC
01A0 DF20 RCALL _LcdWriteCommand
(0225) ePutstr(0,0,str0);
01A1 E584 LDI R24,0x54
01A2 E090 LDI R25,0
01A3 8399 STD Y+1,R25
01A4 8388 STD Y+0,R24
01A5 2722 CLR R18
01A6 2700 CLR R16
01A7 DEAC RCALL _ePutstr
(0226) delay_ms(10);
01A8 E00A LDI R16,0xA
01A9 E010 LDI R17,0
01AA D0B1 RCALL _delay_ms
(0227) ePutstr(0,1,str1);
01AB E58D LDI R24,0x5D
01AC E090 LDI R25,0
01AD 8399 STD Y+1,R25
01AE 8388 STD Y+0,R24
01AF E021 LDI R18,1
01B0 2700 CLR R16
01B1 DEA2 RCALL _ePutstr
(0228) delay_ms(10);
01B2 E00A LDI R16,0xA
01B3 E010 LDI R17,0
01B4 D0A7 RCALL _delay_ms
01B5 C0A3 RJMP 0x0259
(0229) /********************************************/
(0230) while(1)
(0231) {
(0232) DisplayOneChar(9,0,wr_val/100+0x30);
01B6 E614 LDI R17,0x64
01B7 2F04 MOV R16,R20
01B8 940E0275 CALL div8u
01BA 2F80 MOV R24,R16
01BB 5D80 SUBI R24,0xD0
01BC 8388 STD Y+0,R24
01BD 2722 CLR R18
01BE E009 LDI R16,0x9
01BF DED3 RCALL _DisplayOneChar
(0233) delay_ms(10);
01C0 E00A LDI R16,0xA
01C1 E010 LDI R17,0
01C2 D099 RCALL _delay_ms
(0234) DisplayOneChar(10,0,(wr_val/10)%10+0x30);
01C3 E01A LDI R17,0xA
01C4 2F04 MOV R16,R20
01C5 940E0275 CALL div8u
01C7 E01A LDI R17,0xA
01C8 940E0273 CALL mod8u
01CA 2F80 MOV R24,R16
01CB 5D80 SUBI R24,0xD0
01CC 8388 STD Y+0,R24
01CD 2722 CLR R18
01CE E00A LDI R16,0xA
01CF DEC3 RCALL _DisplayOneChar
(0235) delay_ms(10);
01D0 E00A LDI R16,0xA
01D1 E010 LDI R17,0
01D2 D089 RCALL _delay_ms
(0236) DisplayOneChar(11,0,wr_val%10+0x30);
01D3 E01A LDI R17,0xA
01D4 2F04 MOV R16,R20
01D5 940E0273 CALL mod8u
01D7 2F80 MOV R24,R16
01D8 5D80 SUBI R24,0xD0
01D9 8388 STD Y+0,R24
01DA 2722 CLR R18
01DB E00B LDI R16,0xB
01DC DEB6 RCALL _DisplayOneChar
(0237) delay_ms(10);
01DD E00A LDI R16,0xA
01DE E010 LDI R17,0
01DF D07C RCALL _delay_ms
(0238)
(0239) DisplayOneChar(8,1,rd_val/100+0x30);
01E0 E614 LDI R17,0x64
01E1 2F06 MOV R16,R22
01E2 940E0275 CALL div8u
01E4 2F80 MOV R24,R16
01E5 5D80 SUBI R24,0xD0
01E6 8388 STD Y+0,R24
01E7 E021 LDI R18,1
01E8 E008 LDI R16,0x8
01E9 DEA9 RCALL _DisplayOneChar
(0240) delay_ms(10);
01EA E00A LDI R16,0xA
01EB E010 LDI R17,0
01EC D06F RCALL _delay_ms
(0241) DisplayOneChar(9,1,(rd_val/10%10)+0x30);
01ED E01A LDI R17,0xA
01EE 2F06 MOV R16,R22
01EF 940E0275 CALL div8u
01F1 E01A LDI R17,0xA
01F2 940E0273 CALL mod8u
01F4 2F80 MOV R24,R16
01F5 5D80 SUBI R24,0xD0
01F6 8388 STD Y+0,R24
01F7 E021 LDI R18,1
01F8 E009 LDI R16,0x9
01F9 DE99 RCALL _DisplayOneChar
(0242) delay_ms(10);
01FA E00A LDI R16,0xA
01FB E010 LDI R17,0
01FC D05F RCALL _delay_ms
(0243) DisplayOneChar(10,1,rd_val%10+0x30);
01FD E01A LDI R17,0xA
01FE 2F06 MOV R16,R22
01FF 940E0273 CALL mod8u
0201 2F80 MOV R24,R16
0202 5D80 SUBI R24,0xD0
0203 8388 STD Y+0,R24
0204 E021 LDI R18,1
0205 E00A LDI R16,0xA
0206 DE8C RCALL _DisplayOneChar
(0244) delay_ms(10);
0207 E00A LDI R16,0xA
0208 E010 LDI R17,0
0209 D052 RCALL _delay_ms
(0245)
(0246) key_val=scan_key();
020A DEF9 RCALL _scan_key
020B 2EA0 MOV R10,R16
(0247) switch(key_val)
020C 2CCA MOV R12,R10
020D 24DD CLR R13
020E 01C6 MOVW R24,R12
020F 3B8F CPI R24,0xBF
0210 E0E0 LDI R30,0
0211 079E CPC R25,R30
0212 F111 BEQ 0x0235
0213 EB8F LDI R24,0xBF
0214 158C CP R24,R12
0215 059D CPC R25,R13
0216 F034 BLT 0x021D
0217 01C6 MOVW R24,R12
0218 378F CPI R24,0x7F
0219 E0E0 LDI R30,0
021A 079E CPC R25,R30
021B F111 BEQ 0x023E
021C C029 RJMP 0x0246
021D 01C6 MOVW R24,R12
021E 3D8F CPI R24,0xDF
021F E0E0 LDI R30,0
0220 079E CPC R25,R30
0221 F071 BEQ 0x0230
0222 3D8F CPI R24,0xDF
0223 E0E0 LDI R30,0
0224 079E CPC R25,R30
0225 F104 BLT 0x0246
0226 01C6 MOVW R24,R12
0227 3E8F CPI R24,0xEF
0228 E0E0 LDI R30,0
0229 079E CPC R25,R30
022A F009 BEQ 0x022C
022B C01A RJMP 0x0246
(0248) {
(0249) case 0xef:if(wr_val<255)wr_val++;break;
022C 3F4F CPI R20,0xFF
022D F4C0 BCC 0x0246
022E 9543 INC R20
022F C016 RJMP 0x0246
(0250) case 0xdf:if(wr_val>0)wr_val--;break;
0230 2422 CLR R2
0231 1624 CP R2,R20
0232 F498 BCC 0x0246
0233 954A DEC R20
0234 C011 RJMP 0x0246
(0251) case 0xbf:i2c_Write(10,wr_val);
0235 2F24 MOV R18,R20
0236 E00A LDI R16,0xA
0237 DF1E RCALL _i2c_Write
(0252) DisplayOneChar(15,0,0xef);break;
0238 EE8F LDI R24,0xEF
0239 8388 STD Y+0,R24
023A 2722 CLR R18
023B E00F LDI R16,0xF
023C DE56 RCALL _DisplayOneChar
023D C008 RJMP 0x0246
(0253) case 0x7f:rd_val=i2c_Read(10);
023E E00A LDI R16,0xA
023F DEC6 RCALL _i2c_Read
0240 2F60 MOV R22,R16
(0254) DisplayOneChar(15,1,0xef);break;
0241 EE8F LDI R24,0xEF
0242 8388 STD Y+0,R24
0243 E021 LDI R18,1
0244 E00F LDI R16,0xF
0245 DE4D RCALL _DisplayOneChar
(0255) default:break;
(0256) }
(0257) delay_ms(200);
0246 EC08 LDI R16,0xC8
0247 E010 LDI R17,0
0248 D013 RCALL _delay_ms
(0258) DisplayOneChar(15,0,0x20);delay_ms(10);
0249 E280 LDI R24,0x20
024A 8388 STD Y+0,R24
024B 2722 CLR R18
024C E00F LDI R16,0xF
024D DE45 RCALL _DisplayOneChar
024E E00A LDI R16,0xA
024F E010 LDI R17,0
0250 D00B RCALL _delay_ms
(0259) DisplayOneChar(15,1,0x20);delay_ms(10);
0251 E280 LDI R24,0x20
0252 8388 STD Y+0,R24
0253 E021 LDI R18,1
0254 E00F LDI R16,0xF
0255 DE3D RCALL _DisplayOneChar
0256 E00A LDI R16,0xA
0257 E010 LDI R17,0
0258 D003 RCALL _delay_ms
0259 CF5C RJMP 0x01B6
025A 9622 ADIW R28,2
025B 9508 RET
_delay_ms:
time --> R20
025C 940E029C CALL push_gset1
025E 01A8 MOVW R20,R16
(0260)
(0261) }
(0262)
(0263) }
(0264)
(0265) /*********************延时time*1ms子函数*********************/
(0266) void delay_ms(unsigned int time)
(0267) {
025F C005 RJMP 0x0265
(0268) while(time!=0)
(0269) {
(0270) delay_us(1000);
0260 EE08 LDI R16,0xE8
0261 E013 LDI R17,3
0262 D008 RCALL _delay_us
(0271) time--;
0263 5041 SUBI R20,1
0264 4050 SBCI R21,0
0265 3040 CPI R20,0
0266 0745 CPC R20,R21
0267 F7C1 BNE 0x0260
0268 940E029F CALL pop_gset1
026A 9508 RET
(0272) }
(0273) }
(0274)
(0275) /********************延时子函数*********************/
(0276) void delay_us(int time)
(0277) {
(0278) do
(0279) {
(0280) time--;
_delay_us:
time --> R16
026B 5001 SUBI R16,1
026C 4010 SBCI R17,0
(0281) }
(0282) while (time>1);
FILE: <library>
026D E081 LDI R24,1
026E E090 LDI R25,0
026F 1780 CP R24,R16
0270 0791 CPC R25,R17
0271 F3CC BLT 0x026B
0272 9508 RET
mod8u:
0273 9468 BSET 6
0274 C001 RJMP xdiv8u
div8u:
0275 94E8 BCLR 6
xdiv8u:
0276 932A ST R18,-Y
0277 92FA ST R15,-Y
0278 92EA ST R14,-Y
0279 24FF CLR R15
027A 24EE CLR R14
027B E120 LDI R18,0x10
027C 0F00 LSL R16
027D 1CFF ROL R15
027E 1CEE ROL R14
027F 16E1 CP R14,R17
0280 F010 BCS 0x0283
0281 1AE1 SUB R14,R17
0282 9503 INC R16
0283 952A DEC R18
0284 F7B9 BNE 0x027C
0285 F40E BRTC 0x0287
0286 2D0E MOV R16,R14
0287 90E9 LD R14,Y+
0288 90F9 LD R15,Y+
0289 9129 LD R18,Y+
028A 9508 RET
pop_gset2:
028B E0E2 LDI R30,2
028C 940C02A0 JMP pop
pop_gset3:
028E E0E4 LDI R30,4
028F 940C02A0 JMP pop
pop_gset5:
0291 27EE CLR R30
0292 940C02A0 JMP pop
push_gset5:
0294 92FA ST R15,-Y
0295 92EA ST R14,-Y
push_gset4:
0296 92DA ST R13,-Y
0297 92CA ST R12,-Y
push_gset3:
0298 92BA ST R11,-Y
0299 92AA ST R10,-Y
push_gset2:
029A 937A ST R23,-Y
029B 936A ST R22,-Y
push_gset1:
029C 935A ST R21,-Y
029D 934A ST R20,-Y
029E 9508 RET
pop_gset1:
029F E0E1 LDI R30,1
pop:
02A0 9149 LD R20,Y+
02A1 9159 LD R21,Y+
02A2 FDE0 SBRC R30,0
02A3 9508 RET
02A4 9169 LD R22,Y+
02A5 9179 LD R23,Y+
02A6 FDE1 SBRC R30,1
02A7 9508 RET
02A8 90A9 LD R10,Y+
02A9 90B9 LD R11,Y+
02AA FDE2 SBRC R30,2
02AB 9508 RET
02AC 90C9 LD R12,Y+
02AD 90D9 LD R13,Y+
02AE FDE3 SBRC R30,3
02AF 9508 RET
02B0 90E9 LD R14,Y+
02B1 90F9 LD R15,Y+
02B2 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -