📄 ps2_study.lst
字号:
__start:
__text_start:
041B E5CF LDI R28,0x5F
041C E0D4 LDI R29,4
041D BFCD OUT P3D,R28
041E BFDE OUT P3E,R29
041F 51C0 SUBI R28,0x10
0420 40D0 SBCI R29,0
0421 EA0A LDI R16,0xAA
0422 8308 STD R16,0+Y
0423 2400 CLR R0
0424 EAE5 LDI R30,0xA5
0425 E0F0 LDI R31,0
0426 E010 LDI R17,0
0427 3AEB CPI R30,0xAB
0428 07F1 CPC R31,R17
0429 F011 BEQ 0x042C
042A 9201 ST R0,Z+
042B CFFB RJMP 0x0427
042C 8300 STD R16,0+Z
042D EFE0 LDI R30,0xF0
042E E0F7 LDI R31,7
042F E6A0 LDI R26,0x60
0430 E0B0 LDI R27,0
0431 E018 LDI R17,0x8
0432 33E5 CPI R30,0x35
0433 07F1 CPC R31,R17
0434 F021 BEQ 0x0439
0435 95C8 LPM
0436 9631 ADIW R30,1
0437 920D ST R0,X+
0438 CFF9 RJMP 0x0432
0439 940E1EBA CALL _main
_exit:
043B CFFF RJMP _exit
_LCD_Test:
L_R --> R20
043C 940E1FA6 CALL push_gset1
043E 2F40 MOV R20,R16
FILE: D:\my_work\ps2_study\ps2_study.c
(0001) #include<iom16v.h>
(0002) #include <macros.h>
(0003) #include "ps2_study_data.h"
(0004)
(0005) unsigned char data_key[3];
(0006) unsigned char flag_1=1,flag_del=0,flag_char1=0,key_i=1,flag_a=0,flag_w=0,flag_b=0,flag_c=0,
(0007) flag_d=0,flag_e=0,flag_f=0,flag_g=0,flag_h=0,flag_i=0,
(0008) flag_j=0,flag_k=0,flag_l=0,flag_n=0,flag_m=0,flag_o=0,
(0009) flag_p=0,flag_q=0,flag_r=0,flag_s=0,flag_t=0,flag_u=0,
(0010) flag_v=0,flag_ww=0,flag_x=0,flag_y=0,flag_z=0,flag_esc=0;
(0011) unsigned char y_station,rig=0,LR=0,wed1=1,flag_L_R=0,flag_error=0,
(0012) flag_over=0,flag_rig,flag_score=0,flag_enter=0,flag_time0=0,
(0013) flag_cout=0,flag_ts=0;
(0014) signed char x_station;
(0015) unsigned int flag_ms=0;
(0016) ////////////////////////////////
(0017) #define start 34;
(0018) char extern xc=start;
(0019) unsigned char const *data_num[10]={&num0[0],&num1[0],&num2[0],&num3[0],
(0020) &num4[0],&num5[0],&num6[0],&num7[0],&num8[0],&num9[0]};
(0021)
(0022) unsigned char num_data=0,test_num=0;
(0023) unsigned char key_ok=1;
(0024) ////////////////////////////////
(0025)
(0026)
(0027) #define data_DDR DDRA
(0028) #define data_OUT PORTA
(0029) #define data_in PINA
(0030)
(0031) #define COMMAND_OUT PORTD
(0032) #define COMMAND_DDR DDRD
(0033)
(0034) #define CS1 PD2
(0035) #define CS2 PD3
(0036) #define D_I PD4
(0037) #define R_W PD5
(0038) #define E PD6
(0039)
(0040) #define COMMAND_INI() COMMAND_DDR|=0X7C
(0041)
(0042) #define SET_CS1() COMMAND_OUT |=(1<<CS1)
(0043) #define SET_CS2() COMMAND_OUT |=(1<<CS2)
(0044) #define SET_D_I() COMMAND_OUT |=(1<<D_I)
(0045) #define SET_R_W() COMMAND_OUT |=(1<<R_W)
(0046) #define SET_E() COMMAND_OUT |=(1<<E)
(0047)
(0048) #define CLR_CS1() COMMAND_OUT &=~(1<<CS1)
(0049) #define CLR_CS2() COMMAND_OUT &=~(1<<CS2)
(0050) #define CLR_D_I() COMMAND_OUT &=~(1<<D_I)
(0051) #define CLR_R_W() COMMAND_OUT &=~(1<<R_W)
(0052) #define CLR_E() COMMAND_OUT &=~(1<<E)
(0053)
(0054) #define BUSY 0X80
(0055) #define LCD_ON 0X3F
(0056) #define LCD_OFF 0X3E
(0057) #define DIS_X 0X40
(0058) #define DIS_Y 0XB8
(0059) #define MAX_X 0X3F
(0060) #define MAX_Y 0X07
(0061)
(0062) #define LEFT 0X00
(0063) #define RIGHT 0X01
(0064)
(0065) #define page1 0xb8
(0066) #define page2 0xb9
(0067) #define page3 0xba
(0068) #define page4 0xbb
(0069) #define page5 0xbc
(0070)
(0071)
(0072)
(0073) ///////////////////////////////////////////////////////////////
(0074) void LCD_Test(char L_R)
(0075) {
(0076) data_DDR=0x00;
043F 2422 CLR R2
0440 BA2A OUT P1A,R2
(0077) if(L_R)
0441 2344 TST R20
0442 F019 BEQ 0x0446
(0078) {
(0079) SET_CS1();
0443 9A92 SBI P12,2
(0080) CLR_CS2();
0444 9893 CBI P12,3
(0081) }
0445 C002 RJMP 0x0448
(0082) else
(0083) {
(0084) SET_CS2();
0446 9A93 SBI P12,3
(0085) CLR_CS1();
0447 9892 CBI P12,2
(0086) }
(0087) CLR_D_I();
0448 9894 CBI P12,4
(0088) SET_R_W();
0449 9A95 SBI P12,5
(0089) SET_E();
044A 9A96 SBI P12,6
(0090) Delaynus(2);
044B E002 LDI R16,2
044C E010 LDI R17,0
044D D0BD RCALL _Delaynus
(0091) while(data_in & BUSY)
044E 99CF SBIC P19,7
044F CFFE RJMP 0x044E
(0092) ;
(0093) CLR_E();
0450 9896 CBI P12,6
(0094) data_DDR=0XFF;
0451 EF8F LDI R24,0xFF
0452 BB8A OUT P1A,R24
(0095)
(0096) }
0453 940E1FA9 CALL pop_gset1
0455 9508 RET
_LCD_write:
L_R --> R22
data --> R20
0456 940E1FBD CALL push_gset2
0458 2F62 MOV R22,R18
0459 2F40 MOV R20,R16
(0097) ///////////////////////////////////////////////////////////////////
(0098)
(0099) void LCD_write (unsigned char data,char L_R)
(0100) {
(0101) LCD_Test(L_R);
045A 2F06 MOV R16,R22
045B DFE0 RCALL _LCD_Test
(0102) SET_D_I();
045C 9A94 SBI P12,4
(0103) CLR_R_W();
045D 9895 CBI P12,5
(0104) SET_E();
045E 9A96 SBI P12,6
(0105) data_OUT=data;
045F BB4B OUT P1B,R20
(0106) CLR_E();
0460 9896 CBI P12,6
(0107) }
0461 940E1FCD CALL pop_gset2
0463 9508 RET
_LCD_write_command:
L_R --> R22
data --> R20
0464 940E1FBD CALL push_gset2
0466 2F62 MOV R22,R18
0467 2F40 MOV R20,R16
(0108)
(0109) void LCD_write_command(unsigned char data,char L_R)
(0110) {
(0111) LCD_Test(L_R);
0468 2F06 MOV R16,R22
0469 DFD2 RCALL _LCD_Test
(0112) CLR_D_I();
046A 9894 CBI P12,4
(0113) CLR_R_W();
046B 9895 CBI P12,5
(0114) SET_E();
046C 9A96 SBI P12,6
(0115) data_OUT=data;
046D BB4B OUT P1B,R20
(0116) CLR_E();
046E 9896 CBI P12,6
(0117) }
046F 940E1FCD CALL pop_gset2
0471 9508 RET
_LCD_write_data:
L_R --> R22
data --> Y+6
y --> R20
x --> R10
0472 940E1FC1 CALL push_gset3
0474 2F42 MOV R20,R18
0475 2EA0 MOV R10,R16
0476 8568 LDD R22,8+Y
(0118)
(0119)
(0120) void LCD_write_data( char x ,char y,unsigned char data,char L_R)//设置xy地址
(0121) {
(0122) LCD_Test(L_R);
0477 2F06 MOV R16,R22
0478 DFC3 RCALL _LCD_Test
(0123) x=DIS_X | (x & MAX_X);
0479 2D8A MOV R24,R10
047A 738F ANDI R24,0x3F
047B 6480 ORI R24,0x40
047C 2EA8 MOV R10,R24
(0124) y=DIS_Y | (y & MAX_Y);
047D 2F84 MOV R24,R20
047E 7087 ANDI R24,7
047F 6B88 ORI R24,0xB8
0480 2F48 MOV R20,R24
(0125) //x=x | 0x40;
(0126) //y=y |0xb8;
(0127) if(L_R)
0481 2366 TST R22
0482 F019 BEQ 0x0486
(0128) {
(0129) SET_CS1();
0483 9A92 SBI P12,2
(0130) CLR_CS2();
0484 9893 CBI P12,3
(0131) }
0485 C002 RJMP 0x0488
(0132) else
(0133) {
(0134) SET_CS2();
0486 9A93 SBI P12,3
(0135) CLR_CS1();
0487 9892 CBI P12,2
(0136) }
(0137) LCD_write_command(x,L_R);//设置x,y的地址
0488 2F26 MOV R18,R22
0489 2D0A MOV R16,R10
048A DFD9 RCALL _LCD_write_command
(0138) LCD_write_command(y,L_R);
048B 2F26 MOV R18,R22
048C 2F04 MOV R16,R20
048D DFD6 RCALL _LCD_write_command
(0139) //LCD_write(data,L_R);
(0140) }
048E 940E1FD0 CALL pop_gset3
0490 9508 RET
(0141)
(0142) //////////////////////////////
(0143)
(0144)
(0145) void LED_ini(void)
(0146) {
(0147) char i,j;
(0148) COMMAND_INI();
_LED_ini:
j --> Y+1
i --> Y+1
0491 B381 IN R24,P11
0492 678C ORI R24,0x7C
0493 BB81 OUT P11,R24
(0149)
(0150) data_DDR=0XFF;
0494 EF8F LDI R24,0xFF
0495 BB8A OUT P1A,R24
(0151) LCD_write_command(LCD_OFF,LEFT);
0496 2722 CLR R18
0497 E30E LDI R16,0x3E
0498 DFCB RCALL _LCD_write_command
(0152) LCD_write_command(LCD_OFF,RIGHT);
0499 E021 LDI R18,1
049A E30E LDI R16,0x3E
049B DFC8 RCALL _LCD_write_command
(0153) LCD_write_command(LCD_ON,LEFT);
049C 2722 CLR R18
049D E30F LDI R16,0x3F
049E DFC5 RCALL _LCD_write_command
(0154) LCD_write_command(LCD_ON,RIGHT);
049F E021 LDI R18,1
04A0 E30F LDI R16,0x3F
04A1 DFC2 RCALL _LCD_write_command
(0155) LCD_write_command(0xc0,LEFT);
04A2 2722 CLR R18
04A3 EC00 LDI R16,0xC0
04A4 DFBF RCALL _LCD_write_command
(0156) LCD_write_command(0xc0,RIGHT);
04A5 E021 LDI R18,1
04A6 EC00 LDI R16,0xC0
(0157) }
04A7 CFBC RJMP _LCD_write_command
_LCD_clear:
j --> Y+9
i --> R20
04A8 940E1FA6 CALL push_gset1
04AA 9728 SBIW R28,0x8
(0158) void LCD_clear(void)
(0159) {
(0160) char i, j;
(0161) for (i = 0; i < MAX_Y + 1; i++)
04AB 2744 CLR R20
04AC C024 RJMP 0x04D1
(0162) {
(0163) LCD_write_page(0, i, MAX_X, 0x00, LEFT, 0);
04AD 2422 CLR R2
04AE 2433 CLR R3
04AF 822E STD R2,6+Y
04B0 823F STD R3,7+Y
04B1 822C STD R2,4+Y
04B2 823D STD R3,5+Y
04B3 822A STD R2,2+Y
04B4 823B STD R3,3+Y
04B5 E38F LDI R24,0x3F
04B6 E090 LDI R25,0
04B7 8388 STD R24,0+Y
04B8 8399 STD R25,1+Y
04B9 2F24 MOV R18,R20
04BA 2733 CLR R19
04BB 2700 CLR R16
04BC 2711 CLR R17
04BD D019 RCALL _LCD_write_page
(0164) LCD_write_page(0, i, MAX_X, 0x00, RIGHT, 0);
04BE 2422 CLR R2
04BF 2433 CLR R3
04C0 822E STD R2,6+Y
04C1 823F STD R3,7+Y
04C2 E081 LDI R24,1
04C3 E090 LDI R25,0
04C4 838C STD R24,4+Y
04C5 839D STD R25,5+Y
04C6 822A STD R2,2+Y
04C7 823B STD R3,3+Y
04C8 E38F LDI R24,0x3F
04C9 8388 STD R24,0+Y
04CA 8399 STD R25,1+Y
04CB 2F24 MOV R18,R20
04CC 2733 CLR R19
04CD 2700 CLR R16
04CE 2711 CLR R17
04CF D007 RCALL _LCD_write_page
04D0 9543 INC R20
04D1 3048 CPI R20,0x8
04D2 F2D0 BCS 0x04AD
(0165) }
(0166) }
04D3 9628 ADIW R28,0x8
04D4 940E1FA9 CALL pop_gset1
04D6 9508 RET
_LCD_write_page:
i --> R20
over --> Y+21
L_R --> R22
data --> R10
end --> R12
y --> Y+13
x --> R14
04D7 933A ST R19,-Y
04D8 932A ST R18,-Y
04D9 940E1FC9 CALL push_gset5
04DB 2EE0 MOV R14,R16
04DC 9723 SBIW R28,3
04DD 84CF LDD R12,15+Y
04DE 88A9 LDD R10,17+Y
04DF 896B LDD R22,19+Y
(0167)
(0168) void LCD_write_page(char x, char y, unsigned char end, unsigned char data, char L_R, char over)
(0169) {
(0170) char i;
(0171) if (over == 0)
04E0 880D LDD R0,21+Y
04E1 2000 TST R0
04E2 F489 BNE 0x04F4
(0172) {
(0173) LCD_write_data(x, y, data, L_R);
04E3 836A STD R22,2+Y
04E4 82A8 STD R10,0+Y
04E5 852D LDD R18,13+Y
04E6 2D0E MOV R16,R14
04E7 DF8A RCALL _LCD_write_data
(0174) for (i = 0; i < end - x+1; i++)
04E8 2744 CLR R20
04E9 C004 RJMP 0x04EE
(0175) {
(0176) LCD_write(data, L_R);
04EA 2F26 MOV R18,R22
04EB 2D0A MOV R16,R10
04EC DF69 RCALL _LCD_write
04ED 9543 INC R20
04EE 2D8C MOV R24,R12
04EF 198E SUB R24,R14
04F0 5F8F SUBI R24,0xFF
04F1 1748 CP R20,R24
04F2 F3B8 BCS 0x04EA
(0177) }
(0178) }
04F3 C012 RJMP 0x0506
(0179) else
(0180) {
(0181) LCD_write_data(x, y, ~data, L_R);
04F4 836A STD R22,2+Y
04F5 2C2A MOV R2,R10
04F6 9420 COM R2
04F7 8228 STD R2,0+Y
04F8 852D LDD R18,13+Y
04F9 2D0E MOV R16,R14
04FA DF77 RCALL _LCD_write_data
(0182) for (i = 0; i < end - x; i++)
04FB 2744 CLR R20
04FC C005 RJMP 0x0502
(0183) {
(0184) LCD_write(~data, L_R);
04FD 2F26 MOV R18,R22
04FE 2D0A MOV R16,R10
04FF 9500 COM R16
0500 DF55 RCALL _LCD_write
0501 9543 INC R20
0502 2C2C MOV R2,R12
0503 182E SUB R2,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -