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

📄 ex3-9.asm

📁 《51单片机应用开发桉例精选》源代码及图片下载
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------程序信息-----------------
;文件名   : ex3-9.asm
;版本     : 1.0
;作者     :
;修改时间 :

;--------------程序说明------------------
;CHAP 3.9 液晶显示复杂自制图形实例

;-----------常量和变量声明---------------
      DI  EQU  P3.7; DATA(1)\INSTRUCTION
      RW  EQU  P3.6; READ(1)\WRITE
      E   EQU  P3.5; ENABLE
      CS1 EQU  P3.4; CHIP SELECT RIGHT SIDE
      CS2 EQU  P3.3; CHIP SELECT LEFT SIDE
      LCMP EQU P1;
      KEYIN EQU P2;

      PAGEADD EQU 32H;
      YNUM EQU 33H

      STPAGE EQU 34H;
      STY EQU 35H;
      LNGTH EQU 36H;
      WIDTH EQU 37H;

      PX EQU 38H;
      PY EQU 39H;

      HEADX EQU 3AH;
      HEADY EQU 3BH;
      TAILX EQU 3CH;
      TAILY EQU 3DH;

      DIR EQU 3EH; DIRECTION
      HEADXA  EQU 3FH;
      HEADYA  EQU 40H;
      SNAGLNG EQU 41H;

      TAILXA EQU 42H;
      TAILYA EQU 43H;
      TDIR EQU 44H;

      SPOT EQU 45H;
      SPOTED EQU 46H;

      ERR BIT 00H;
      ENSPOT BIT 01H;
      ALL BIT 02H;
;--------------INTERRUPT PRG ADDRESS----------


;--------------PRE-DEFINATION--------------------
               ORG 000H
               LJMP START
               ;ORG 0030H

START:
;--------------INITIAL PRG----------------
       MOV SP,#60H;
       CLR ERR;
       CLR ENSPOT;
       CLR ALL;
;--------------MAIN PRG--------------------
MAIN:
       LCALL INIT;
       LCALL INITBMP;
       LCALL BMP;
       LCALL INITSNAG;
       ;LJMP INITSNAG;
MAINLOOP:
       JB ERR,MAINLOOP1;
       JB ALL,MAINLOOP1;
       LCALL SNAG;
       ;LJMP SNAG;
MAINLOOP1:
       LCALL KEYBOARD;
       LCALL KEYEXE;
       LCALL DELAY100MS;
        LJMP MAINLOOP;


;--------------SUB PRG------------------
INIT:   LCALL RIGHTSIDE;
        LCALL INITLCM;
        LCALL CLS;
        LCALL LEFTSIDE;
        LCALL INITLCM;
        LCALL CLS;
        RET;
;--------------LCM SUB------------------
INITLCM:
       SETB E;

       MOV LCMP,#3EH;  DISPLAY OFF
       LCALL WI;

       MOV LCMP,#0C0H; SET INITIAL ROW
       LCALL WI;

       MOV LCMP,#0B8H; SET PAGEADD
       LCALL WI;
       MOV PAGEADD,#0B8H;

       MOV LCMP,#40H;  SET Y
       LCALL WI;
       MOV YNUM,#40H;

       MOV LCMP,#3FH;  DISPLAY ON;
       LCALL WI;

       RET;
;-------------------------------------
WI:     CLR DI
        CLR RW
        LCALL DELAYLCD
        CLR E
        LCALL DELAYLCD
        SETB E
        RET;

WD:    CLR RW
       SETB DI;
       LCALL DELAYLCD
       CLR E;
       LCALL DELAYLCD;
       SETB E;
       CLR DI;
       RET;

RDD:    SETB RW
       SETB DI;
       LCALL DELAYLCD
       CLR E;
       LCALL DELAYLCD;
       SETB E;
       LCALL DELAYLCD
       ;CLR DI;
       ;CLR RW;
       RET;

 LEFTSIDE:
       SETB CS1;
       CLR CS2;
       RET;

 RIGHTSIDE:
       SETB CS2;
       CLR CS1;
       RET;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 CLS:  ;LCALL LEFTSIDE;
        MOV YNUM,#40H;
        MOV PAGEADD,#0B8H;

        MOV R0,#08H;
 CLS0:  MOV R1,#64;
        MOV LCMP,PAGEADD;
        LCALL WI;
        MOV LCMP,YNUM;
        LCALL WI;
 CLS1:
        MOV LCMP,#00H;
        LCALL WD;
        DJNZ R1,CLS1;
        INC PAGEADD;
        DJNZ R0,CLS0;

        RET;

 CLSDRAW:
        LCALL RIGHTSIDE;
        MOV YNUM,#4CH;
        MOV PAGEADD,#0B9H;

        MOV R0,#06H;
 CLS2:  MOV R1,#40;
        MOV LCMP,PAGEADD;
        LCALL WI;

        MOV LCMP,YNUM;
        LCALL WI;
 CLS3:
        MOV LCMP,#00H;
        LCALL WD;
        DJNZ R1,CLS3;
        INC PAGEADD;
        DJNZ R0,CLS2;

        RET;
;--------------SNAG SUB-----------------
;
INITSNAG:
         MOV PY,#02H;
         MOV PX,#20H;
         MOV R3,#0AH;
                        ;INITIALIZE HEAD AND TAIL
         MOV TAILX,PX;
         MOV TAILY,PY;
         MOV A,PX;
         ADD A,R3;
         DEC A;
         MOV HEADX,A;
         MOV HEADY,PY;

         MOV TAILXA,#80H;
         MOV TAILYA,#0C0H;
         MOV SNAGLNG,#0AH; THE SAME WITH THE R3
                         ; SO WE CAN INFER THE TAILXAYA FROM IT
         MOV A,TAILXA;
         ADD A,SNAGLNG;
         DEC A;
         MOV HEADXA,A;
         MOV A,#40H;
         ADD A,HEADXA;
         MOV HEADYA,A;

         MOV R0,TAILXA;
         MOV R1,TAILYA;

INITSNAG1:
          MOV A,R1;
          PUSH ACC;
          MOV A,R0;
          PUSH ACC;

          LCALL DISPXY;
                             ; INITIALIZE ALL THE BODY OF THE SNAG;
          POP ACC;
          MOV R0,A;
          POP ACC;
          MOV R1,A;

          ;MOV R0,TAILXA;
          MOV @R0,PX;
          ;MOV R0,TAILYA;
          MOV @R1,PY;

          INC R0;
          INC R1;
          INC PX;
          DJNZ R3,INITSNAG1;

          MOV DIR,#00010001B;

                             ;INITIALIZE THE SNAGSPOT MAP 
          MOV SPOT,#09H;     ;THE VARIABLE SPOT MEAN THE NUMBER OF THE SPOT IN MAP
          MOV SPOTED,#00H;   ;SPOTXDB AND SPOTYDB STORE THE X Y COORDINATION 
          MOV R0,#00H;
          
INITSNAG2:
          MOV DPTR,#SPOTXDB;
          MOV A,R0;
          MOVC A,@A+DPTR;
          MOV PX,A;
          
          MOV DPTR,#SPOTYDB;
          MOV A,R0;
          MOVC A,@A+DPTR;
          MOV PY,A;
          
          MOV A,R0;
          PUSH ACC;
          LCALL DISPXY;
          POP ACC;
          MOV R0,A;
          INC R0;
          MOV A,R0;
          CJNE A,SPOT,INITSNAG2;

          RET;

; THE FUNCTION TO DISPLAY A POINT AT (X,Y)
; AND ON THE LCD DISPLAY, THE HORIZON DIRECTION IS X
; AND ALSO THE VETICAL IS Y
;(PX,PY);  PX,PY BOTH FROM  0 TO 63
DISPXY:
       MOV PAGEADD,#0B8H;
       MOV YNUM,#40H;

       MOV A,PX;          TO SET THE PAGE AND Y
       ADD A,YNUM;
       MOV YNUM,A;
       MOV LCMP,YNUM;
       LCALL WI;

       MOV A,PY;
       MOV B,#08H;
       DIV AB;
       ADD A,PAGEADD;
       MOV PAGEADD,A;
       MOV LCMP,PAGEADD;
       LCALL WI;


       LCALL DELAY;
       LCALL RDD;
       MOV A,LCMP;      TO READ THE CURRENT DATA OF THE LCM RAM;

       ;SETB E;
       CLR DI;
       CLR RW;

       MOV R0,A;

       MOV A,B;
       MOV DPTR,#DISPDB;
       MOVC A,@A+DPTR;
       ORL A,R0;

       MOV LCMP,YNUM;
       LCALL WI;
       MOV LCMP,PAGEADD;
       LCALL WI;

       MOV LCMP,A;
       LCALL WD;

       RET;

UNDISPXY:
       MOV PAGEADD,#0B8H;
       MOV YNUM,#40H;

       MOV A,PX;          TO SET THE PAGE AND Y
       ADD A,YNUM;
       MOV YNUM,A;
       MOV LCMP,YNUM;
       LCALL WI;

       MOV A,PY;
       MOV B,#08H;
       DIV AB;
       ADD A,PAGEADD;
       MOV PAGEADD,A;
       MOV LCMP,PAGEADD;
       LCALL WI;

       LCALL DELAY;
       LCALL RDD;
       MOV A,LCMP;      TO READ THE CURRENT DATA OF THE LCM RAM;

       ;SETB E;
       CLR DI;
       CLR RW;

       MOV R0,A;

       MOV A,B;
       MOV DPTR,#UNDISPDB;
       MOVC A,@A+DPTR;
       ANL A,R0;

       MOV LCMP,YNUM;
       LCALL WI;
       MOV LCMP,PAGEADD;
       LCALL WI;

       MOV LCMP,A;
       LCALL WD;

       RET;

READXY:
       MOV DPTR,#BMPDB;
       MOV A,PY;
       MOV B,#08H;
       DIV AB;
       MOV R0,A;
       MOV R1,B;

       MOV A,PX;
       MOV B,#08H;
       MUL AB;     B IS THE HIGH PART OF THE MULTIPLICATION
       CLR CY;
       ADD A,R0;
       MOV R0,A;
       MOV A,B;
       ADDC A,DPH;
       MOV DPH,A;
       MOV A,R0;
       MOVC A,@A+DPTR;

       CJNE R1,#00H,READXY0;
       JNB ACC.0,READXY0;
       SETB ERR;
       LJMP READEND;
READXY0:
       CJNE R1,#01H,READXY1;
       JNB ACC.1,READXY1;
       SETB ERR;
       LJMP READEND;
READXY1:
       CJNE R1,#02H,READXY2;
       JNB ACC.2,READXY2;
       SETB ERR;
       LJMP READEND;
READXY2:
       CJNE R1,#03H,READXY3;
       JNB ACC.3,READXY3;
       SETB ERR;
       LJMP READEND;
READXY3:
       CJNE R1,#04H,READXY4;
       JNB ACC.4,READXY4;
       SETB ERR;
       LJMP READEND;
READXY4:
       CJNE R1,#05H,READXY5;
       JNB ACC.5,READXY5;
       SETB ERR;
       LJMP READEND;
READXY5:
       CJNE R1,#06H,READXY6;
       JNB ACC.6,READXY6;
       SETB ERR;
       LJMP READEND;
READXY6:
       CJNE R1,#07H,READXY7;
       JNB ACC.7,READXY7;
       SETB ERR;
       LJMP READEND;
READXY7:
       CLR ERR;
READEND:

       MOV R0,TAILXA;
       MOV R1,TAILYA;
       MOV R2,SNAGLNG;
READXY9:
       MOV A,@R0;
       CJNE A,PX,READXY8;
       MOV A,@R1;
       CJNE A,PY,READXY8;
       SETB ERR;
READXY8:  
       INC R0;
       INC R1;
       DJNZ R2,READXY9;
            
       RET;
;                                 TO DISPLAY THE DATA OF THE GAME;
ERROR:
       LCALL RIGHTSIDE;
       MOV YNUM,#45H;
       MOV PAGEADD,#0BBH;
       MOV R0,#00H;

ERROR1:LCALL KEYEEE;
       INC R0;
       MOV A,YNUM
       ADD A,#05H;
       MOV YNUM,A;
       CJNE R0,#09H,ERROR1;
ERROREND:
       LCALL LEFTSIDE;

       ;LCALL KEYEF;
       RET;

TOSPOT:                      ; THE SNAG TO ENCOUNT SPOT OR NOT
                             ; INPUT PX AND PY   OUTPUT ENSPOT BIT
                             ; USE THE REGISTER A,R0
          MOV R0,#00H;                   
  TOSPOT1:
          MOV DPTR,#SPOTXDB;
          MOV A,R0;
          MOVC A,@A+DPTR;
          CJNE A,PX,TOSPOT2;
          
          MOV DPTR,#SPOTYDB;
          MOV A,R0;
          MOVC A,@A+DPTR;
          CJNE A,PY,TOSPOT2;
          SETB ENSPOT;
          INC SPOTED;
          
   TOSPOT2:       
          INC R0;
          MOV A,R0;
          CJNE A,SPOT,TOSPOT1; ; 05 IS THE NUMBER OF THE SPOTS

          MOV A,SPOTED;
          CJNE A,SPOT,TOSPOTEND;
          SETB ALL;
  TOSPOTEND:
          
          RET;
          
ALLSPOT:

       LCALL RIGHTSIDE;
       MOV YNUM,#45H;
       MOV PAGEADD,#0BBH;
       MOV R0,#09H;

ALLSPOT1:
       LCALL KEYEEE;
       INC R0;
       MOV A,YNUM
       ADD A,#05H;
       MOV YNUM,A;
       CJNE R0,#12H,ALLSPOT1;
ALLSPOTEND:
       LCALL LEFTSIDE;
          RET
          
;---------------------------------
; THE MOST INPORTANT FUNTION
; DIR UP FOUR BIT MEAN CURRENT DIRECRTION
;     DOWN FOUR BIT MEAN NEXT DIRECTION
;    (UP TO DOWN) 0000
;                 1000  UP
;                 0100  DOWN
;                 0010  LEFT
;                 0001  RIGHT;
;     FOR INSTANT 0010 0100 MEAN CURRENT LEFT,NEXT DOWN;
;
SNAG:  MOV A,DIR;                  ;TO DISPLAY THE MOVING SNAG;
       CJNE A,#10001000B,SNAG2;
       LJMP UPUP;
;SNAG1: MOV A,DIR;
;       CJNE A,#10000100B,SNAG2;
;       LJMP UPDOWN;
SNAG2: MOV A,DIR;
       CJNE A,#10000010B,SNAG3;
       LJMP UPLEFT;
SNAG3: MOV A,DIR;
       CJNE A,#10000001B,SNAG5;
       LJMP UPRIGHT;

;SNAG4: MOV A,DIR;
;       CJNE A,#01001000B,SNAG5;
;       LJMP DOWNUP;
SNAG5: MOV A,DIR;
       CJNE A,#01000100B,SNAG6;
       LJMP DOWNDOWN;
SNAG6: MOV A,DIR;
       CJNE A,#01000010B,SNAG7;
       LJMP DOWNLEFT;
SNAG7: MOV A,DIR;
       CJNE A,#01000001B,SNAG8;
       LJMP DOWNRIGHT;

SNAG8: MOV A,DIR;
       CJNE A,#00101000B,SNAG9;
       LJMP LEFTUP;
SNAG9: MOV A,DIR;
       CJNE A,#00100100B,SNAGA;
       LJMP LEFTDOWN;
SNAGA: MOV A,DIR;
       CJNE A,#00100010B,SNAGC;
       LJMP LEFTLEFT;
;SNAGB: MOV A,DIR;
;       CJNE A,#00100001B,SNAGC;
;       LJMP LEFTRIGHT;


SNAGC: MOV A,DIR;
       CJNE A,#00011000B,SNAGD;
       LJMP RIGHTUP;
SNAGD: MOV A,DIR;
       CJNE A,#00010100B,SNAGF;
       LJMP RIGHTDOWN;
;SNAGE: MOV A,DIR;
;       CJNE A,#00010010B,SNAGF;
;       LJMP RIGHTLEFT;
SNAGF: MOV A,DIR;
       CJNE A,#00010001B,SNAGEND;
       LJMP RIGHTRIGHT;

UPUP: DEC HEADY;
      ;DEC TAILY;
      LJMP SNAGEND;
UPLEFT:DEC HEADX;
      LJMP SNAGEND;
UPRIGHT:INC HEADX
      LJMP SNAGEND;


DOWNDOWN:INC HEADY
      LJMP SNAGEND;
DOWNLEFT:DEC HEADX
      LJMP SNAGEND;
DOWNRIGHT:INC HEADX;
      LJMP SNAGEND;


LEFTLEFT:  DEC HEADX
      LJMP SNAGEND;
LEFTUP:    DEC HEADY
      LJMP SNAGEND;
LEFTDOWN:  INC HEADY
      LJMP SNAGEND;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -