📄 1.lst
字号:
03B8 9426 LSR R2
03B9 2E34 MOV R3,R20
03BA 0C33 LSL R3
03BB 2832 OR R3,R2
03BC 8230 STD Z+0,R3
03BD 9523 INC R18
03BE 3328 CPI R18,0x38
03BF F408 BCC 0x03C1
03C0 CFCC RJMP 0x038D
03C1 9503 INC R16
03C2 3100 CPI R16,0x10
03C3 F408 BCC 0x03C5
03C4 CFC6 RJMP 0x038B
03C5 940E049A CALL pop_gset2
03C7 9508 RET
_left_MOVE_display:
k --> R20
i --> R22
colour --> R10
03C8 940E04A7 CALL push_gset3
03CA 2EA0 MOV R10,R16
(0369) } //只不过是把第一列的信号给了上一16*16的第16列‘
(0370) } //第一个字符(字体失去的那个字,所以第一是变动的。那个字体开始掉失那个字就为第一)始终从第一列
(0371) } //信号开始失掉
(0372) //两个for中的参数: 16是规格格式,41是扫描41列(0->40),显示10空字10汉字则要40列
(0373) //多出的一列是为了用其最高位来补Ledplay[i][39](最后一列)的最低位(最后一列<<1有了最低们这个空位)
(0374) //则要用多出的一列(0x00)的最最位来补(这列也可以以程序默认来补,即可删这行)。
(0375) //若程序每次把汉字移动两列则要用二列来补。
(0376) void left_MOVE_display(unsigned char colour)
(0377) {
(0378) static uint king=0;
(0379) uint i=0,k;
03CB 2766 CLR R22
03CC 2777 CLR R23
(0380) king=0;
03CD 2422 CLR R2
03CE 2433 CLR R3
03CF 92300062 STS king+1,R3
03D1 92200061 STS king,R2
(0381) bn=0;// 全局 列变量
03D3 92200060 STS bn,R2
(0382) clearRAM();//使 Ledplay[i][j]所指空间清0
03D5 DF29 RCALL _clearRAM
(0383) for(k=0;k<howmany0;k++){putin(position);} //实质上是使 Ledplay[i][j]填入空字 *****************************
03D6 2744 CLR R20
03D7 2755 CLR R21
03D8 C004 RJMP 0x03DD
03D9 E006 LDI R16,6
03DA DEB3 RCALL _putin
03DB 5F4F SUBI R20,0xFF
03DC 4F5F SBCI R21,0xFF
03DD 304A CPI R20,0xA
03DE E0E0 LDI R30,0
03DF 075E CPC R21,R30
03E0 F3C0 BCS 0x03D9
(0384) for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
03E1 2744 CLR R20
03E2 2755 CLR R21
03E3 C004 RJMP 0x03E8
03E4 2F04 MOV R16,R20
03E5 DEA8 RCALL _putin
03E6 5F4F SUBI R20,0xFF
03E7 4F5F SBCI R21,0xFF
03E8 3142 CPI R20,0x12
03E9 E0E0 LDI R30,0
03EA 075E CPC R21,R30
03EB F3C0 BCS 0x03E4
03EC C01F RJMP 0x040C
(0385) while(1)
(0386) {//开始移动
(0387) for(i=0;i<shopshow;i++)//动态显示一段时间
03ED 2766 CLR R22
03EE 2777 CLR R23
03EF C004 RJMP 0x03F4
(0388) {
(0389) DisPlay_onetime(colour);//*************************************************************
03F0 2D0A MOV R16,R10
03F1 DF33 RCALL _DisPlay_onetime
03F2 5F6F SUBI R22,0xFF
03F3 4F7F SBCI R23,0xFF
03F4 3069 CPI R22,0x9
03F5 E0E0 LDI R30,0
03F6 077E CPC R23,R30
03F7 F3C0 BCS 0x03F0
(0390) }
(0391) left_move();
03F8 DF8E RCALL _left_move
(0392) king++;
03F9 91800061 LDS R24,king
03FB 91900062 LDS R25,king+1
03FD 9601 ADIW R24,1
03FE 93900062 STS king+1,R25
0400 93800061 STS king,R24
(0393) if(king>159+16*18)
0402 EB8F LDI R24,0xBF
0403 E091 LDI R25,1
0404 90200061 LDS R2,king
0406 90300062 LDS R3,king+1
0408 1582 CP R24,R2
0409 0593 CPC R25,R3
040A F408 BCC 0x040C
(0394) break;
040B C001 RJMP 0x040D
040C CFE0 RJMP 0x03ED
040D 940E049D CALL pop_gset3
040F 9508 RET
(0395) }//停止移动
(0396) /*for(i=0;i<600;i++)//静止显示一段时间***************************
(0397) {
(0398) DisPlay_onetime(colour);
(0399) }*/
(0400) }
(0401) //不理想
(0402) /*void right_move(void)
(0403) {
(0404) uchar data0,data1,i,j;
(0405) for(i=0;i<16;i++)
(0406) {
(0407) for(j=0;j<(howmany0+hanzishu)*2+1;j++)//如41=(howmany0+hanzishu)*2+1
(0408) {
(0409) data0=Ledplay[i][j];
(0410) data1=Ledplay[i][j+1];
(0411) Ledplay[i][j+1]=(data0<<7)|(data1>>1);//从第二个字符起它的信号始终没有掉失,
(0412) } //只不过是把第一列的信号给了上一16*16的第16列‘
(0413) } //第一个字符(字体失去的那个字,所以第一是变动的。那个字体开始掉失那个字就为第一)始终从第一列
(0414) }
(0415) void right_MOVE_display(unsigned char colour)
(0416) {
(0417) static uint king=0;
(0418) uint i=0,k;
(0419) king=0;
(0420) bn=0;// 全局 列变量
(0421) clearRAM();//使 Ledplay[i][j]所指空间清0
(0422) for(k=0;k<howmany0;k++){putin(position);} //实质上是使 Ledplay[i][j]填入空字 *****************************
(0423) for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
(0424) while(1)
(0425) {//开始移动
(0426) for(i=0;i<shopshow;i++)//动态显示一段时间
(0427) {
(0428) DisPlay_onetime(colour);//*************************************************************
(0429) }
(0430) right_move();
(0431) king++;
(0432) if(king>143)
(0433) break;
(0434) }//停止移动
(0435) //for(i=0;i<600;i++)//静止显示一段时间***************************
(0436) //{
(0437) // DisPlay_onetime(colour);
(0438) //}//
(0439) } */
(0440) //下面数功能为把信号移
(0441) void UP_move(void)
(0442) {
(0443) uchar i,j;
(0444) for(j=0;j<(howmany0+hanzishu)*2;j++)
_UP_move:
j --> R16
i --> R18
0410 2700 CLR R16
0411 C02C RJMP 0x043E
(0445) {
(0446) for(i=0;i<16;i++)
0412 2722 CLR R18
0413 C017 RJMP 0x042B
(0447) {
(0448) Ledplay[i][j]=Ledplay[i+1][j];//让本列的下一行的来取代自已的位置,来实现下一行信号下移的功能,第16行下移后的空位由多出的一行(0x00)
0414 E38A LDI R24,0x3A
0415 9F82 MUL R24,R18
0416 E98F LDI R24,0x9F
0417 E090 LDI R25,0
0418 0110 MOVW R2,R0
0419 0E28 ADD R2,R24
041A 1E39 ADC R3,R25
041B 2FE0 MOV R30,R16
041C 27FF CLR R31
041D 0DE2 ADD R30,R2
041E 1DF3 ADC R31,R3
041F 8020 LDD R2,Z+0
0420 E685 LDI R24,0x65
0421 E090 LDI R25,0
0422 0120 MOVW R4,R0
0423 0E48 ADD R4,R24
0424 1E59 ADC R5,R25
0425 2FE0 MOV R30,R16
0426 27FF CLR R31
0427 0DE4 ADD R30,R4
0428 1DF5 ADC R31,R5
0429 8220 STD Z+0,R2
042A 9523 INC R18
042B 3120 CPI R18,0x10
042C F338 BCS 0x0414
(0449) } //来补,这是Ledplay有17行的所以了。
(0450) if(j<(howmany0+hanzishu)*2-10)
042D 320E CPI R16,0x2E
042E F470 BCC 0x043D
(0451) Ledplay[15][j]=Ledplay[0][j+10];//本程序开始时以10个空字占満版面,j=0时,把第6个字的信号给第一个字位最低行,j=1时把第7个字信号给第2个字
042F E68F LDI R24,0x6F
0430 E090 LDI R25,0
0431 2FE0 MOV R30,R16
0432 27FF CLR R31
0433 0FE8 ADD R30,R24
0434 1FF9 ADC R31,R25
0435 8020 LDD R2,Z+0
0436 EC8B LDI R24,0xCB
0437 E093 LDI R25,3
0438 2FE0 MOV R30,R16
0439 27FF CLR R31
043A 0FE8 ADD R30,R24
043B 1FF9 ADC R31,R25
043C 8220 STD Z+0,R2
043D 9503 INC R16
043E 3308 CPI R16,0x38
043F F408 BCC 0x0441
0440 CFD1 RJMP 0x0412
0441 9508 RET
_UP_MOVE_display:
k --> R20
i --> R22
colour --> R10
0442 940E04A7 CALL push_gset3
0444 2EA0 MOV R10,R16
(0452) } //第10列即第6个字
(0453) }
(0454) void UP_MOVE_display(unsigned char colour)
(0455) {
(0456) static uint up=0;
(0457) uint i=0,k=0;
0445 2766 CLR R22
0446 2777 CLR R23
0447 2744 CLR R20
0448 2755 CLR R21
(0458) up=0;
0449 2422 CLR R2
044A 2433 CLR R3
044B 92300064 STS up+1,R3
044D 92200063 STS up,R2
(0459) bn=0;
044F 92200060 STS bn,R2
(0460) clearRAM();
0451 DEAD RCALL _clearRAM
(0461) for(k=0;k<howmany0;k++){putin(position);}//实质上是使 Ledplay[i][j]所指空间清0
0452 C004 RJMP 0x0457
0453 E006 LDI R16,6
0454 DE39 RCALL _putin
0455 5F4F SUBI R20,0xFF
0456 4F5F SBCI R21,0xFF
0457 304A CPI R20,0xA
0458 E0E0 LDI R30,0
0459 075E CPC R21,R30
045A F3C0 BCS 0x0453
(0462) for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
045B 2744 CLR R20
045C 2755 CLR R21
045D C004 RJMP 0x0462
045E 2F04 MOV R16,R20
045F DE2E RCALL _putin
0460 5F4F SUBI R20,0xFF
0461 4F5F SBCI R21,0xFF
0462 3142 CPI R20,0x12
0463 E0E0 LDI R30,0
0464 075E CPC R21,R30
0465 F3C0 BCS 0x045E
0466 C01A RJMP 0x0481
(0463) while(1)
(0464) {
(0465) for(i=0;i<shopshow+6;i++)
0467 2766 CLR R22
0468 2777 CLR R23
0469 C004 RJMP 0x046E
(0466) DisPlay_onetime(colour);
046A 2D0A MOV R16,R10
046B DEB9 RCALL _DisPlay_onetime
046C 5F6F SUBI R22,0xFF
046D 4F7F SBCI R23,0xFF
046E 306F CPI R22,0xF
046F E0E0 LDI R30,0
0470 077E CPC R23,R30
0471 F3C0 BCS 0x046A
(0467) UP_move();
0472 DF9D RCALL _UP_move
(0468) up++;
0473 91800063 LDS R24,up
0475 91900064 LDS R25,up+1
0477 9601 ADIW R24,1
0478 93900064 STS up+1,R25
047A 93800063 STS up,R24
(0469) if(up==32*3)
047C 3680 CPI R24,0x60
047D E0E0 LDI R30,0
047E 079E CPC R25,R30
047F F409 BNE 0x0481
(0470) break;
0480 C001 RJMP 0x0482
0481 CFE5 RJMP 0x0467
0482 940E049D CALL pop_gset3
0484 9508 RET
(0471) }
(0472) /*for(i=0;i<300;i++)
(0473) {
(0474) DisPlay_onetime(colour);
(0475) }*/
(0476) }
(0477) /***************************************************************************************************
(0478) 上面32*80大点阵驱动程序
(0479) ****************************************************************************************************/
(0480)
(0481) //端口初始化
(0482) void port_init(void)
(0483) {
(0484) PORTB = 0x00;
_port_init:
0485 2422 CLR R2
0486 BA28 OUT 0x18,R2
(0485) DDRB = 0xff;
0487 EF8F LDI R24,0xFF
0488 BB87 OUT 0x17,R24
(0486) PORTD = 0x01;
0489 E081 LDI R24,1
048A BB82 OUT 0x12,R24
(0487) DDRD = 0x01;
048B BB81 OUT 0x11,R24
048C 9508 RET
(0488) }
(0489)
(0490) void init_devices(void)
(0491) {
(0492) CLI(); //禁止所有中断
_init_devices:
048D 94F8 BCLR 7
(0493) port_init();
048E DFF6 RCALL _port_init
(0494) SEI();//开全局中断
048F 9478 BSET 7
0490 9508 RET
(0495) }
(0496) //主函数
(0497) void main(void)
(0498) {
(0499) char i,j;
(0500) init_devices();
_main:
j --> Y+1
i --> Y+1
0491 DFFB RCALL _init_devices
(0501) clearping();
0492 DE84 RCALL _clearping
0493 C004 RJMP 0x0498
(0502) while(1)
(0503) {
(0504) // right_MOVE_display(greed);
(0505)
(0506) left_MOVE_display(greed);
0494 E001 LDI R16,1
0495 DF32 RCALL _left_MOVE_display
(0507) UP_MOVE_display(oringe);
FILE: <library>
0496 E002 LDI R16,2
0497 DFAA RCALL _UP_MOVE_display
0498 CFFB RJMP 0x0494
0499 9508 RET
pop_gset2:
049A E0E2 LDI R30,2
049B 940C04AF JMP pop
pop_gset3:
049D E0E4 LDI R30,4
049E 940C04AF JMP pop
pop_gset4:
04A0 E0E8 LDI R30,0x8
04A1 940C04AF JMP pop
push_gset5:
04A3 92FA ST R15,-Y
04A4 92EA ST R14,-Y
push_gset4:
04A5 92DA ST R13,-Y
04A6 92CA ST R12,-Y
push_gset3:
04A7 92BA ST R11,-Y
04A8 92AA ST R10,-Y
push_gset2:
04A9 937A ST R23,-Y
04AA 936A ST R22,-Y
push_gset1:
04AB 935A ST R21,-Y
04AC 934A ST R20,-Y
04AD 9508 RET
pop_gset1:
04AE E0E1 LDI R30,1
pop:
04AF 9149 LD R20,Y+
04B0 9159 LD R21,Y+
04B1 FDE0 SBRC R30,0
04B2 9508 RET
04B3 9169 LD R22,Y+
04B4 9179 LD R23,Y+
04B5 FDE1 SBRC R30,1
04B6 9508 RET
04B7 90A9 LD R10,Y+
04B8 90B9 LD R11,Y+
04B9 FDE2 SBRC R30,2
04BA 9508 RET
04BB 90C9 LD R12,Y+
04BC 90D9 LD R13,Y+
04BD FDE3 SBRC R30,3
04BE 9508 RET
04BF 90E9 LD R14,Y+
04C0 90F9 LD R15,Y+
04C1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -