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

📄 12864_chs.asm

📁 lyd-sy-5100单片机开发板的示例程序 分为C语言版本和ASM汇编版本。其他牌子的板子也可以使用其C语言版本。
💻 ASM
字号:
;********************************************************************************
;*  描述:                                                                       *
;*         12864LCD(带汉字库)演示程序                                          *
;*         控制器ST7920                                                         *
;*         LCD型号:TS12864A-3(带汉字库)或兼容型号                            *
;*         MCU:AT89S52 ,晶体频率:11.0592MHz                                    *
;*                                                                              *
;********************************************************************************                              
;****************TS12864A-3 并口****************
                                   
          RS	EQU	P2.0       
          RW	EQU	P2.1
          E 	EQU	P2.2
          PSB	EQU	P2.3
          RST	EQU	P2.5
;-----------------------------------------------
          LCD_X	 EQU	30H
          LCD_Y	 EQU	31H
          COUNT	 EQU	32H
          COUNT1 EQU	33H
          COUNT2 EQU	34H
          COUNT3 EQU	35H
;-----------------------------------------------
          LCD_DATA  EQU	36H
          LCD_DATA1 EQU	37H
          LCD_DATA2 EQU	38H
          STORE	    EQU	39H

;-----------------------------------------------
            ORG	   0000H
	    LJMP   MAIN
	    ORG    0030H
;-----------------------------------------------
MAIN:       
	    MOV	SP,#5FH
            CLR  RST             ;复位
            LCALL DELAY4
            SETB RST
	    NOP
            SETB PSB             ;通讯方式为8位数据并口

;********************初始化**********************
LGS0:	    MOV	A,#34H		;34H--扩充指令操作
	    LCALL SEND_I
	    MOV	A,#30H		;30H--基本指令操作
	    LCALL SEND_I
	    MOV	A,#0CH		;清除显示
	    LCALL SEND_I
            MOV	A,#01H		;指定在资料写入或读取时,光标的移动方向
	    LCALL SEND_I        ;DDRAM 的地址计数器(AC)加1
	    MOV	A,#06H		;开显示,关光标,不闪烁
	    LCALL SEND_I
;===============================================
TU_PLAY1:
            MOV  DPTR,#TU_TAB1	     ;显示图形
	    LCALL PHO_DISP
	    LCALL DELAY3
            
;===============================================
;显示汉字和字符
;加入80ms的延时,使你能够看清楚显示的过程
;根据汉字显示坐标写入 (隔行写入)
;===============================================
/*HAN_WR1:
            LCALL CLEAR_P
            MOV	DPTR,#TAB1A      ;显示汉字和字符
	    MOV	COUNT,#40H      ;地址计数器设为最大值 64。
	    MOV	A,#80H           ;起始地址
	    LCALL SEND_I
            LCALL QUSHU
 	    LCALL DELAY3
            LCALL FLASH*/
;=================================================
;;显示汉字和字符
;加入80ms的延时,使你能够看清楚显示的过程
;根据汉字显示坐标分段写入(顺序写入)
;=================================================
HAN_WR2:
            LCALL CLEAR_P
HAN_WR2A:
            MOV	DPTR,#TAB1A	;显示汉字和字符
	    MOV	COUNT,#10H      ;地址计数器设为16。
	    MOV	A,#80H          ;第一行起始地址
	    LCALL SEND_I
            LCALL   QUSHU
HAN_WR2B:
            MOV	DPTR,#TAB1B	;显示汉字和字符
	    MOV	COUNT,#10H      ;地址计数器设为16。
	    MOV	A,#90H          ;第二行起始地址
	    LCALL SEND_I
            LCALL QUSHU
HAN_WR2C:
            MOV	DPTR,#TAB1C	;显示汉字和字符
	    MOV	COUNT,#10H      ;地址计数器设为16。
	    MOV	A,#88H          ;第三行起始地址
	    LCALL SEND_I
            LCALL QUSHU
HAN_WR2D:
            MOV	DPTR,#TAB1D	 ;显示汉字和字符
	    MOV	COUNT,#10H       ;地址计数器设为16。
	    MOV	A,#98H           ;第四行起始地址
	    LCALL SEND_I
            LCALL QUSHU
            LCALL DELAY3
            LCALL FLASH
            LCALL CLEAR_P
            JMP  TU_PLAY2

;----------------------------------------------
TU_PLAY2:
	    MOV	DPTR,#TU_TAB2   ;显示图形
	    LCALL PHO_DISP
	    LCALL DELAY3
            ;LCALL   FLASH
;----------------------------------------------
TU_PLAY3:
	    MOV	DPTR,#TU_TAB3   ;显示图形
	    LCALL PHO_DISP
	    LCALL DELAY3
            ;LCALL   FLASH
;-----------------------------------------------
;显示点阵
;-----------------------------------------------
LATPLAY1:
            MOV	A,#01H         ;清屏
            LCALL SEND_I
	    MOV	LCD_DATA1,#0aaH	 ;显示点阵
	    MOV	LCD_DATA2,#055H
	    LCALL LAT_DISP
	    LCALL DELAY3
            LCALL CLEAR_P
	    LJMP  KU_PLAY1
;===============================================
;调字库半角字符显示
;===============================================
KU_PLAY1:
            LCALL  CLEAR_P
            MOV  COUNT,#40H
            MOV  A,#80H
            LCALL SEND_I
            MOV  R1,#10H
LATPLAY11:
            MOV  A,R1
            LCALL  SEND_D
            INC  R1
            DJNZ  COUNT,LATPLAY11
            LCALL  DELAY3
            LCALL  CLEAR_P
            LJMP  TU_PLAY1

;===============================================
;调字库汉字显示
;从 B9F3 “贵”字处开始显示
;===============================================
KU_PLAY2:
            LCALL  CLEAR_P
            MOV  COUNT,#40H
            MOV  A,#80H
            LCALL SEND_I
            MOV  R1,#0F3H
KU_PLAY21:
            MOV  A,#0B9H
            LCALL  SEND_D        ;写入第一字节数据(高位)
            MOV  A,R1
            LCALL  SEND_D        ;写入第二字节数据(低位)
            INC  R1
            DJNZ  COUNT,KU_PLAY21
            LCALL  DELAY3
            LCALL  CLEAR_P
            LJMP  TU_PLAY1
            ;JMP  $
;===============================================
;全屏显示图形子程序
;===============================================
PHO_DISP:
    	    MOV  COUNT3,#02H
	    MOV  LCD_X,#80H
PHO_DISP1:
    	    MOV  LCD_Y,#80H
	    MOV  COUNT2,#20H
PHO_DISP2:
    	    MOV  COUNT1,#10H
	    LCALL WR_ZB
PHO_DISP3:
            CLR	A
	    MOVC A,@A+DPTR
	    LCALL SEND_D
	    INC	DPTR
	    DJNZ COUNT1,PHO_DISP3
	    INC	LCD_Y
	    DJNZ COUNT2,PHO_DISP2
	    MOV	LCD_X,#88H
	    DJNZ COUNT3,PHO_DISP1

	    MOV	A,#36H
	    LCALL SEND_I
	    MOV	A,#30H
	    LCALL SEND_I
            RET
;----------------------------------------------
CLRRAM:
     	    MOV	LCD_DATA1,#00H		;GDRAM写0子程序
	    MOV	LCD_DATA2,#00H
	    LCALL LAT_DISP
	    RET
;==============================================
;显示点阵子程序
;==============================================
LAT_DISP:
    	    MOV	COUNT3,#02H
	    MOV	LCD_X,#80H
LAT_DISP1:
    	    MOV	LCD_Y,#80H
	    CLR	F0
	    MOV	COUNT2,#20H
LAT_DISP2:
    	    MOV	COUNT1,#10H
	    LCALL WR_ZB
LAT_DISP3:
    	    JB	F0,LAT_DISP32
	    MOV	LCD_DATA,LCD_DATA1
	    AJMP LAT_DISP31
LAT_DISP32:
    	    MOV	LCD_DATA,LCD_DATA2
LAT_DISP31:
    	    MOV	A,LCD_DATA
	    LCALL SEND_D
	    DJNZ COUNT1,LAT_DISP31
	    INC	LCD_Y
	    CPL	F0
	    DJNZ COUNT2,LAT_DISP2
	    MOV	LCD_X,#88H
	    DJNZ COUNT3,LAT_DISP1

	    MOV	A,#36H
	    LCALL SEND_I
	    MOV	A,#30H
	    LCALL SEND_I
	    RET
;---------------------------------------------
WR_ZB:
    	    MOV	A,#34H
	    LCALL SEND_I
	    MOV	A,LCD_Y
	    LCALL SEND_I
	    MOV	A,LCD_X
	    LCALL SEND_I
	    MOV	A,#30H
	    LCALL SEND_I
	    RET

;===============================================
FLASH:
            MOV  A,#08H       ;关闭显示
            LCALL SEND_I
            LCALL  DELAY5
            MOV  A,#0CH	      ;开显示,关光标,不闪烁
	    LCALL SEND_I
            LCALL  DELAY5
            MOV  A,#08H       ;关闭显示
            LCALL SEND_I
            LCALL  DELAY5
            MOV  A,#0CH	      ;开显示,关光标,不闪烁
	    LCALL SEND_I
            LCALL  DELAY5
            MOV  A,#08H       ;关闭显示
            LCALL SEND_I
            LCALL  DELAY5
            RET
;==================================================
;清屏
;==================================================
CLEAR_P:
            MOV	A,#01H           ;清屏
	    LCALL SEND_I
            MOV	A,#34H
	    LCALL SEND_I
	    MOV	A,#30H
	    LCALL SEND_I
            RET
;==================================================
;查表取数据送显示
;==================================================
QUSHU:
            CLR	A
	    MOVC A,@A+DPTR       ;查表取数据
	    LCALL SEND_D           ;送显示
	    INC	DPTR
            LCALL DELAY4          ;延时80ms,
            DJNZ COUNT,QUSHU
	    RET

;===============================================
;写数据子程序
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;===============================================
SEND_D:
	    LCALL CHK_BUSY    ;写数据子程序
	    SETB  RS
	    CLR  RW
            SETB  E
	    MOV	  P0,A
	    
	    NOP
	    NOP
	    CLR	  E
	    RET
;===============================================
;写指令子程序
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;===============================================
SEND_I:
	    LCALL CHK_BUSY
	    CLR	RS
	   CLR RW
            SETB E
	    MOV	P0,A
	    
	    ;NOP
	    ;NOP
	    CLR	E
	    RET
;================================================
;读数据子程序
;RS=1,RW=1,E=H,D0-D7=数据
;================================================
READ_D:
	   LCALL CHK_BUSY    ;读数据子程序
	   SETB	RS
	   SETB	RW
	   SETB	E
	   NOP
	   MOV	A,P0
	   CLR	E
	   MOV	STORE,A
	   RET
;================================================
;;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;================================================
CHK_BUSY:
    	   MOV	P0,#0FFH    ;测忙碌子程序
	   CLR	RS
	   SETB	RW
	   SETB	E
	  NOP
	  NOP
	  NOP
	  NOP; JB	P0.7,$
	  NOP
 	  NOP
	  NOP
LCALL DELAY2
	  CLR	E
	   RET
;================================================
;延时子程序
;================================================
DELAY3:
	   MOV	R5,#16H
DEL31:	   MOV	R6,#0FFH
DEL32:	   MOV	R7,#0FFH
DEL33:	   DJNZ	R7,DEL33
	   DJNZ	R6,DEL32
	   DJNZ	R5,DEL31
	   RET

DELAY2:
           MOV	R6,#0CH
DEL21:	   MOV	R7,#18H
DEL22:	   DJNZ	R7,DEL22
	   DJNZ	R6,DEL21
	   RET

DELAY1:
           MOV	R6,#06H
DEL11:	   MOV	R7,#08H
DEL12:	   DJNZ	R7,DEL12
	   DJNZ	R6,DEL11
           RET

DELAY4:
           MOV	R6,#200
DEL41:	   MOV	R7,#200
DEL42:	   DJNZ	R7,DEL42
	   DJNZ	R6,DEL41
	   RET

DELAY5:
           MOV	R5,#05H
DEL51:	   MOV	R6,#0FFH
DEL52:	   MOV	R7,#0FFH
DEL53:	   DJNZ	R7,DEL53
	   DJNZ	R6,DEL52
	   DJNZ	R5,DEL51
	   RET
;***********************************************
TAB1:
TAB1A:     DB  '    启东微芯

⌨️ 快捷键说明

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