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

📄 subprogram.asm

📁 this file for bank in keil
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;SUBPROGRAM  FOR  LCD  DISPLAY
;ASM  FILE  FOR  LCD   DISPLAY  
 
;;;;.asm
; 直接访问方式地址定义,根据用户平台接口修改
  
CWADD1  EQU	0D000H		; 写指令代码地址
DWADD1	EQU	0D001H		; 写参数及显示数据地址
DRADD1	EQU	0D001H		; 读参数及显示数据地址
; 间接控制方式信号定义,根据用户平台接口修改
;//RS	EQU	P3.0            ; RS
;//RD	EQU	P3.1            ; /RD
;//WR	EQU	P3.2            ; /WR
;//DATBUS	EQU	P1              ; 数据总线
; 程序参数定义,根据用户选择的LCM型号修改
PARA1   EQU    0A0H             ; 显示区域宽度
; 程序变量定义,根据用户平台提供的内部资源修改
COM	EQU	50H		; 指令寄存器
DAT1	EQU	51H		; 参数及显示数据寄存器
COUNT1	EQU 	52H             ; 计数器1
COUNT2	EQU	53H             ; 计数器2
O_XL	EQU	54H		; X坐标低8位寄存器(字节)
				; X坐标低8位寄存器(点列)
O_XH	EQU	55H		; X坐标高8位寄存器(点列)
				; D7位为绘点(D7=1)和消点(D7=0)标志位
O_YL	EQU	56H		; Y坐标寄存器低8位(点行)
O_YH	EQU	57H		; Y坐标寄存器高8位(点行)
CODEE	EQU	58H		; 字符代码

GRAYB   EQU     59H         
                               ; 00H-暗;01H-淡;
                               ; 10H-深;11H-亮
GRAYH   EQU     5AH            ; 灰度数据寄存器高字节
GRAYL   EQU     5BH            ; 灰度数据寄存器低?
  EXTRN  XDATA   (CCTAB16,CCTAB24,CHTAB816,CHTAB1616)
  EXTRN  XDATA     (CCTAB48)
  PUBLIC GRAYB
   
  PUBLIC CLEAR,_ONEBYTE_PR,_CLCW_PR,_CL_DOT 
  PUBLIC _W_DOT,_CH1616_PR,_CH4840_PR,_CC24PR,_C816_PR,_C1632_PR,_CLCW_PRR,_C1616_PR
mypro segment code
rseg mypro                     ; 允许编译器重新定位








 
 
 

 
; 汉字(24x24点阵)演示程序            callby
;DISCH24:MOV     GRAYB,#4CH           ;灰度值设置: 正向显示
;        MOV     O_XL,#0CH
;        MOV     O_YL,#20H
;        MOV     O_YH,#00H
 ;       MOV     CODEE,#00H
 ;       LCALL   _CC24PR
 ;;;       MOV     GRAYB,#0C4H        ;灰度值设置: 负向显示
  ;      MOV     O_XL,#15H
   ;     MOV     O_YL,#38H
   ;     MOV     O_YH,#01H
   ;     MOV     CODEE,#01H
   ;     LCALL   _CC24PR
   ;     SJMP $
; 绘图演示程序段       callby
;DRAW:           MOV     GRAYB,#0C0H  ;有灰度的显示将把所有显示都分成相应的灰度等级
 ;               MOV     R2,#00H
 ;               MOV     R3,#00H
 ;               MOV     R4,#00H
  ;              MOV     R5,#00H
  ;      LOOP1:  MOV     O_XL,R2
  ;              MOV     O_XH,R3
   ;             MOV     O_YL,R4
   ;             MOV     O_YH,R5
   ;             LCALL   _W_DOT
   ;             MOV     A,R2
    ;            MOV     R2,A
    ;            MOV     A,R3
    ;            ADDC    A,#00H
    ;            MOV     R3,A
     ;           MOV     A,R4
     ;           ADD     A,#01H
     ;           MOV     R4,A
      ;          MOV     A,R5
     ;           ADDC    A,#00H
      ;          MOV     R5,A
      ;          CJNE    A,#01H,LOOP1    
      ;          SJMP     $
;----------------------------------callby----------------
;WIPE:           MOV     GRAYB,#00H
;                MOV     R2,#00H
;                MOV     R3,#80H
;                MOV     R4,#00H
;                MOV     R5,#00H
 ;       LOOP2:  MOV     O_XL,R2
 ;               MOV     O_XH,R3
 ;               MOV     O_YL,R4
 ;               MOV     O_YH,R5
 ;               LCALL   _W_DOT
 ;               MOV     A,R2
 ;               ADD     A,#01H
  ;              MOV     R2,A
  ;              MOV     A,R3
  ;              ADDC    A,#00H
  ;              MOV     R3,A
  ;              MOV     A,R4
  ;              ADD     A,#01H
  ;              MOV     R4,A
  ;              MOV     A,R5
  ;              ADDC    A,#00H
   ;             MOV     R5,A
  ;              CJNE    A,#01H,LOOP2
   ;             SJMP    $
;;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;  直接访问方式的驱动子程序
;   程序口地址设置CWADD1,DWADD1,DRADD1
;   占用内部资源DAT1,A,COM
;   程序输入变量: DAT1,,COM
;===============直接访问方式驱动子程序==================
; 写指令子程序      ////childprogram(7)
PR1:    PUSH    DPL
        PUSH    DPH
        MOV     DPTR,#CWADD1
	MOV	A,COM
        MOVX    @DPTR,A
        POP     DPH
        POP     DPL
        RET
; 写数据子程序    childprogram(8)
PR2:    PUSH    DPL
        PUSH    DPH
        MOV     DPTR,#DWADD1
	MOV	A,DAT1
        MOVX    @DPTR,A
        POP     DPH
        POP     DPL
        RET
; 读数据子程序    childprogram(9)
PR3:    PUSH    DPL
        PUSH    DPH
        MOV     DPTR,#DRADD1
        MOVX    A,@DPTR
	MOV	DAT1,A
        POP     DPH
        POP     DPL
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 灰度生成子程序(字节)GRAYt m       childprogram//(6)//
;  占用内部资源:GRAYB,GRAYH,GRAYL,COUNT2,A
;  内部调用子程序:PR2
;  程序调用入口: GRAY
;  程序输入变量:GRAYB
;  灰度生成子程序(字节)如下:

_GRAY:  ; MOV GRAYB,R7         ;用两个字节来描述一个字节的内容这一个字节的数据,1代表前景数据,0代表背景数据,但是
       ;MOV A,R6               ;前景数据是分等级的我们一定要注意这一点,这里似乎又是堆栈内存空间的不足造成了这样
       ;MOV GRAYB,#0CH         ;的无法预知的错误

        MOV     GRAYH,#00H     ; 灰度寄存器清零
        MOV     GRAYL,#00H
        MOV     COUNT2,#08H
GRAY1:  RLC     A              ; 取数据位
        PUSH    ACC            ; 存数据
        MOV     A,GRAYB        ; 取灰度寄存器,首先得到前景和后景的灰度的等级.
        JC      GRAY3          ; 判数据位是否为"0"  ,这一个跳转上选择显示前景还是显示后景
        MOV     C,ACC.3        ; 为"1" 取前景灰度数据
        XCH     A,GRAYL        ; 生成灰度数据,前景和背景形成反差和0,1形成反差是一样的道理
        RLC     A
        XCH     A,GRAYL        ;GRAYH<-GRAY_L 也就是说两个变量全部加入移位的过程,C位的隐含的使用 
        XCH     A,GRAYH
        RLC     A
        XCH     A,GRAYH
        MOV     C,ACC.2        ; 取前景灰度数据
        XCH     A,GRAYL
        RLC     A
        XCH     A,GRAYL
        XCH     A,GRAYH
        RLC     A
        XCH     A,GRAYH
GRAY2:  POP     ACC            ; 取数据
        DJNZ    COUNT2,GRAY1   ; 计数器计数
        MOV     DAT1,GRAYH     ; 数据写入显示RAM
        LCALL	PR2
        MOV     DAT1,GRAYL     ; 已经设好地址而后才写入数据.
        LCALL	PR2
        RET
GRAY3:  MOV     C,ACC.7        ; 为"0"取背景灰度数据
        XCH     A,GRAYL        ; 生成灰度数据
        RLC     A
        XCH     A,GRAYL
        XCH     A,GRAYH
        RLC     A
        XCH     A,GRAYH
        MOV     C,ACC.6        ; 取背景灰度数据
        XCH     A,GRAYL
        RLC     A
        XCH     A,GRAYL
        XCH     A,GRAYH
        RLC     A
        XCH     A,GRAYH
        LJMP    GRAY2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程16*16点阵字库)CCW_PR      childprogra           (5)m
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2,GRAY
;  连接字库:      CCTAB
;  程序参数: PARA1
;  程序调用入口:  CCW_PR
;  程序输入变量:  O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
;  汉字写入子程序如下:  基本的过程就是首先计算地址而后取字模的数据
_CH1616_PR:MOV     A,R7             ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
        MOV     O_XL,A
	    MOV     A,R5
        MOV     O_YL,A
      	MOV     A,R4
        MOV     O_YH,A
	    MOV     A,R3
    	MOV     CODEE,A
        MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CCTAB16   ; 设置汉字字库指针
        MOV     A,CODEE        ; 取汉字代码
        MOV     B,#20H        ; 计算字模首地址
        MUL     AB             ; 
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
        MOV	    A,O_XL	      ; 8点占2个字节
	    RL   	A	      ; X*2(change the acc to a)
	    MOV	    O_XL,A
        MOV     A,O_YL        ; XY坐标值转换成显示RAM 地址值
        MOV     B,#PARA1      ; 显示域宽度值
        MUL     AB            ;所使用的正好是多字节乘法的内容
	    ADD	    A,O_XL
	    MOV	    O_XL,A
	    MOV	    A,B
	    ADDC	A,#00H
	    MOV     O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A        ; 地址存入O_XL,O_YL和O_YH,也就是说显示的地址占用三个字节,由低到高依次排列,使用的是多字节乘法错位相加的思路
        MOV     A,B
    	ADDC	A,#00H          ;因为是128K所以必然要使用三个字节因为两个字节就是64K的地址 
        MOV     O_YH,A

CH1616_PR1:MOV	    A,O_YH
	    MOV  	C,ACC.0	      ; 取A16值.因为一共是128K所以要判断A16的值来确定上低64K还是高64K
    	CLR    	A
    	MOV  	ACC.2,C
	    MOV	    COM,A
	    ORL     COM,#08H        ; 设置显示RAM单元地址
        LCALL   PR1
        MOV     DAT1,O_XL      ;所以第三个字节仅仅就是一个标志位
        LCALL   PR2
        INC	COM
        LCALL   PR1
        MOV     DAT1,O_YL
        LCALL   PR2
        INC	COM            ; 设置显示数据读写状态
        LCALL   PR1             
         
        MOVX    A,@DPTR       /*左边的字模*/
        LCALL   _GRAY         ; 调灰度生成子程序
         
       
         
       
        INC     DPTR
        MOVX    A,@DPTR        /*右边的字模*/
       	LCALL   _GRAY          ; 调灰度生成子程序 
          
      
        MOV     A,O_XL        ; 修正地址
        ADD     A,#PARA1      ;相当于光标向下移动一行
        MOV     O_XL,A
        MOV     A,O_YL        ;双字节加法的简单的应用
        ADDC    A,#00H
        MOV     O_YL,A
	    CLR	    A
	    ADDC	A,O_YH          ;防止进入下一个显示区域 
	    MOV 	O_YH,A
        MOV     A,COUNT1
        ADD     A,#02H
        MOV     COUNT1,A 
     
        INC     DPTR
       ; MOV	A,COUNT1
        CJNE    A,#20H,CH1616_PR1; 循环
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程48*40点阵字库)CCW_PR      childprogra           (5)m
;  占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
;  内部调用子程序:PR1,PR2,GRAY
;  连接字库:      CCTAB
;  程序参数: PARA1
;  程序调用入口:  CCW_PR
;  程序输入变量:  O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
;  汉字写入子程序如下:  基本的过程就是首先计算地址而后取字模的数据
_CH4840_PR:MOV     A,R7             ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
        MOV     O_XL,A
	MOV     A,R5
        MOV     O_YL,A
	MOV     A,R4
        MOV     O_YH,A
	MOV     A,R3
	MOV     CODEE,A
        MOV     COUNT1,#00H   ; 计数器=0
        MOV     DPTR,#CCTAB48   ; 设置汉字字库指针
        MOV     A,CODEE        ; 取汉字代码
        MOV     B,#0F0H        ; 计算字模首地址
        MUL     AB             ; 
        ADD     A,DPL
        MOV     DPL,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
        MOV	A,O_XL	      ; 8点占2个字节
	RL	A	      ; X*2(change the acc to a)
	MOV	O_XL,A
        MOV     A,O_YL        ; XY坐标值转换成显示RAM 地址值
        MOV     B,#PARA1      ; 显示域宽度值
        MUL     AB            ;所使用的正好是多字节乘法的内容
	ADD	A,O_XL
	MOV	O_XL,A
	MOV	A,B
	ADDC	A,#00H
	MOV	O_YL,A
        MOV     A,O_YH
        MOV     B,#PARA1
        MUL     AB
        ADD     A,O_YL
        MOV     O_YL,A        ; 地址存入O_XL,O_YL和O_YH,也就是说显示的地址占用三个字节,由低到高依次排列,使用的是多字节乘法错位相加的思路
        MOV     A,B
	ADDC	A,#00H          ;因为是128K所以必然要使用三个字节因为两个字节就是64K的地址 
        MOV     O_YH,A

CCW_PR1:MOV	A,O_YH
	MOV	C,ACC.0	      ; 取A16值.因为一共是128K所以要判断A16的值来确定上低64K还是高64K
	CLR	A
	MOV	ACC.2,C
	MOV	COM,A
	ORL     COM,#08H        ; 设置显示RAM单元地址
        LCALL   PR1
        MOV     DAT1,O_XL      ;所以第三个字节仅仅就是一个标志位
        LCALL   PR2
        INC	COM
        LCALL   PR1
        MOV     DAT1,O_YL
        LCALL   PR2
        INC	COM            ; 设置显示数据读写状态
        LCALL   PR1             
       
        MOVX    A,@DPTR       /*左边的字模*/
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;;
        LCALL   _GRAY         ; 调灰度生成子程序
         
        INC     DPTR
        MOVX    A,@DPTR        /*中间的字模*/ 
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;; 
	LCALL   _GRAY          ; 调灰度生成子程序
         
        INC     DPTR
        MOVX    A,@DPTR        /*右边的字模*/
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;;
	LCALL   _GRAY          ; 调灰度生成子程序  
        MOVX    A,@DPTR       /*左边的字模*/
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;;
        LCALL   _GRAY         ; 调灰度生成子程序
         
        INC     DPTR
        MOVX    A,@DPTR        /*中间的字模*/ 
       ; MOV   R7,A           ;;;;;;;;;;;;
       ; MOV  R6,#48H         ;;;;;;;;;;;;;;; 
	LCALL   _GRAY          ; 调灰度生成子程序
         
        INC     DPTR

⌨️ 快捷键说明

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