; ---------突出重围(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