📄 8880.lst
字号:
393 B382 IN R24,0x12
394 748F ANDI R24,0x4F
395 BB82 OUT 0x12,R24
(0021) M8880_DataPort|=(c&0xf); //Write Data
396 2F80 MOV R24,R16
397 708F ANDI R24,0xF
398 B225 IN R2,0x15
399 2A28 OR R2,R24
39A BA25 OUT 0x15,R2
(0022) M8880_CtrlPort&=~M8880_CLK; //CLR CLK
39B 9896 CBI 0x12,6
(0023) NOP(); //wait a few time
39C 0000 NOP
(0024) NOP();
39D 0000 NOP
(0025) M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS; //set CS RW CLK RS
39E B382 IN R24,0x12
39F 6F80 ORI R24,0xF0
3A0 BB82 OUT 0x12,R24
3A1 9508 RET
(0026) }
(0027) char M8880_ReadChar()
(0028) {
(0029) char c;
(0030) M8880_DataDDR&=0xf0; //set direction to input
_M8880_ReadChar:
c --> R16
3A2 B384 IN R24,0x14
3A3 7F80 ANDI R24,0xF0
3A4 BB84 OUT 0x14,R24
(0031) M8880_CtrlPort&=~(M8880_CS|M8880_RS); //CLR CS RS hold RW CLK
3A5 B382 IN R24,0x12
3A6 758F ANDI R24,0x5F
3A7 BB82 OUT 0x12,R24
(0032) M8880_CtrlPort&=~M8880_CLK; //CLR CLK
3A8 9896 CBI 0x12,6
(0033) NOP(); //waite a few time
3A9 0000 NOP
(0034) NOP();
3AA 0000 NOP
(0035) c=M8880_DataPIN&0xf; //ReadData
3AB B303 IN R16,0x13
3AC 700F ANDI R16,0xF
(0036) M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS; //set CS RW CLK RS
3AD B382 IN R24,0x12
3AE 6F80 ORI R24,0xF0
3AF BB82 OUT 0x12,R24
(0037) M8880_DataDDR|=0X0F; //restore direction
3B0 B384 IN R24,0x14
3B1 608F ORI R24,0xF
3B2 BB84 OUT 0x14,R24
(0038) return c;
3B3 9508 RET
(0039) }
(0040) void M8880_WriteCtrl(char c,char flag)
(0041) {
(0042) M8880_DataPort&=0xf0; //clear low 4bit
_M8880_WriteCtrl:
flag --> R18
c --> R16
3B4 B385 IN R24,0x15
3B5 7F80 ANDI R24,0xF0
3B6 BB85 OUT 0x15,R24
(0043) M8880_CtrlPort&=~(M8880_CS|M8880_RW); //CLR CS RW HOLD RS CLK
3B7 B382 IN R24,0x12
3B8 7C8F ANDI R24,0xCF
3B9 BB82 OUT 0x12,R24
(0044) if (flag) //if we need to write CRB
3BA 2322 TST R18
3BB F039 BEQ 0x03C3
(0045) M8880_DataPort|=((c&0xf)|M8880_BIT3); //so we need to set bit3
3BC 2F80 MOV R24,R16
3BD 708F ANDI R24,0xF
3BE 6088 ORI R24,0x8
3BF B225 IN R2,0x15
3C0 2A28 OR R2,R24
3C1 BA25 OUT 0x15,R2
3C2 C005 RJMP 0x03C8
(0046) else //else
(0047) M8880_DataPort|=(c&(0xf&(~M8880_BIT3))); //we need to clear bit3
3C3 2F80 MOV R24,R16
3C4 7087 ANDI R24,7
3C5 B225 IN R2,0x15
3C6 2A28 OR R2,R24
3C7 BA25 OUT 0x15,R2
(0048) M8880_CtrlPort&=~M8880_CLK; //CLR CLK
3C8 9896 CBI 0x12,6
(0049) NOP(); //wait a few time
3C9 0000 NOP
(0050) NOP();
3CA 0000 NOP
(0051) M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS; //set CS RW CLK RS
3CB B382 IN R24,0x12
3CC 6F80 ORI R24,0xF0
3CD BB82 OUT 0x12,R24
(0052) if (flag){ //if we need to write CRB ...
3CE 2322 TST R18
3CF F091 BEQ 0x03E2
(0053) M8880_DataPort&=0xf0;
3D0 B385 IN R24,0x15
3D1 7F80 ANDI R24,0xF0
3D2 BB85 OUT 0x15,R24
(0054) M8880_CtrlPort&=~(M8880_CS|M8880_RW);
3D3 B382 IN R24,0x12
3D4 7C8F ANDI R24,0xCF
3D5 BB82 OUT 0x12,R24
(0055) M8880_DataPort|=(c>>4);
3D6 2F80 MOV R24,R16
3D7 9582 SWAP R24
3D8 708F ANDI R24,0xF
3D9 B225 IN R2,0x15
3DA 2A28 OR R2,R24
3DB BA25 OUT 0x15,R2
(0056) M8880_CtrlPort&=~M8880_CLK;
3DC 9896 CBI 0x12,6
(0057) NOP();
3DD 0000 NOP
(0058) NOP();
3DE 0000 NOP
(0059) M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS; //set CS RW CLK
3DF B382 IN R24,0x12
3E0 6F80 ORI R24,0xF0
3E1 BB82 OUT 0x12,R24
(0060) }
3E2 9508 RET
(0061) }
(0062) char M8880_ReadState(void)
(0063) {
(0064) char c;
(0065) M8880_DataDDR&=0xf0;
_M8880_ReadState:
c --> R16
3E3 B384 IN R24,0x14
3E4 7F80 ANDI R24,0xF0
3E5 BB84 OUT 0x14,R24
(0066) M8880_CtrlPort&=~(M8880_CS);
3E6 9895 CBI 0x12,5
(0067) M8880_CtrlPort&=~M8880_CLK;
3E7 9896 CBI 0x12,6
(0068) NOP();
3E8 0000 NOP
(0069) NOP();
3E9 0000 NOP
(0070) c=M8880_DataPIN&0xf;
3EA B303 IN R16,0x13
3EB 700F ANDI R16,0xF
(0071) M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS; //set CS RW CLK
3EC B382 IN R24,0x12
3ED 6F80 ORI R24,0xF0
3EE BB82 OUT 0x12,R24
(0072) M8880_DataDDR|=0X0F;
3EF B384 IN R24,0x14
3F0 608F ORI R24,0xF
3F1 BB84 OUT 0x14,R24
(0073) return c;
3F2 9508 RET
(0074) }
(0075) void M8880_Init(void)
(0076) {
(0077) M8880_State.SendCount=0;
_M8880_Init:
3F3 2422 CLR R2
3F4 9220 0207 STS M8880_State,R2
(0078) M8880_State.CurSend=sendbuf;
3F6 E484 LDI R24,0x44
3F7 E092 LDI R25,2
3F8 9390 0209 STS M8880_State+2,R25
3FA 9380 0208 STS M8880_State+1,R24
(0079) M8880_State.Sending=0;
3FC 9220 0211 STS 0x0211,R2
(0080) M8880_State.RecvIntCount=0;
3FE 9220 020A STS M8880_State+3,R2
(0081) M8880_State.RecvStartPtr=recvbuf;
400 E182 LDI R24,0x12
401 E092 LDI R25,2
402 9390 020C STS 0x020C,R25
404 9380 020B STS 0x020B,R24
(0082) M8880_State.RecvEndPtr=recvbuf;
406 9390 020E STS 0x020E,R25
408 9380 020D STS 0x020D,R24
(0083) M8880_State.CurRecv=recvbuf;
40A 9390 0210 STS 0x0210,R25
40C 9380 020F STS 0x020F,R24
(0084) M8880_DataDDR|=0xf;
40E B384 IN R24,0x14
40F 608F ORI R24,0xF
410 BB84 OUT 0x14,R24
(0085) M8880_DataPort&=~0xf;
411 B385 IN R24,0x15
412 7F80 ANDI R24,0xF0
413 BB85 OUT 0x15,R24
(0086) M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;
414 B382 IN R24,0x12
415 6F80 ORI R24,0xF0
416 BB82 OUT 0x12,R24
(0087) M8880_CtrlDDR|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;
417 B381 IN R24,0x11
418 6F80 ORI R24,0xF0
419 BB81 OUT 0x11,R24
(0088) M8880_ReadState();
41A DFC8 RCALL _M8880_ReadState
(0089) M8880_WriteCtrl(0x00,0);
41B 2722 CLR R18
41C 2700 CLR R16
41D DF96 RCALL _M8880_WriteCtrl
(0090) M8880_WriteCtrl(0x00,0);
41E 2722 CLR R18
41F 2700 CLR R16
420 DF93 RCALL _M8880_WriteCtrl
(0091) M8880_WriteCtrl((M8880_BIT0|M8880_BIT2),-1);
421 EF2F LDI R18,0xFF
422 E005 LDI R16,5
423 DF90 RCALL _M8880_WriteCtrl
(0092) M8880_ReadState();
424 DFBE RCALL _M8880_ReadState
(0093) #if M8880_INT==1
(0094) PORTD|=0x8;
(0095) DDRD&=~0x8;
(0096) MCUCR&=~((1<<ISC11)|(1<<ISC10));
(0097) MCUCR|=(1<<ISC11);
(0098) GICR|=(1<<INT1);
(0099) GIFR|=(1<<INT1);
(0100) #else
(0101) PORTD|=0x4;
425 9A92 SBI 0x12,2
(0102) DDRD&=~0x4;
426 988A CBI 0x11,2
(0103) MCUCR&=~((1<<ISC01)|(1<<ISC00));
427 B785 IN R24,0x35
428 7F8C ANDI R24,0xFC
429 BF85 OUT 0x35,R24
(0104) MCUCR|=(1<<ISC01);
42A B785 IN R24,0x35
42B 6082 ORI R24,2
42C BF85 OUT 0x35,R24
(0105) GICR|=(1<<INT0);
42D B78B IN R24,0x3B
42E 6480 ORI R24,0x40
42F BF8B OUT 0x3B,R24
(0106) GIFR|=(1<<INT0);
430 B78A IN R24,0x3A
431 6480 ORI R24,0x40
432 BF8A OUT 0x3A,R24
433 9508 RET
_int0_isr:
c --> R10
434 920A ST R0,-Y
435 921A ST R1,-Y
436 922A ST R2,-Y
437 923A ST R3,-Y
438 924A ST R4,-Y
439 925A ST R5,-Y
43A 926A ST R6,-Y
43B 927A ST R7,-Y
43C 928A ST R8,-Y
43D 929A ST R9,-Y
43E 930A ST R16,-Y
43F 931A ST R17,-Y
440 932A ST R18,-Y
441 933A ST R19,-Y
442 938A ST R24,-Y
443 939A ST R25,-Y
444 93AA ST R26,-Y
445 93BA ST R27,-Y
446 93EA ST R30,-Y
447 93FA ST R31,-Y
448 B60F IN R0,0x3F
449 920A ST R0,-Y
44A 92AA ST R10,-Y
(0107) #endif
(0108) }
(0109) char *dec="01234567890*#abcd";
(0110) #pragma interrupt_handler int0_isr:iv_INT0
(0111) void int0_isr(void)
(0112) {
(0113) char c;
(0114) c=M8880_ReadState();
44B DF97 RCALL _M8880_ReadState
44C 2EA0 MOV R10,R16
(0115) if (c&M8880_BIT1){
44D FF01 SBRS R16,1
44E C020 RJMP 0x046F
(0116) M8880_State.SendCount--;
44F 9180 0207 LDS R24,M8880_State
451 5081 SUBI R24,1
452 9380 0207 STS M8880_State,R24
(0117) if (M8880_State.SendCount>0){
454 E080 LDI R24,0
455 9020 0207 LDS R2,M8880_State
457 1582 CP R24,R2
458 F468 BCC 0x0466
(0118) M8880_State.CurSend++;
459 9180 0208 LDS R24,M8880_State+1
45B 9190 0209 LDS R25,M8880_State+2
45D 9601 ADIW R24,1
45E 9390 0209 STS M8880_State+2,R25
460 9380 0208 STS M8880_State+1,R24
(0119) M8880_WriteChar(*M8880_State.CurSend);
462 01FC MOVW R30,R24
463 8100 LDD R16,Z+0
464 DF2B RCALL _M8880_WriteChar
(0120) }else{
465 C009 RJMP 0x046F
(0121) M8880_State.CurSend=sendbuf;
466 E484 LDI R24,0x44
467 E092 LDI R25,2
468 9390 0209 STS M8880_State+2,R25
46A 9380 0208 STS M8880_State+1,R24
(0122) M8880_State.Sending=0;
46C 2422 CLR R2
46D 9220 0211 STS 0x0211,R2
(0123) }
(0124) }
(0125) if ((c&M8880_BIT2)&&((c&M8880_BIT3)==0)){
46F FEA2 SBRS R10,2
470 C035 RJMP 0x04A6
471 FCA3 SBRC R10,3
472 C033 RJMP 0x04A6
(0126) if (M8880_State.RecvIntCount>0){
473 E080 LDI R24,0
474 9020 020A LDS R2,M8880_State+3
476 1582 CP R24,R2
477 F570 BCC 0x04A6
(0127) M8880_State.RecvIntCount--;
478 2D82 MOV R24,R2
479 5081 SUBI R24,1
47A 9380 020A STS M8880_State+3,R24
(0128) *M8880_State.CurRecv++=dec[M8880_ReadChar()];
47C DF25 RCALL _M8880_ReadChar
47D 9020 0198 LDS R2,dec
47F 9030 0199 LDS R3,dec+1
481 2FE0 MOV R30,R16
482 27FF CLR R31
483 0DE2 ADD R30,R2
484 1DF3 ADC R31,R3
485 8020 LDD R2,Z+0
486 91E0 020F LDS R30,0x020F
488 91F0 0210 LDS R31,0x0210
48A 9221 ST R2,Z+
48B 93F0 0210 STS 0x0210,R31
48D 93E0 020F STS 0x020F,R30
(0129) if (M8880_State.CurRecv==recvbuf+M8880_RECV_BUFSIZE)
48F E484 LDI R24,0x44
490 E092 LDI R25,2
491 17E8 CP R30,R24
492 07F9 CPC R31,R25
493 F431 BNE 0x049A
(0130) M8880_State.CurRecv=recvbuf;
494 E182 LDI R24,0x12
495 E092 LDI R25,2
496 9390 0210 STS 0x0210,R25
498 9380 020F STS 0x020F,R24
(0131) if (M8880_State.RecvIntCount==0)
49A 9020 020A LDS R2,M8880_State+3
49C 2022 TST R2
49D F441 BNE 0x04A6
(0132) M8880_State.RecvEndPtr=M8880_State.CurRecv;
49E 9020 020F LDS R2,0x020F
4A0 9030 0210 LDS R3,0x0210
4A2 9230 020E STS 0x020E,R3
4A4 9220 020D STS 0x020D,R2
(0133) }
(0134) }
4A6 90A9 LD R10,Y+
4A7 9009 LD R0,Y+
4A8 BE0F OUT 0x3F,R0
4A9 91F9 LD R31,Y+
4AA 91E9 LD R30,Y+
4AB 91B9 LD R27,Y+
4AC 91A9 LD R26,Y+
4AD 9199 LD R25,Y+
4AE 9189 LD R24,Y+
4AF 9139 LD R19,Y+
4B0 9129 LD R18,Y+
4B1 9119 LD R17,Y+
4B2 9109 LD R16,Y+
4B3 9099 LD R9,Y+
4B4 9089 LD R8,Y+
4B5 9079 LD R7,Y+
4B6 9069 LD R6,Y+
4B7 9059 LD R5,Y+
4B8 9049 LD R4,Y+
4B9 9039 LD R3,Y+
4BA 9029 LD R2,Y+
4BB 9019 LD R1,Y+
4BC 9009 LD R0,Y+
4BD 9518 RETI
_M8880_Send:
c --> R20
count --> R10
x --> R12
4BE D2D7 RCALL push_xgset303C
4BF 2EA2 MOV R10,R18
4C0 0168 MOVW R12,R16
(0135) }
(0136) void M8880_Send(char *x,char count)
(0137) {
(0138) char *c;
(0139) if (count==0) return;
4C1 20AA TST R10
4C2 F409 BNE 0x04C4
4C3 C01C RJMP 0x04E0
(0140) while(M8880_State.Sending);
4C4 9020 0211 LDS R2,0x0211
4C6 2022 TST R2
4C7 F7E1 BNE 0x04C4
(0141) M8880_State.SendCount=count;
4C8 92A0 0207 STS M8880_State,R10
(0142) M8880_State.Sending=-1;
4CA EF8F LDI R24,0xFF
4CB 9380 0211 STS 0x0211,R24
(0143) c=sendbuf;
4CD E444 LDI R20,0x44
4CE E052 LDI R21,2
(0144) for (;count>0;count--){
4CF C007 RJMP 0x04D7
(0145) *c++=*x++;
4D0 01F6 MOVW R30,R12
4D1 01DA MOVW R26,R20
4D2 9001 LD R0,Z+
4D3 016F MOVW R12,R30
4D4 920D ST R0,X+
4D5 01AD MOVW R20,R26
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -