⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2_study.lst

📁 基于ps/2接口协议的键盘学习机,采用128*64LCD显示,使用单片机为,mega16
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -