📄 ex3-9.asm
字号:
;--------------程序信息-----------------
;文件名 : 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 + -