您的位置:首页技术文栏LED应用
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

12864液晶显示模块测试汇编程序(单屏 PSB)并行驱动

[日期:2008-01-10 ] [来源:我们的电子设计 作者:] [字体: (投递新闻)
;                     12864 并口(8位)接口程序
;                                               ---------突出重围(2006-8-4)
;****************************************************************************
;连线图: *LCM--89S51* *LCM--89S51* *LCM----------89S51* *LCM---------89S51  *
;        *DB0---P2.0* *DB4---P2.4* *RS-------------P3.0* *PSB----------P3.5 *
;        *DB1---P2.1* *DB5---P2.5* *RW-------------P3.1*                    *
;        *DB2---P2.2* *DB6---P2.6* *E--------------P3.2                     *
;        *DB3---P2.3* *DB7---P2.7* *RESET----------P3.3                     *
;注:8051的晶振频率为12MHz                                                   *
;****************************************************************************
RS     equ   P3.0                       ;定义数据与指令线
RW     equ   P3.1                       ;定义读写线
E      equ   P3.2                       ;定义使能控制线
PSB    equ   P3.5                       ;定义串并口选择线
RESET  equ   P3.3                      ;定义复位线

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
        CALL     DELAY
        MOV     A,#01H                  ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
        CALL    LCDWC
        MOV     DPTR,#BITMAP            ;显示图形 BITMAP
        CALL    LCDDIS
        CALL    DELAY
        CALL    DELAY
        CALL    CLEAR                   ;清屏
        ;MOV     A,#55H
        ;CALL    LCDFILL                 ;全屏显示隔列相间的线条
        CALL SHUAI
        CALL    DELAY
        CALL    DELAY
        CALL    CLEAR                   ;清屏
        JMP     0000H
SHUAI:
        MOV   FIRST_ADD,#02H   ;设定字符/汉字显示起始位置为第一个显示单元
        MOV   FIRST_LIN,#02H ;设定字符/汉字显示起始位置为第一行
        MOV   DPTR, #TAB2 ;需要显示汉字机内码数据表
        MOV   HZK_WID,#04H ;每行显示汉字个数
        MOV   HZK_LIN,#02H ;显示行数
        MOV   START_ADD,#00H       ;清首个显示地址缓存单元
        LCALL HZK_DISP             ;调用汉字显示子程序
        RET
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:
        LCALL DELAY               ;延时
;首先选择基本指令集
        MOV A, #30H ;30---基本指令操作
        LCALL  LCDWC
        MOV    A,#30H                   ;使用8位控制界面
LCALL  LCDWC
        LCALL  DELAY01
        MOV A, #01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
        LCALL  LCDWC ;
        LCALL  DELAY01
        MOV A, #06H ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
        LCALL  LCDWC
        MOV    A,#0CH
        CALL   LCDWC
        LCALL  DELAY01
        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   p2.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     p2, A ;p2=DATA(I/O)
        LCALL   DELAY01
        NOP
        CLR     E
        NOP
        MOV     p2,#0FFH
        RET
LCDWC:    ;写指令子程序
        LCALL CHK_BUSY ;以确保上一指令/数据模块已经接收处理完
        NOP ;RS=0 WRITE INSTRUTION
        CLR RS                      ;RW=0
        CLR RW
        SETB E ;E=1
        MOV p2, A ;p2=DATA(I/O)
        LCALL  DELAY01
        NOP
        CLR E
        NOP
        MOV     p2,#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  "信息工程大帅哥欢"
        DB  "迎大家光临  嘿嘿"
        DB  "液晶是个好东西啊"
        DB  00H
        RET

TAB2:
      DB "笑傲江湖"
      DB "突出重围"
BITMAP:
;--  调入了一幅图像:c:\\wave6000\\12864zk\\testfile.ASM"
;--  宽度x高度=128x64  --
;  源文件 / 文字 :TESTFILE
;  宽×高(像素): 128x64
;  字模格式/大小 : 单色点阵液晶字模,横向取模,字?正序/640字节
;  数据转换日期  : 04-4-8 14:04:09
;-------------------------------------------------------------------------------       db   00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 07h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0F6h,0F8h, 00h,0E0h, 70h
db 0EFh,0F5h, 7Fh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0F5h,0FFh,0AFh,0EFh, 7Eh
db 81h, 0Dh,0BFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0ECh, 0Ch, 01h,0E0h, 76h
db 0BDh,0EDh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0CBh,0EDh,0ADh,0EFh, 76h
db 81h, 00h, 1Fh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0A7h, 7Ch, 01h,0E0h, 76h
db 0BFh,0EDh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0EDh, 5Fh,0BFh,0FFh,0F0h
db 81h,0E9h,0BFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0EDh, 58h, 00h, 00h, 1Eh
db 95h,0C5h, 7Fh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0EBh, 6Fh, 77h,0DBh,0FCh
db 81h, 2Eh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0E7h, 6Eh, 2Fh,0C8h, 32h
db 55h,0ECh,0DFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0EFh, 7Fh,0C7h,0B3h,0FEh
db 0D5h,0E3h, 5Bh,0DFh, 7Dh,0EFh,0C0h, 00h
db 00h, 07h,0FFh,0ECh, 78h, 39h, 78h, 18h
db 0F9h, 8Fh, 9Fh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h, 00h
db 00h, 07h, 57h,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh, 0Fh,0FFh,0EFh,0FFh,0C0h, 00h
db 00h, 07h, 8Fh,0FFh,0FFh,0FFh,0FFh,0FFh
db 0FFh,0FFh, 01h,0FEh,0E7h,0FFh,0C0h, 00h
db 00h, 06h, 01h, 7Fh,0FFh,0FFh, 9Fh,0FFh
db 0FFh,0FFh,0FDh,0ECh, 67h,0FFh,0C0h, 00h
db 00h, 07h, 8Fh,0FFh,0FFh,0FEh, 3Fh, 7Fh
db 0FFh,0E7h,0FDh,0C8h, 27h,0FFh,0C0h, 00h
db 00h, 07h, 47h,0FFh,0FFh,0F8h, 38h,0FBh
db 0FFh,0F9h,0FFh, 81h, 07h,0FFh,0C0h, 00h
db 00h, 06h,0DBh,0FFh,0FFh,0E0h, 60h,0E3h
db 0FBh,0FEh, 7Fh, 73h, 8Fh,0FFh,0C0h, 00h
db 00h, 07h,0DFh,0BFh, 1Fh,0C0h, 00h, 86h
db 0FCh, 7Fh, 9Fh,0F3h,0EFh,0FFh,0C0h, 00h
db 00h, 07h,0FFh,0DEh, 0Fh, 80h, 00h, 04h
db 0BEh, 0Fh,0C7h,0F7h,0FFh, 7Fh,0C0h, 00h
db 00h, 07h,0DFh, 5Ch,0C7h, 00h, 01h,0C8h
db 87h, 81h,0E1h,0FFh,0FDh,0FFh,0C0h, 00h
db 00h, 07h,0FFh, 8Dh, 27h, 00h, 00h, 20h
db 80h,0E0h, 30h,0FCh, 7Ch,0BFh,0C0h, 00h
db 00h, 07h,0FEh, 8Ch, 56h, 00h, 00h, 01h
db 80h, 00h, 08h, 78h, 3Ch, 7Fh,0C0h, 00h
db 00h, 07h,0FFh, 04h, 50h, 00h, 00h, 01h
db 81h,0C0h, 00h, 31h, 98h,0DFh,0C0h, 00h
db 00h, 07h,0FDh, 02h, 20h, 00h, 00h, 02h
db 82h, 00h, 00h, 32h, 58h,0BFh,0C0h, 00h
db 00h, 07h,0FEh, 03h, 00h, 00h, 7Eh, 02h
db 40h, 00h, 00h, 15h, 10h, 2Fh,0C0h, 00h
db 00h, 07h,0FAh, 03h, 80h, 01h,0FFh, 04h
db 40h, 00h, 00h, 05h, 10h, 1Fh,0C0h, 00h
db 00h, 07h,0FCh, 07h,0C0h, 00h, 07h, 88h
db 20h, 3Fh, 00h, 02h, 20h, 0Fh,0C0h, 00h
db 00h, 07h,0F4h, 0Fh, 40h, 00h, 0Eh, 10h
db 22h, 7Fh,0C0h, 00h, 78h, 1Fh,0C0h, 00h
db 00h, 07h,0F8h, 00h, 40h, 00h, 0Ch, 20h
db 11h,0F0h, 00h, 00h,0FCh, 17h,0C0h, 00h
db 00h, 07h,0E8h, 00h, 80h, 00h, 04h, 40h
db 08h, 30h, 00h, 00h, 82h, 0Fh,0C0h, 00h
db 00h, 07h,0F0h, 0Fh, 00h, 08h, 98h, 40h
db 04h, 38h, 00h, 00h, 80h, 0Dh,0C0h, 00h
db 00h, 07h,0F8h, 31h, 00h, 04h, 40h, 80h
db 02h, 18h, 00h, 00h, 80h, 08h,0C0h, 00h
db 00h, 07h,0E8h, 50h, 80h, 0Ah, 20h, 80h
db 01h, 10h, 00h, 00h,0C0h, 0Dh,0C0h, 00h
db 00h, 07h,0C0h, 88h, 80h, 04h, 00h, 80h
db 01h, 0Ch, 88h, 00h,0A0h, 0Fh,0C0h, 00h
db 00h, 07h,0E0h, 84h, 43h, 80h, 00h, 80h
db 00h, 81h, 10h, 1Fh, 00h, 05h,0C0h, 00h
db 00h, 07h,0F1h, 04h, 22h, 60h, 01h, 00h
db 00h, 82h, 28h, 29h, 88h, 07h,0C0h, 00h
db 00h, 07h,0A1h, 02h, 1Ch, 5Ch, 06h, 00h
db 00h, 80h, 10h, 44h, 44h, 05h,0C0h, 00h
db 00h, 07h,0E1h, 02h, 00h, 47h,0F8h, 00h
db 00h, 80h, 00h,0C2h, 02h, 03h,0C0h, 00h
db 00h, 07h,0B1h, 02h, 00h, 44h, 00h, 00h
db 00h, 40h, 03h, 42h, 00h, 06h,0C0h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h


        END

阅读:
录入:admin

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐