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

📄 12864zk.asm

📁 51单片机与128*64点阵液晶接口程序
💻 ASM
字号:
;                     12864接口程序

;****************************************************************************

;        *DB0---P1.0* *DB4---P1.4* *RS-------------P3.1* *PSB----------P3.4 *
;        *DB1---P1.1* *DB5---P1.5* *RW-------------P3.3*                    *
;        *DB2---P1.2* *DB6---P1.6* *E--------------P3.0                     *
;        *DB3---P1.3* *DB7---P1.7* *RESET----------P3.5?       (详见说明书)*
;注:8031的晶振频率为12MHz                                                   *
;****************************************************************************
RS     equ   P3.0                       ;定义数据与指令线
RW     equ   P3.3                       ;定义读写线
E      equ   P3.1                       ;定义使能控制线
PSB    equ   P3.4                       ;定义串并口选择线
RESET  equ   P3.5                       ;定义复位线
XPOS   EQU   20H                       	;定义列地址
YPOS   EQU   21H                        ;定义行地址
FIRST_COL    EQU	30H		;定义字符/汉字显示起始行
FIRST_ROW    EQU	31H		;定义字符/汉字显示起始列
HZK_WID	     EQU	32H		;定义字符/汉字显示长度
HZK_LIN	     EQU	33H		;定义字符/汉字显示行数
FIRST_ADD	EQU	34H 		;定义字符/汉字显示起始位置
START_ADD	EQU	35H       	;起始位置缓存单元
FIRST_LIN	EQU	36H		;起始行位置缓存单元
G_COLUMN	EQU	37H		;定义图形显示起始行
G_ROW		EQU	38H		;定义图形显示起始列
G_WID		EQU	39H		;定义图形显示宽度
        ORG     0000H
START:	MOV	SP,#60h
        CLR     RESET
        NOP
	SETB	RESET
	SETB	PSB                     ;PSB=1  并口
	CLR	RW
LCD:
        LCALL   LCDRESET		;调用系统初始化程序
        CALL    HZKLIB                 ;汉字显示
        CALL    DELAY
        CALL    DELAY
        MOV     A,#01H                  ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
        CALL    LCDWC
        MOV     DPTR,#BITMAP            ;显示图形 BITMAP
        CALL    LCDDIS
       ; CALL    DELAY
       ; CALL    DELAY
       ; MOV     A,#55H
       ; CALL    LCDFILL                 ;全屏显示隔列相间的线条
        CALL    DELAY
        CALL    DELAY
        CALL    CLEAR                   ;清屏
        JMP     0000H


HZKLIB:  ;显示汉字子程序
     	MOV   FIRST_ADD,#00H  		;设定字符/汉字显示起始位置为第一个显示单元
        MOV   FIRST_LIN,#01H		;设定字符/汉字显示起始位置为第一行
        MOV   DPTR, #TAB 		;需要显示汉字机内码数据表
        MOV   HZK_WID,#08H		;每行显示汉字个数
        MOV   HZK_LIN,#04H		;显示行数
        MOV   START_ADD,#00H       	;清首个显示地址缓存单元
        LCALL	HZK_DISP             	;调用汉字显示子程序
        RET


LCDDIS:  ;图形显示子程序,该子程序可简化为一个函数调用
       MOV    XPOS,#0                    ;设定图形显示起始行单元
       MOV    YPOS,#0
DIS_A1:MOV    XPOS,#0
DIS_A2:
       MOV    A,#36H                     ;选择扩充指令集关闭图形显示
        		                 ; 该指令在扩充指令集
       CALL   LCDWC
       MOV    A,YPOS
       ADD    A,#80H                     ;输入图形显示起始地址
       CALL   LCDWC
       MOV    A,XPOS
       ADD    A,#80H
       CALL   LCDWC
       MOV    B,A
       MOV    A,#30H                     ;重新选择基本指令集
       CALL   LCDWC
       CLR    A
       MOVC   A,@A+DPTR                  ;输入显示数据(横向高8位数据)
       CALL   LCDWD
       INC    DPTR
       CLR    A
       MOVC   A,@A+DPTR                  ;输入显示数据(横向低8位数据)
       CALL   LCDWD
       INC    XPOS                       ;列地址加一
       INC    DPTR
       MOV    A,B
       CJNE   A,#87H,DIS_A2              ;最后一列地址为87H
       INC    YPOS                       ;行地址加一
       MOV    A,YPOS
       CJNE   A,#20H,DIS_A1              ;最后行地址为80H+20H=0A0H
       MOV    YPOS,#0
DIS_A3:MOV    XPOS,#0                    ;下半部分的显示
DIS_A4:
       MOV    A,#36H                     ;选择扩充指令集关闭图形显示
       CALL   LCDWC
       MOV    A,YPOS
       ADD    A,#80H
       CALL   LCDWC
       MOV    A,XPOS
       ADD    A,#88H                     ;下部分 列地址首址
       CALL   LCDWC
       MOV    B,A
       MOV    A,#30H                     ;重新选择基本指令集
       CALL   LCDWC
       CLR    A
       MOVC   A,@A+DPTR                  ;输入显示数据(横向高8位数据)
       CALL   LCDWD
       INC    DPTR
       CLR    A
       MOVC   A,@A+DPTR                  ;输入显示数据(横向低8位数据)
       CALL   LCDWD
       INC    DPTR
       INC    XPOS                       ;列地址加一
       MOV    A,B
       CJNE   A,#8FH,DIS_A4              ;最后一列地址为8FH
       INC    YPOS                       ;行地址加一
       MOV    A,YPOS
       CJNE   A,#20H,DIS_A3              ;最后行地址为80H+20H=0A0H
       RET


CLEAR:    ;清除图形显示CGRAM
       MOV   A,#00
       CALL  LCDFILL
       RET

LCDFILL:
       MOV    R4,A
       MOV    XPOS,#0
       MOV    YPOS,#0
LCD_A1:MOV    YPOS,#0
LCD_A2:
       MOV    A,#36H                   ;选择扩充指令集关闭图形显示
       CALL   LCDWC
       ;CALL   LCDPOS
       MOV    A,XPOS
       ADD    A,#80H
       CALL   LCDWC
       MOV    A,YPOS
       ADD    A,#80H
       CALL   LCDWC
       MOV    B,A
       MOV    A,#30H                   ;重新选择基本指令集
       CALL   LCDWC
       MOV    A,R4
       CALL   LCDWD
       CALL   LCDWD
       INC    YPOS
       MOV    A,B
       CJNE   A,#87H,LCD_A2             ;最后一列地址?87H
       INC    XPOS
       MOV    A,XPOS
       CJNE   A,#20H,LCD_A1             ;最后行地址为80H+20H=0A0H
       MOV    XPOS,#0
LCD_A3:MOV    YPOS,#0
LCD_A4:
       MOV    A,#36H
       CALL   LCDWC
       MOV    A,XPOS
       ADD    A,#80H
       CALL   LCDWC
       MOV    A,YPOS
       ADD    A,#88H
       CALL   LCDWC
       MOV    B,A
       MOV    A,#30H                    ;重新选择基本指令集
       CALL   LCDWC
       MOV    A,R4
       CALL   LCDWD
       CALL   LCDWD
       INC    YPOS
       MOV    A,B
       CJNE   A,#8FH,LCD_A4              ;最后一列地址为8FH
       INC    XPOS
       MOV    A,XPOS
       CJNE   A,#20H,LCD_A3              ;最后行地址为80H+20H=0A0H
       RET


HZK_DISP:   ;汉字显示子程序
	  MOV R1,HZK_WID
HZK10:	  LCALL	  LCDPOS		 ;调用调整地址单元子程序
	  MOV A, START_ADD		 ;设定DDRAM地址,显示位置地址
          LCALL LCDWC
HZK11:   CLR A				 ;因为要连续输入机内码高位(区码)、低位(位码)
          MOVC A, @A+DPTR		 ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
          LCALL LCDWD			 ;DATA	LCDWC
          INC DPTR			 ;显示地址会自动加一,如果连续写就不用再输入地址,空白可用某空白汉字或字符代替
          CLR A
          MOVC A, @A+DPTR
          LCALL LCDWD
         ; LCALL DELAY03
          INC DPTR
          DJNZ	R1,HZK11
          MOV	R1,HZK_WID		;调整显示长度
          INC	FIRST_LIN          	;跳到下一行
          DJNZ	HZK_LIN,HZK10
          RET
LCDRESET:
                    	;延时
					;首先选择基本指令集
        MOV A, #30H			;30---基本指令操作
        LCALL  LCDWC
        MOV    A,#30H                   ;使用8位控制界面
	LCALL  LCDWC

        MOV A, #01H			;指令#01H为:清除屏幕文字,把地址指针指向00H单元
        LCALL  LCDWC			;

        MOV A, #06H			;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
        LCALL  LCDWC
        MOV    A,#0CH
        CALL   LCDWC

        RET
;---------------------------------------------------------
;SEARCH ADDRESS                                          -
;目的是为了转换地址单元为DDRAM地址单元,以方便           -
;定义显示位置                                            -
;汉字显示DDRAM位置为:第一行:80H----87H                 -
;                     第二行:90H----97H                 -
;		      第三行:88H----8FH                 -
;		      第四行:98H----9FH                 -
;---------------------------------------------------------
LCDPOS: PUSH	DPH			;地址转换子程序
	PUSH   	DPL
;	PUSH	A
	MOV	DPTR,#LINE_ADD		;LINE-ADD为地址表指针
	MOV	A,FIRST_LIN
	MOVC	A,@A+DPTR
	ADD	A,FIRST_ADD
	MOV	START_ADD,A
;	POP	A
	POP	DPL
	POP	DPH
	RET
LINE_ADD:
	DB  	00H,80H,90H,88H,98H.00H
READ:   MOV     P3, #0FBH       	;读数据子程序
					;P3--CONTRAL	I/O
        NOP				;P3=11111011B   RS=1	R/W=1   READ DATA
        SETB E				;E=E(I/O)
        LCALL  DELAY01
        MOV A, P1			;P1=DATA(I/O)
        NOP
        CLR E
        RET



CHK_BUSY:PUSH    ACC
         CLR     RS			;读忙状态子程序
         SETB    RW
         SETB    E
CHK_B:   NOP
         JB   P1.7,CHK_B
         CLR  E
         POP  ACC
         RET


LCDWD:   ;写数据子程序
        LCALL	CHK_BUSY		;P3--CONTRAL	I/O
        NOP				;RS=1	RW=0  WRITE DATA
        SETB	RS
        CLR	RW
        SETB    E                       ;E=1
        MOV     P1, A			;P1=DATA(I/O)
       ; LCALL   DELAY01
        NOP
        CLR     E
        NOP
        MOV     P1,#0FFH
        RET



LCDWC:    ;写指令子程序
        LCALL	CHK_BUSY		;以确保上一指令/数据模块已经接收处理完
        NOP				;RS=0	WRITE	INSTRUTION
        CLR 	RS                      ;RW=0
        CLR	RW
        SETB E				;E=1
        MOV P1, A			;P1=DATA(I/O)
        ;LCALL  DELAY01
        NOP
        CLR E
        NOP
        MOV     P1,#0FFH
        RET


DELAY:  ;               延时子程序
        MOV  R5,#03H
DE_1:	MOV  R6,#0FFH
DE_2:   MOV  R7,#0FFH
DE_3:   DJNZ R7,DE_3
        DJNZ R6,DE_2
        NOP
        NOP
        DJNZ R5, DE_1
        RET
DELAY01: MOV  R6, #6
DE_A:   MOV  R7, #0Fh
DE_B:   DJNZ R7, DE_B
        DJNZ R6, DE_A
        RET

DELAY02: MOV  R6, #6
DE_A1:   MOV  R7, #18h
DE_B1:   DJNZ R7, DE_B1
         DJNZ R6, DE_A1
         RET
DELAY03: MOV  R5,#03H
DE_6:	 MOV  R6,#0BFH
DE_4:    MOV  R7,#0BFH
DE_5:    DJNZ R7,DE_5
         DJNZ R6,DE_4
         NOP
         NOP
         DJNZ R5,DE_6
         RET

TAB:
        DB  "长春第二材料试验机厂"
        DB  "按照 ISO9001"
        DB  "质量管理体系运作"
        DB  "力值:          "
        DB  00H
        RET
BITMAP:
;--  宽度x高度=128x64  --
;  源文件 / 文字 :TESTFILE
;  宽×高(像素): 128x64
;  字模格式/大小 : 单色点阵液晶字模,横向取模,字?正序/640字节
;  数据转换日期  : 04-4-8 14:04:09
;-------------------------------------------------------------------------------
db             255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
;以下省略
db             255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
;-------------------------------------------------------------------------------------------------------
END

⌨️ 快捷键说明

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